前言:最近公司新增業務,需要區別推送,那肯定就是極光的別名推送了,測試的時候發現以前可以現在不行了
原因:原來是極光做了調整,好吧,都怪自己不常看站內信吧!
解決辦法:
1、由於對別名的限制,客戶端會注冊不了別名,所以,當注冊不了別名時,就是 JPUSHService setAlias 時返回碼不為0時給后台發個請求,讓后台清理一下別名綁定的設備,然后客戶端再延遲2秒再次注冊一下別名即可。
+ (void)JPUSHServiceSetAlias:(NSString*)alias { [JPUSHService setAlias:alias completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { NSLog(@"**********code:%ld content:%@ seq:%ld", iResCode, iAlias, seq); if (iResCode != 0) { // 6027 綁定別名失敗 6014 請求繁忙 [MyAPIClient postData:[API myDeleteAliasPath] params:@{} success:^(id data) { dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)); dispatch_after(delayTime, dispatch_get_main_queue(), ^{ [JPUSHService setAlias:alias completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { NSLog(@"-----------code:%ld content:%@ seq:%ld", iResCode, iAlias, seq); } seq:0]; }); } failure:^(NSError *error) { }]; } } seq:0]; }
2、當退出時解綁別名
[JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { // 回調返回的 tags 為 nil。返回對應的狀態碼:0 為成功,其他返回碼請參考錯誤碼定義。seq 為調用時傳入的會話序列號 } seq:0];
注:客戶端初始化極光推送的時候,最好上傳IDFA,因為iOS客戶端卸載重裝就會算是一個新設備。
鑒於 iOS 系統設計上限制設備唯一標識,所以極光一直使用 Device Token 作為標識,也因為極光推送本身就是需要 Device Token 這個值才可能運作的。
iOS 9 版本之后,每次卸載后重裝都會導致 Device Token 變化,所以對於極光后台來說,都只能被識別為新用戶。
極光 SDK 新版本增加了 IDFA 選項,在集成初始化 SDK 時可選把 IDFA 這個值設置進來,這樣極光后台就優先根據 IDFA 值來識別用戶,從有一定的可能性應用被卸載后重裝還能識別回老設備。
IDFA 是廣告標識符,是 iOS 專門為廣告跟蹤唯一地識別用戶而設計的。在 iOS 設備上,設備 -> 隱私 -> 廣告這個頁面,有一個設置項:限制廣告跟蹤。默認是未選中狀態的,即是關閉狀態,是不限制的。用戶可以選中,從而限制廣告跟蹤。設置項之外還有一個按鈕:還原廣告標識符…。如果用戶點擊了這個按鈕,則 IDFA 值會變化。