метод застосування (… продовжити користувальницьку функцію…), не викликаний у 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
Також у мене є
Емре Önder

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 (_ сцена: UIScene, продовжуйте користувачуактивність: NSUserActivity) {} в SceneDelegate, і це абсолютно працює нормально зараз @Jan, чи є якийсь спосіб ми можемо уникнути такої ситуації дублювання коду через AppDelegate та SceneDelegate? Спасибі
Jigar

@Jigar Я не thinkg вам навіть потрібен код в AppDelegate Зараз
Jan

@Jan Я видалив SceneDelegate, він працює нормально після цього.
Jigar

3

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

Як згадується у відповіді @Jan, продовження користувальницької активності зараз у 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")
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.