[ios] iOS 13에서 application (… continue userActivity…) 메소드가 호출되지 않음

안녕하세요, UniversalLink를 사용하여 iOS 앱을 만들고 있습니다.

유니버설 링크 는 제대로 작동하지만 콜백 메소드 는 호출되지 않습니다.

내 AppDelegate.swift가 아래에 있습니다.

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

이 메소드는 iOS 12 Simulator에서 호출됩니다.

따라서 문제는 iOS 13에서만 발생합니다.

iOS13에서만이 오류가 콘솔에 인쇄됩니다.

BackgroundTask를 종료 할 수 없음 : 식별자 1 (0x1)을 가진 백그라운드 태스크가 없거나 이미 종료되었을 수 있습니다. UIApplicationEndBackgroundTaskError ()를 중단하여 디버그합니다.

따라서 이것이 문제의 원인 일 수 있습니다.

누군가 도와 줘서 정말 고마워



답변

내 경우에는, 내가 사용하는 엑스 코드 (11)에 새로운 프로젝트를 시작 SceneDelegate뿐만 아니라를AppDelegate

UniversalLink (및 아마도 다른 API)가이 콜백을 다음과 SceneDelegate같이 사용하는 것 같습니다 :

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

이 콜백 대신 AppDelegate:

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

일단 SceneDelegate모든 것을 구현하면 예상대로 다시 작동하기 시작했습니다. 나는 그것을 시도하지는 않았지만 iOS 12 이하를 대상으로하는 경우 두 방법을 모두 구현해야한다고 가정합니다.

도움이 되었기를 바랍니다


답변

SceneDelegate앱을 방금 시작했을 때 NSUserActivity에 연결할 수없는 비슷한 문제와 범용 링크가 있습니다 (이 경우 iOS 13의 백그라운드 NFC 읽기).

@Jan의 답변에서 언급했듯이 continue userActivity는 이제에 있습니다 SceneDelegate.

앱이 실행 중이거나 백그라운드에있는 경우 폐쇄되면, 범용 링크가 scene(_:continue:)대의원 을 발사합니다 .

앱이 백그라운드에 없으면 scene(_:continue:)대표 에서 유니버설 링크가 실행되지 않습니다 . 대신에서에서 NSUserActivity사용할 수 있습니다 scene(_:willConnectTo:options:). 예.

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


답변