Открытие содержимого из схемы URL-адресов при закрытии приложения

Моя проблема

Я реализую схемы URL-адресов в своем приложении, и в целом они работают нормально, когда приложение находится на переднем плане или в фоновом режиме. Однако я заметил, что когда он полностью закрыт и другое приложение пытается получить доступ к контенту, используя мой URL-адрес (например,app:page?image=1), который обычно работает, он просто открывает приложение, но контент никогда не перехватывается.

Мой подход

Я настроил код как в моих методах AppDelegate, так и в SceneDelegate.

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:])

А также

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

Желаемое поведение

Он открывается, когда приложение находится в фоновом режиме, на переднем плане или закрыто.

Фактическое поведение

Он открывается только на переднем или заднем плане

2 ответа

Решение

Поскольку ваше приложение в настоящее время не запущено, оно будет запущено с этими параметрами запуска. т.е. эти параметры будут переданы вwillFinishLaunchingWithOptions: / didFinishLaunchingWithOptions:вместо. Добавьте свой код в один из этих методов.

Для получения дополнительной информации прочтите документацию о том, как реагировать на запуск вашего приложения, или, более конкретно, определить, почему ваше приложение было запущено.

РЕДАКТИРОВАТЬ:

Как прокомментировал @paulw11 ниже, делегат сцены работает иначе, и с ним нужно работать отдельно.

Однако в разделе " Реагировать на события жизненного цикла на основе сцены" последний пункт:

В дополнение к событиям, связанным со сценой, вы также должны реагировать на запуск вашего приложения, используя объект UIApplicationDelegate. Для получения информации о том, что делать при запуске приложения, см. " Ответ на запуск вашего приложения".

Полагаю, нам все еще нужно выполнить запуск в willdidFinishLaunchingWithOptions / didFinishLaunchingWithOptions.

Для обработки входящих URL-адресов мы просто вызываем эту функцию как в scene(_:willConnectTo:options:)и scene(_:openURLContexts:)методы делегирования:

Если приложение закрыто:

      func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }
    
    
    // Since this function isn't exclusively called to handle URLs we're not going to prematurely return if no URL is present.
    if let url = connectionOptions.urlContexts.first?.url {
        handleURL(url: url)
    }
}

Если приложение находится в фоновом или переднем плане

      func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    // Get the first URL out of the URLContexts set. If it does not exist, abort handling the passed URLs and exit this method.
    guard let url = URLContexts.first?.url else {
        return NSLog("No URL passed to open the app")
    }


    
    handleURL(url: url)
}

Вы можете вернуться к следующей статье, чтобы узнать больше о делегате сцены и схемах URL-адресов: Пользовательские схемы URL-адресов в iOS

Другие вопросы по тегам