application (… continue userActivity…) méthode non appelée dans ios 13

11

Salut, je fais l'application ios en utilisant UniversalLink.

Universal Link fonctionne correctement, mais la méthode de rappel n'est pas appelée.

Mon AppDelegate.swift est ci-dessous.

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

La méthode est appelée dans iOS 12 Simulator.

Ainsi, le problème se produit uniquement dans iOS 13.

Seulement dans iOS13, cette erreur est imprimée dans la console.

Impossible de terminer BackgroundTask: aucune tâche d'arrière-plan n'existe avec l'identifiant 1 (0x1), ou elle a peut-être déjà été terminée. Interrompez UIApplicationEndBackgroundTaskError () pour déboguer.

Cela peut donc être la cause du problème.

J'apprécierais vraiment que quelqu'un l'aide

Matsumoto Kazuya
la source
3
J'ai aussi le même problème
Emre Önder
2
Une mise à jour sur ce problème?
jfredsilva
1
Quelqu'un a trouvé une solution à ce problème?
Jan
@ EmreÖnder J'ai trouvé une solution (vérifier la réponse). Espérons que c'était votre même question
Jan
@jfredsilva J'ai trouvé une solution (vérifier la réponse). J'espère que c'était votre même problème
janvier

Réponses:

10

Dans mon cas, j'ai commencé un tout nouveau projet sur Xcode 11 qui utilise SceneDelegateaussi bien queAppDelegate

Il semble que UniversalLinks (et probablement plusieurs autres API) utilisent ce rappel sur SceneDelegate:

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

Au lieu de ce rappel sur AppDelegate:

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

Une fois que j'ai implémenté celui sur SceneDelegatetout, j'ai recommencé à travailler comme prévu. Je ne l'ai pas essayé, mais je suppose que si vous ciblez iOS 12 et inférieur, vous devrez peut-être implémenter les deux méthodes.

J'espère que cela t'aides

Jan
la source
Il ne se réveille pas non plus. Apple a confirmé ce problème dans iOS 13. Bien sûr, ils ne vont pas le résoudre.
Dmitry
2
Génial, je mets func scene (_ scene: UIScene, continue userActivity: NSUserActivity) {} dans SceneDelegate et ça marche très bien maintenant @Jan, Existe-t-il un moyen d'éviter cette situation de duplication de code sur AppDelegate et SceneDelegate? Merci
Jigar
@Jigar Je ne vous thinkg besoin même le code dans le AppDelegate maintenant
Jan
@Jan j'ai supprimé SceneDelegate, ça marche bien après ça.
Jigar
3

J'ai eu un problème similaire avec SceneDelegateet des liens universels où je n'ai pas pu accéder à NSUserActivity lorsque l'application vient d'être lancée (dans ce cas, lecture NFC en arrière-plan dans iOS 13).

Comme mentionné dans la réponse de @Jan, continue userActivity est maintenant dans le SceneDelegate.

Si l'application est en cours d'exécution ou en arrière-plan, par exemple. fermé, un lien universel licenciera le scene(_:continue:)délégué.

Si l'application n'est pas en arrière-plan, un lien universel ne se déclenche pas du scene(_:continue:)délégué. Au lieu de cela, le NSUserActivitysera disponible à partir de scene(_:willConnectTo:options:). par exemple.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Rex
la source