안녕하세요, 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")
}
}