1

iOS で Firebase ダイナミック リンクを実装しているときに、[ダイナミック リンクを開く] をクリックすると、デバッグ コンソールにエラー メッセージが表示されます。

FIRAnalytics/警告 application:continueUserActivity:restorationHandler の実装: 見つかりません。ハンドラーを App Delegate に追加してください。クラス: LLAppDelegateProxy

この問題を再現するために、最小化されたプロジェクトを作成します。新しいプロジェクトには次のものが含まれます

Pod 'Localytics'
Pod 'Firebase/DynamicLinks’

そして、への唯一の追加コードAppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    FIRApp.configure()
    Localytics.autoIntegrate("apikey", launchOptions: launchOptions)

    return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLink(fromCustomSchemeURL: url)
    if let dynamicLink = dynamicLink {
        print(dynamicLink.url)
        return true
    }

    return false
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    guard let dynamicLinks = FIRDynamicLinks.dynamicLinks() else {
        return false
    }
    let handled = dynamicLinks.handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
        print(dynamiclink?.url)
    }

    return handled
}

Firebase がの代わりにapplication:continueUserActivity:restorationHandler:Localyticsを呼び出そうとしているようです。Branch.io からの GitHub イシュー投稿もあります: https://github.com/BranchMetrics/ios-branch-deep-linking/issues/485LLAppDelegateProxyAppDelegate.swift

この投稿には、Google Analytics と Localytics の間に競合があり、Branch がapplication:continueUserActivity:restorationHandler:適切な場所で関数を見つけられない原因になっていると記載されています。

メソッドのスウィズリングを変更するという 3 番目の提案に従います。

//Their solution in Objc

SwizzleInstanceSelectorWithNewSelector(
    [[UIApplication sharedApplication].delegate class], 
    @selector(application:continueUserActivity:restorationHandler:),
    [self class], 
    @selector(BRapplication:continueUserActivity:restorationHandler:)
);

//My swift version in AppDelegate.swift

let originalSelector = #selector(AppDelegate.application(_:continueUserActivity:restorationHandler:))
let swizzledSelector = #selector(AppDelegate.firApplication(_:continueUserActivity:restorationHandler:))

let originalMethod = class_getClassMethod(AppDelegate.self, originalSelector)
let swizzledMethod = class_getClassMethod(AppDelegate.self, swizzledSelector)

method_exchangeImplementations(originalMethod, swizzledMethod)

しかし、これは私にはうまくいきません。まだ警告が表示されており、リンクはまだ処理されていません。

メソッドのスウィズリングを修正するのを手伝ってもらえますか、それともより良い解決策があります:]

4

2 に答える 2