Как реализовать открытие приложения из другого приложения?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Реализация открытия приложения из другого приложения в 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: Настройка в приложении
- В Capabilities включите Associated Domains
- Добавьте домен:
applinks:yourdomain.com - В
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)
}
Передача данных между приложениями
- Через параметры URL:
myapp://open?id=123&type=profile - Через Pasteboard: осторожно, данные доступны всем приложениям
- Через 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. Альтернативные подходы
- UIActivityViewController: для обмена данными через системные шеринги
- App Extensions: виджеты, клавиатуры, общие библиотеки
- 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.