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
Odpowiedzi:
W moim przypadku rozpocząłem nowy projekt na Xcode 11, który wykorzystuje
SceneDelegate
równieżAppDelegate
Wygląda na to, że UniversalLinks (i prawdopodobnie kilka innych interfejsów API) używa tego wywołania zwrotnego na
SceneDelegate
:Zamiast tego wywołania zwrotnego w
AppDelegate
:Po wdrożeniu tego na
SceneDelegate
wszystko 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
źródło
Miałem podobny problem z
SceneDelegate
uniwersalnymi 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 tegoNSUserActivity
będą dostępne odscene(_:willConnectTo:options:)
. na przykład.źródło