全部产品
云市场

移动推送 iOS : 推送通知 失败的排查步骤

更新时间:2019-09-06 10:08:16

我们的产品分为「推送通知」和「推送消息」 ,两者的区别 参考 : iOS 推送通知 和 推送消息 的区别
如果是 「推送消息」失败 参考: 移动推送 iOS : 推送消息 失败的排查步骤

1. 检查手机端

  • App 是否授权允许接收通知 ;
  • 推送通知时 App 需处于后台/关闭的状态 ,因为在 iOS 系统中,如果 App 在前台,就不会收到弹窗和通知中心的通知;( 附 :iOS 10 + ,前台通知触发回调处理完成后,调用 completionHandler 可 实现前台通知弹窗,具体参考 iOS 10 通知适配 - 4.4.2)。

  • 检查手机端的推送配置,可以通过如下的方法来判断手机端是否能从苹果 APNs 服务端拿到 Device Token , 如果配置不对,就会报错。

  1. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
  2. {
  3. NSLog(@"didFailToRegisterForRemoteNotificationsWithError %@", error);
  4. }
  • 检查代码中是否有调用 unregisterForRemoteNotifications 接口(远程推送注销接口),设备调用该接口后无法收到苹果 APNs 推送通知。

2. 检查推送模式

  • iOS 端的推送通知,走的是苹果官方的 APNs 通道,本身区分开发环境生产环境
  • 开发时安装到手机的 App,只能以开发模式推送,使用APNs Sandbox推送证书。
  • 正式发布后,通过 App Store 安装的 App,只能以生产模式推送,用APNs Production推送证书;生产环境通知测试,参考 移动推送 iOS : Ad Hoc App 如何进行生产环境推送通知测试?
  • 如果推送模式选错,或者推送证书传错,苹果的 APNs 服务端就会认为该 Device Token 无效,无法推送通知。常见控制台排查错误:推送状态:失败失败原因: apns token 失效
  • OpenAPI的 推送高级接口中,服务端可以通过设置 iOSApnsEnv 参数设置推送模式。注意 “ iOS ” 的 i 要小写 ,否则默认推送的是 生产模式。

3. 检查 IDE 设置

  • Xcode 8 开始,会出现一个推送开关,请保证它是处于打开状态xcode

  • 若没有打开推送开关,会触发 deviceToken 注册错误回调:didFailToRegisterForRemoteNotificationsWithError:,提示下述错误:

    1. Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的授权字符串" UserInfo=0x1740741c0 {NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串

4. 推送证书合法性校验

5. 设备关机

  • 设备关机后再推送通知,苹果 APNs 只保留最后一条通知,当重新开机后只能收到最后一条通知。