metodo di applicazione (... continua userActivity ...) non richiamato in iOS 13


11

Ciao, sto realizzando l'app iOS usando UniversalLink.

Universal Link funziona correttamente, ma il metodo di callback non viene chiamato.

My AppDelegate.swift è sotto.

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

Il metodo è chiamato in iOS 12 Simulator.

Quindi, il problema si è verificato solo in iOS 13.

Solo in iOS13 questo errore viene stampato in console.

Impossibile terminare BackgroundTask: non esiste alcuna attività in background con identificativo 1 (0x1) o potrebbe essere già stata terminata. Interrompere UIApplicationEndBackgroundTaskError () per eseguire il debug.

Quindi, questo potrebbe essere la causa del problema.

Gradirei davvero l'aiuto di qualcuno


3
Ho anche lo stesso problema
Emre Önder il

2
Qualche aggiornamento su questo problema?
jfredsilva,

1
Qualcuno ha trovato una soluzione a questo problema?
Jan

@ EmreÖnder Ho trovato una soluzione (controlla la risposta). Speriamo che era il tuo stesso problema
Jan

@jfredsilva Ho trovato una soluzione (controlla la risposta). Speriamo che era il tuo stesso problema
Jan

Risposte:


10

Nel mio caso, ho avviato un nuovissimo progetto su Xcode 11 che utilizza SceneDelegateancheAppDelegate

Sembra che UniversalLink (e probabilmente molte altre API) utilizzino questo callback su SceneDelegate:

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

Invece di questo callback sul AppDelegate:

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

Una volta implementato quello su SceneDelegatetutto ha iniziato a funzionare come previsto. Non l'ho provato, ma suppongo che se si sta prendendo di mira iOS 12 e versioni precedenti, potrebbe essere necessario implementare entrambi i metodi.

Spero che sia di aiuto


Inoltre non si sveglia. Apple ha confermato questo problema in iOS 13. Ovviamente, non lo risolveranno.
Dmitry,


2
Fantastico, ho messo la funzione func (_ scene: UIScene, continua userActivity: NSUserActivity) {} in SceneDelegate e ora funziona assolutamente bene @Jan, c'è un modo per evitare questa situazione di duplicazione del codice su AppDelegate e SceneDelegate? Grazie
Jigar il

@Jigar Non penso che tu abbia nemmeno bisogno del codice in AppDelegate adesso
Jan

@ Jan ho rimosso SceneDelegate, dopo tutto funziona benissimo.
Jigar,

3

Ho avuto un problema simile con SceneDelegatee collegamenti universali in cui non ero in grado di accedere a NSUserActivity quando l'app era appena stata lanciata (in questo caso la lettura NFC in background in iOS 13).

Come menzionato nella risposta di @Jan, continue userActivity è ora in SceneDelegate.

Se l'app è in esecuzione o in background, ad es. chiuso, un collegamento universale licenzierà il scene(_:continue:)delegato.

Se l'app non è in background, il scene(_:continue:)delegato non si attiverà un collegamento universale . Invece, NSUserActivitysarà disponibile da scene(_:willConnectTo:options:). per esempio.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.