метод application (… continue userActivity…), не вызванный в ios 13

11

Привет я делаю приложение IOS с использованием UniversalLink.

Universal Link работает нормально, но метод обратного вызова не вызывается.

Мой AppDelegate.swift ниже.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }


    func application(_ application: UIApplication,
                     willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }

    // this method not called!!
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        print("called")
        return true
    }
}

Метод вызывается в iOS 12 Simulator.

Итак, проблема возникает только в iOS 13.

Только в iOS13 эта ошибка печатается в консоли.

Не удается завершить BackgroundTask: фоновая задача с идентификатором 1 (0x1) не существует, или она может быть уже завершена. Разрыв в UIApplicationEndBackgroundTaskError () для отладки.

Таким образом, это может быть причиной проблемы.

Буду очень признателен за помощь

Мацумото Казуя
источник
3
У меня тоже есть
Эмре
2
Любое обновление по этому вопросу?
Jfredsilva
1
Кто-нибудь нашел решение этой проблемы?
Jan
@ EmreÖnder Я нашел одно решение (проверьте ответ). Надеюсь , это был ваш же вопрос
Jan
@jfredsilva Я нашел одно решение (проверьте ответ). Надеюсь , это был ваш же вопрос
Jan

Ответы:

10

В моем случае я запустил новый проект на Xcode 11, который использует, SceneDelegateа такжеAppDelegate

Похоже, что UniversalLinks (и, возможно, несколько других API) используют этот обратный вызов для SceneDelegate:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { }

Вместо этого обратного вызова на AppDelegate:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { }

Как только я реализовал один, SceneDelegateвсе снова заработало, как и ожидалось. Я не пробовал, но я предполагаю, что если вы ориентируетесь на iOS 12 и ниже, вам может понадобиться реализовать оба метода.

Надеюсь это поможет

январь
источник
Это также не просыпается. Apple подтвердила эту проблему в iOS 13. Конечно, они не собираются ее исправлять.
Дмитрий
Связанный вопрос: stackoverflow.com/questions/58243884/…
Дмитрий
2
Круто, я поместил func scene (_ scene: UIScene, продолжение userActivity: NSUserActivity) {} в SceneDelegate, и теперь он работает абсолютно нормально @Jan, Есть ли способ избежать дублирования кода через AppDelegate и SceneDelegate? Спасибо
Джигар
@Jigar Я не thinkg вам даже нужен код в AppDelegate Сейчас
Jan
@ Ян Я удалил SceneDelegate, после этого он работает нормально.
Джигар
3

У меня была похожая проблема с SceneDelegateуниверсальными ссылками, когда я не мог добраться до NSUserActivity, когда приложение только запускалось (в данном случае фоновое чтение NFC в ios 13).

Как упомянуто в ответе @Jan, продолжение userActivity теперь в SceneDelegate.

Если приложение работает или в фоновом режиме, т.е. закрыто, универсальная ссылка уволит scene(_:continue:)делегата.

Если приложение не работает в фоновом режиме, от scene(_:continue:)делегата не будет запускаться универсальная ссылка . Вместо этого NSUserActivityбудет доступно с scene(_:willConnectTo:options:). например.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Rex
источник