Metoda aplikacji (… kontynuuj aktywność użytkownika…) nie została wywołana w systemie iOS 13

11

Cześć Robię aplikację dla iOS za pomocą UniversalLink.

Universal Link działa dobrze, ale metoda wywołania zwrotnego nie jest wywoływana.

Moja AppDelegate.swift jest poniżej.

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

Metoda jest wywoływana w iOS 12 Simulator.

Tak więc problem występuje tylko w iOS 13.

Tylko w iOS13 ten błąd jest drukowany w konsoli.

Nie można zakończyć BackgroundTask: nie ma zadania w tle o identyfikatorze 1 (0x1) lub mogło być już zakończone. Przerwa w UIApplicationEndBackgroundTaskError () w celu debugowania.

Może to być przyczyną problemu.

Naprawdę doceniłbym czyjąś pomoc

Matsumoto Kazuya
źródło
3
Mam również ten sam problem
Emre Önder
2
Wszelkie aktualizacje dotyczące tego problemu?
jfredsilva
1
Czy ktoś znalazł rozwiązanie tego problemu?
stycznia
@ EmreÖnder Znalazłem jedno rozwiązanie (sprawdź odpowiedź). Mam nadzieję, że to był ten sam problem
stycznia
@ jfredsilva Znalazłem jedno rozwiązanie (sprawdź odpowiedź). Mam nadzieję, że to był ten sam problem
stycznia

Odpowiedzi:

10

W moim przypadku rozpocząłem nowy projekt na Xcode 11, który wykorzystuje SceneDelegaterównieżAppDelegate

Wygląda na to, że UniversalLinks (i prawdopodobnie kilka innych interfejsów API) używa tego wywołania zwrotnego na SceneDelegate:

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

Zamiast tego wywołania zwrotnego w AppDelegate:

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

Po wdrożeniu tego na SceneDelegatewszystko znów zaczęło działać zgodnie z oczekiwaniami. Nie próbowałem tego, ale zakładam, że jeśli celujesz w iOS 12 i nowsze wersje, być może będziesz musiał zaimplementować obie metody.

Mam nadzieję że to pomoże

Jan
źródło
To też się nie budzi. Apple potwierdziło ten problem w iOS 13. Oczywiście nie zamierzają go naprawić.
Dmitry
Powiązane pytanie: stackoverflow.com/questions/58243884/...
Dmitry
2
Niesamowite, umieściłem func scene (_ scena: UIScene, kontynuuję userActivity: NSUserActivity) {} w SceneDelegate i teraz absolutnie działa dobrze @Jan, czy jest jakiś sposób na uniknięcie sytuacji duplikacji kodu przez AppDelegate i SceneDelegate? Dzięki
Jigar
@Jigar Nie thinkg nawet potrzebny kod w AppDelegate teraz
sty
@Jan Usunąłem SceneDelegate, potem działa dobrze.
Jigar
3

Miałem podobny problem z SceneDelegateuniwersalnymi linkami, w których nie mogłem dostać się do NSUserActivity, gdy aplikacja została właśnie uruchomiona (w tym przypadku odczyt NFC w tle w iOS 13).

Jak wspomniano w odpowiedzi @Jan, ciąg dalszy userActivity jest teraz w SceneDelegate.

Jeśli aplikacja jest uruchomiona lub działa w tle, tj. zamknięte, uniwersalny link zwolni scene(_:continue:)delegata.

Jeśli aplikacja nie znajduje się w tle, uniwersalny link nie zostanie uruchomiony przez scene(_:continue:)delegata. Zamiast tego NSUserActivitybędą dostępne od scene(_:willConnectTo:options:). na przykład.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Rex
źródło