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


11

안녕하세요, 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 ()를 중단하여 디버그합니다.

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

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


3
나는 또한 같은 문제가
엠레 Önder

2
이 문제에 대한 업데이트가 있습니까?
jfredsilva

1
아무도이 문제에 대한 해결책을 찾았습니까?
1

@ EmreÖnder 하나의 솔루션을 찾았습니다 (답변 확인). 바라건대 그것은 당신의 같은 문제였습니다
Jan

@ jfredsilva 하나의 해결책을 찾았습니다 (답변 확인). 바라건대 그것은 당신의 같은 문제였습니다
Jan

답변:


10

내 경우에는, 내가 사용하는 엑스 코드 (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 이하를 대상으로하는 경우 두 방법을 모두 구현해야한다고 가정합니다.

도움이 되었기를 바랍니다


깨어 난 것도 아닙니다. 애플은 iOS 13에서이 문제를 확인했다. 물론 그들은 고치지 않을 것이다.
Dmitry


2
놀랍게도 SceneDelegate에서 func scene (_ scene : UIScene, continue userActivity : NSUserActivity) {}을 넣었고 이제 @Jan, 절대 제대로 작동합니다 .Jan, AppDelegate 및 SceneDelegate에서 코드 중복 상황을 피할 수있는 방법이 있습니까? 감사합니다
Jigar

@Jigar 지금은 AppDelegate의 코드가 필요하다고 생각하지 않습니다.
Jan

@ Jan 나는 SceneDelegate를 제거했는데 그 후에 잘 작동합니다.
Jigar

3

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")
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.