← Назад к вопросам

Как реализовать открытие приложения из другого приложения?

1.6 Junior🔥 161 комментариев
#UIKit и верстка#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Реализация открытия приложения из другого приложения в iOS

Открытие одного приложения из другого в iOS реализуется через механизм URL Schemes (пользовательские схемы URL) или более современный Universal Links (универсальные ссылки). Ниже разберу оба подхода с примерами кода.

1. URL Schemes (Кастомные схемы URL)

Это классический способ, где приложение объявляет собственную схему URL в Info.plist. Другие приложения могут открывать его, вызывая этот URL через UIApplication.shared.open().

Шаг 1: Объявление схемы в целевом приложении

Добавьте в Info.plist (или через вкладку Info в настройках таргета):

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.yourapp.bundle</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
    </dict>
</array>

Шаг 2: Обработка входящего URL в AppDelegate

// Для iOS 12 и ниже в AppDelegate.swift
func application(_ app: UIApplication, 
                 open url: URL, 
                 options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
          let host = components.host else {
        return false
    }
    
    if host == "openScreen" {
        let queryItems = components.queryItems
        let id = queryItems?.first(where: { $0.name == "id" })?.value
        // Навигация к нужному экрану
        return true
    }
    return false
}

Шаг 3: Открытие из другого приложения

if let url = URL(string: "myapp://openScreen?id=123") {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:]) { success in
            print("Приложение открыто: \(success)")
        }
    }
}

2. Universal Links (Универсальные ссылки)

Более современный подход, который использует HTTPS-ссылки и привязан к домену вашего сайта. Преимущества: безопасность (только ваше приложение может открывать эти ссылки), непрерывность работы (если приложение не установлено, откроется сайт).

Шаг 1: Настройка на сервере

Создайте файл apple-app-site-association (без расширения) на вашем сервере в директории .well-known:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAMID.com.yourapp.bundle",
                "paths": ["/open/*", "/products/*"]
            }
        ]
    }
}

Шаг 2: Настройка в приложении

  1. В Capabilities включите Associated Domains
  2. Добавьте домен: applinks:yourdomain.com
  3. В Info.plist добавьте:
<key>com.apple.developer.associated-domains</key>
<array>
    <string>applinks:yourdomain.com</string>
</array>

Шаг 3: Обработка в AppDelegate

// Для iOS 13+ в SceneDelegate.swift
func scene(_ scene: UIScene, 
           willConnectTo session: UISceneSession, 
           options connectionOptions: UIScene.ConnectionOptions) {
    guard let urlContext = connectionOptions.urlContexts.first else { return }
    handleUniversalLink(urlContext.url)
}

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else { return }
    handleUniversalLink(url)
}

private func handleUniversalLink(_ url: URL) {
    // Парсинг URL и навигация
    let path = url.path // например: "/open/product"
    let components = URLComponents(url: url, resolvingAgainstBaseURL: true)
    // Извлечение параметров и передача контроллерам
}

3. Важные нюансы реализации

Проверка доступности приложения

// Для кастомных схем
let customScheme = "myapp://"
guard let url = URL(string: customScheme) else { return }
if UIApplication.shared.canOpenURL(url) {
    // Приложение установлено
} else {
    // Предложить установку или открыть App Store
    let appStoreURL = URL(string: "itms-apps://apple.com/app/id123456789")!
    UIApplication.shared.open(appStoreURL)
}

Передача данных между приложениями

  1. Через параметры URL: myapp://open?id=123&type=profile
  2. Через Pasteboard: осторожно, данные доступны всем приложениям
  3. Через Shared App Groups: для приложений одного разработчика

Безопасность

  • Universal Links безопаснее, так как требуют цифровой подписи
  • Для URL Schemes добавьте проверки:
func application(_ app: UIApplication, 
                 open url: URL, 
                 options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // Проверка источника вызова
    guard let sourceApp = options[.sourceApplication] as? String else {
        return false
    }
    
    // Разрешаем только из доверенных приложений
    let trustedApps = ["com.trusted.app1", "com.trusted.app2"]
    if trustedApps.contains(sourceApp) {
        // Обработка
        return true
    }
    return false
}

4. Альтернативные подходы

  1. UIActivityViewController: для обмена данными через системные шеринги
  2. App Extensions: виджеты, клавиатуры, общие библиотеки
  3. Deep Linking через push-уведомления

5. Тестирование

// Тест URL Scheme в симуляторе
xcrun simctl openurl booted "myapp://test"

// Тест Universal Links
xcrun simctl openurl booted "https://yourdomain.com/open/product/123"

Рекомендации: для новых проектов используйте Universal Links как более современный и безопасный подход. URL Schemes оставьте для внутренних нужд или обратной совместимости. Всегда проверяйте доступность приложения перед вызовом и обрабатывайте сценарий, когда приложение не установлено, предлагая переход в App Store.