iOS 推送問(wèn)題全解答《十萬(wàn)個(gè)為啥吖》

Q 1:為啥收不到推送(1)?

如果收到推送時(shí),App 在前臺(tái)運(yùn)行,那么:

  • iOS 10 before 頂部橫幅不會(huì)彈出。沒(méi)有任何展示,你以為「沒(méi)有收到推送」。
  • iOS 10 after 如果沒(méi)有實(shí)現(xiàn)以下代碼,也是不會(huì)有任何提示的,你以為「沒(méi)有收到推送」。
//UNUserNotificationCenterDelegate
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}

Q 2:為啥收不到推送(2)?

iOS 使用推送需要 配置推送證書(shū),如果你配過(guò)了,仍然收不到推送,建議再配一遍。筆者曾經(jīng)多次遠(yuǎn)程控制手把手給其他開(kāi)發(fā)者配置證書(shū),結(jié)果全都重新配一遍就能收到推送了。

Q 3:為啥收不到推送(3)?

Xcode 8 這里打開(kāi)。


Q 4:為啥收不到推送(4)?

推送時(shí)開(kāi)發(fā)環(huán)境、發(fā)布環(huán)境一一對(duì)應(yīng)。環(huán)境不對(duì)應(yīng),收不到。

Q 5:為啥收不到推送(5)?

要在 Apple Developer Center 把你的測(cè)試設(shè)備加入到 Device 里面。

Q 6:為啥收不到推送(6)?

一臺(tái)手機(jī)能收到,另一臺(tái)不能收到。要把你的另一臺(tái)測(cè)試設(shè)備也加入到 Apple Deveice 里面。。。

Q 7:為啥收不到推送(7)?

高峰時(shí)段你再等幾秒就收到了。

Q 8:為啥還是收不到推送(8)???

Apple 服務(wù)器宕機(jī)了,并不是所有的設(shè)備都收不到推送了,而是新的設(shè)備無(wú)法成功注冊(cè)推送服務(wù)了。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
}

在該方法中,無(wú)法返回有效的 deviceToken 值了。等兩天就好了。

Q 9:為啥生產(chǎn)環(huán)境收不到推送?

打包,安裝,測(cè)試。即可。

Q 10:為啥 App 右上角的角標(biāo) badge 不清 0?

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

Q 11:為啥 App 右上角的角標(biāo) badge 不自增?

推送時(shí) badge 參數(shù)設(shè)置: +n自增、-n自減、n固定值。
自增、自減一般第三方推送服務(wù)支持才有。

Q 12:為啥 App 在后臺(tái)收到推送代碼不執(zhí)行?

Background Remote Notification

Q 13:為啥 App 在殺死后收到推送代碼不執(zhí)行?

App 殺死啥代碼都不能執(zhí)行。iOS 10 你可以試試 Notification Service Extension,詳情見(jiàn) 這篇文章 的 Service Extension 部分。

Q 14:為啥收到推送沒(méi)聲音(1)?

哥哥手機(jī)左側(cè)靜音鍵麻煩撥上來(lái)。

Q 15:為啥收到推送沒(méi)聲音(2)?

推送時(shí) sound 字段設(shè)置為:default

Q 16:為啥收到推送不播放自定義聲音(1)?

1.聲音文件拖拽并拷貝并生成索引到工程任意位置(在 Xcode 里拖拽)
2.推送時(shí) sound 字段設(shè)置為:name.mp3。需要名字后綴完全一樣。

Q 17:為啥收到推送不播放自定義聲音(2)?

拖拽文件時(shí)沒(méi)有選擇拷貝,連線測(cè)試有聲音,拔線沒(méi)聲音,聲音文件在電腦里,拔線后缺失。從工程目錄刪除該文件,再重新添加再 build。

Q 18:為啥點(diǎn)擊 App 圖標(biāo)進(jìn)入 App 收不到推送(1)?

要點(diǎn)推送橫幅、通知中心條目進(jìn)入 App 才能收到。

Q 19:為啥點(diǎn)擊 App 圖標(biāo)進(jìn)入 App 收不到推送(2)?

解決方法:再發(fā)一條透?jìng)飨ⅰV惶幚硐?,不處理推送。不論點(diǎn)哪里進(jìn)的 App,都能保證該事件被處理。

Q 20:為啥推送一條手機(jī)會(huì)收到兩條一樣的?

iOS 9 的 bug。

Q 21:為啥點(diǎn)擊橫幅不能跳轉(zhuǎn)到指定的界面?

  • 點(diǎn)擊推送啟動(dòng) App 在這里捕獲推送內(nèi)容:
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
      NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
}
  • 點(diǎn)擊推送從后臺(tái)喚醒 App 在這里捕獲推送內(nèi)容:
    • iOS 7 before
   - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
}
  • iOS 7~9
   - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
}
  • iOS 10
//UNUserNotificationCenterDelegate
   - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
       NSDictionary *userInfo = response.notification.request.content.userInfo;
}

Q 22:為啥點(diǎn)擊了推送,通知中心條目不消除(1)?

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

Q 23:為啥點(diǎn)擊了推送,通知中心條目不消除(2)?

推送時(shí) badge 參數(shù)為 0,再調(diào)用 Q 22 導(dǎo)致通知中心沒(méi)有發(fā)生變化,此時(shí)應(yīng)設(shè)為1,再設(shè)為0:

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

Q 24:為啥用戶不允許通知,以后再也不能彈出請(qǐng)求通知權(quán)限的提示窗了?

先獲取用戶推送權(quán)限設(shè)置情況:

//  iOS 8 before
  UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

//  iOS 8~9
  UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
  UIUserNotificationType type = settings.types;

//  iOS 10
  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
  }

如果沒(méi)開(kāi),跳轉(zhuǎn)到 設(shè)置 - yourApp 頁(yè)面讓用戶設(shè)置:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

Q 25:為啥 iOS 10 不能注冊(cè)推送服務(wù)?

//  iOS 8 before
UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:type];

//  iOS 8~9
UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type categories:nil];
[application registerUserNotificationSettings:setting];

//  iOS 10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (!error) {
      NSLog(@"request authorization succeeded!");
    }
}];

Q 26:為啥樓主懂的這么多?

因?yàn)樗菢O光推送的可耐程序猿葛格^^。

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

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

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