Firebase 之動態(tài)鏈接 iOS 的使用及注意事項(xiàng)

firebase 是有谷歌提供一個第三方SDK,實(shí)際firebase 包含很多功能,這次主要是講其中動態(tài)鏈接的功能使用及其注意事項(xiàng).
年前最后第二版本對接Firebase 的動態(tài)鏈接功能做推廣活動,整個開發(fā)過程跟測試流程完全沒有異樣.由于開發(fā)過程無法模擬 由分享連接 -> App Store -> 下載完成 -> 應(yīng)用啟動的完整流程,導(dǎo)致了一個致命的錯誤就是iOS9.0以上系統(tǒng)無法接收到動態(tài)鏈接的回調(diào).每一次事故的發(fā)送都是職業(yè)生涯沉重的打擊.
經(jīng)過事故的發(fā)生,我開始重新查看Firebase動態(tài)鏈接完整的對接文檔,并且從新檢查所有的對接代碼.最終發(fā)現(xiàn)問題,以下給大家講述一下,問題的所在和我個人理解的Firebase動態(tài)鏈接的原理及其注意事項(xiàng).

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<NSString *, id> *)options {
  return [self application:app
                   openURL:url
         sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];

  if (dynamicLink) {
    if (dynamicLink.url) {
      // Handle the deep link. For example, show the deep-linked content,
      // apply a promotional offer to the user's account or show customized onboarding view.
      // ...
    } else {
      // Dynamic link has empty deep link. This situation will happens if
      // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
      // but pending link is not available for this device/App combination.
      // At this point you may display default onboarding view.
    }
    return YES;
  }
  return NO;
}

以上代碼是Firebase 文檔中啟動回調(diào)的原代碼.如果你是對接在AppDelegate的主文件中理論上是不會有問題.而我出現(xiàn)問題是由于我的項(xiàng)目是集成的第三方框架比較多,我采用了Category的管理方式來管理第三方的啟動及回調(diào),導(dǎo)致其中

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<NSString *, id> *)options {
  return [self application:app
                   openURL:url
         sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}

無法調(diào)用,原因就是Category文件中調(diào)用原生的代理方法是無法觸發(fā)AppDelegate對應(yīng)方法的調(diào)起的.

錯誤代碼

//iOS 9.0 以上版本 (不包含9.0)
- (BOOL)hym_firebaseApplication:(UIApplication *)app
                        openURL:(NSURL *)url
                        options:(NSDictionary<NSString *, id> *)options {
    if (@available(iOS 9.0, *)) {
       return [self application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:[UIApplicationOpenURLOptionsAnnotationKey]];
    } else {
        // Fallback on earlier versions
    }
    return YES;
}

正確代碼

//iOS 9.0 以上版本 (不包含9.0)
- (BOOL)hym_firebaseApplication:(UIApplication *)app
                        openURL:(NSURL *)url
                        options:(NSDictionary<NSString *, id> *)options {
    if (@available(iOS 9.0, *)) {
        return [self hym_firebaseApplication:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    } else {
        // Fallback on earlier versions
    }

    return YES;
}

//iOS 9.0 以下版本 (包含9.0)
- (BOOL)hym_firebaseApplication:(UIApplication *)application
continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *_Nullable))restorationHandler{
    if (@available(iOS 9.0, *)) {
        BOOL handled = [[FIRDynamicLinks dynamicLinks] handleUniversalLink:userActivity.webpageURL
                                                                completion:^(FIRDynamicLink * _Nullable dynamicLink,
                                                                             NSError * _Nullable error) {
                                                                    [self hym_handleTheDeepLink:dynamicLink];
                                                                }];
        return handled;
    } else {
        // Fallback on earlier versions
    }
    return YES;
}

// iOS 9.0 以下 (包含9.0)
- (BOOL)hym_firebaseApplication:(UIApplication *)application
                        openURL:(NSURL *)url
              sourceApplication:(NSString *)sourceApplication
                     annotation:(id)annotation{
    FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
    if (dynamicLink) {
        [self hym_handleTheDeepLink:dynamicLink];
        if (dynamicLink.url) {
            // Handle the deep link. For example, show the deep-linked content,
            // apply a promotional offer to the user's account or show customized onboarding view.
            // ...
        } else {
            // Dynamic link has empty deep link. This situation will happens if
            // Firebase Dynamic Links iOS SDK tried to retrieve pending dynamic link,
            // but pending link is not available for this device/App combination.
            // At this point you may display default onboarding view.
        }
        return YES;
    }
    return NO;
}

Firebase 中的文檔比較繞 主要注意事項(xiàng)的 //iOS 9.0 以上版本 (包含9.0) 的方法實(shí)際是調(diào)用了 //iOS 9.0以下的系統(tǒng)代理,再從系統(tǒng)代理里統(tǒng)一調(diào)用了回調(diào)響應(yīng)的方法.
主要的事故就是這樣引起的,我后面會整理出appDelegate 的Category管理方式的正確文件和以模塊形式對接的正確文件. 開始上班了,我會抽空補(bǔ)充的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容