Die in ios 13 nicht aufgerufene Methode application (… continue userActivity…) wurde nicht aufgerufen


11

Hallo, ich mache eine iOS-App mit UniversalLink.

Universal Link funktioniert einwandfrei, aber die Rückrufmethode wird nicht aufgerufen.

Meine AppDelegate.swift ist unten.

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
    }
}

Die Methode wird in iOS 12 Simulator aufgerufen.

Das Problem tritt also nur in iOS 13 auf.

Nur in iOS13 wird dieser Fehler in der Konsole gedruckt.

BackgroundTask kann nicht beendet werden: Es gibt keine Hintergrundaufgabe mit der Kennung 1 (0x1) oder sie wurde möglicherweise bereits beendet. Brechen Sie UIApplicationEndBackgroundTaskError () zum Debuggen ein.

Dies kann also die Ursache des Problems sein.

Ich würde mich sehr über Hilfe freuen


3
Ich habe auch das gleiche Problem
Emre Önder

2
Irgendwelche Updates zu diesem Problem?
jfredsilva

1
Hat jemand eine Lösung für dieses Problem gefunden?
Januar

@ EmreÖnder Ich habe eine Lösung gefunden (Antwort überprüfen). Hoffentlich war es Ihr gleiches Problem
Jan

@jfredsilva Ich habe eine Lösung gefunden (Antwort überprüfen). Hoffentlich war es Ihr gleiches Problem
Jan

Antworten:


10

In meinem Fall habe ich ein brandneues Projekt auf Xcode 11 gestartet, das SceneDelegateebenso wieAppDelegate

Es sieht so aus, als ob UniversalLinks (und wahrscheinlich mehrere andere APIs) diesen Rückruf für Folgendes verwenden SceneDelegate:

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

Anstelle dieses Rückrufs auf dem AppDelegate:

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

Nachdem ich das implementiert hatte, SceneDelegatefunktionierte alles wieder wie erwartet. Ich habe es nicht ausprobiert, aber ich gehe davon aus, dass Sie möglicherweise beide Methoden implementieren müssen, wenn Sie auf iOS 12 und niedriger abzielen.

Hoffe das hilft


Es wacht auch nicht auf. Apple hat dieses Problem in iOS 13 bestätigt. Natürlich werden sie es nicht beheben.
Dmitry


2
Genial, ich habe func scene (_ scene: UIScene, continue userActivity: NSUserActivity) {} in SceneDelegate eingefügt und es funktioniert jetzt absolut einwandfrei @Jan. Gibt es eine Möglichkeit, diese Situation der Codeduplizierung über AppDelegate und SceneDelegate zu vermeiden? Danke
Jigar

@Jigar ich nicht THINKG Benötigen Sie den Code in der AppDelegate jetzt
Jan

@ Jan Ich habe SceneDelegate entfernt, danach funktioniert es einwandfrei.
Jigar

3

Ich hatte ein ähnliches Problem mit SceneDelegateund universellen Links, bei denen ich nicht zu NSUserActivity gelangen konnte, als die App gerade gestartet wurde (in diesem Fall Hintergrund-NFC-Lesung in iOS 13).

Wie in der Antwort von @Jan erwähnt, befindet sich userActivity nun in der SceneDelegate.

Wenn die App läuft oder im Hintergrund, dh. geschlossen, wird ein universeller Link den scene(_:continue:)Delegierten feuern .

Wenn sich die App nicht im Hintergrund befindet, wird vom scene(_:continue:)Delegaten kein universeller Link gestartet. Stattdessen NSUserActivitywird das von verfügbar sein scene(_:willConnectTo:options:). z.B.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.