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ǔ)充的.