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


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


To też się nie budzi. Apple potwierdziło ten problem w iOS 13. Oczywiście nie zamierzają go naprawić.
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")
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.