1.为何启动的时候出现 Did Fail To Register For Remote Notifications With Error的错误
程序运行的时候出现下面的错误信息:ios
did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}xcode
这个是因为你的Provisioning Profile文件,不具有APNS功能致使的。请登录Apple Developer 网站设置好证书,更新Provisioning Profile,从新导入Xcode。服务器
2.如何在接收到 APN 的时候获取 APN 消息内容并进行跳转或作出响应处理?网络
若是 App 状态为未运行,此函数将被调用,若是launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示用户点击apn 通知致使app被启动运行;若是不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其余。app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; // apn 内容获取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]
若是 App状态为正在前台或者后台运行,那么此函数将被调用,而且可经过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种状况在此函数中处理:tcp
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; // apn内容为userInfo
若是是使用 iOS 7 的 Remote Notification 特性那么处理函数须要使用ide
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; // apn内容为userInfo
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // 取得 APNs 标准信息内容 NSDictionary *aps = [userInfo valueForKey:@"aps"]; NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容 NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量 NSString *sound = [aps valueForKey:@"sound"]; //播放的声音 // 取得自定义字段内容 NSString *customizeField1 = [userInfo valueForKey:@"customizeField1"]; //自定义参数,key是本身定义的 NSLog(@"content =[%@], badge=[%d], sound=[%@], customize field =[%@]",content,badge,sound,customizeField1); // Required [APService handleRemoteNotification:userInfo]; } //iOS 7 Remote Notification - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"this is iOS7 Remote Notification"); // Required [APService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNoData); }
其次didFinishLauching中亦要加入一句注册远程通知的代码函数
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 注册推送消息监听 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)]; }
3.如何关闭 APN 推送?fetch
关闭推送有如下两种方式关闭:网站
1.在iOS系统设置的通知设置中更改对应app的推送设置(推荐);
2.在代码中调用 [[UIApplication sharedApplication] unregisterForRemoteNotifications];
对应以上关闭方式的从新打开推送方法:
1.在iOS系统设置的通知设置中修改对应app的推送设置;
2.在代码中从新调用 [APService registerForRemoteNotificationTypes:];
4.App badge number(角标)如何更改与清空?
iOS每条 APN 推送能够指定 badge number,iOS 系统没法为某个 App 的badge number作自动累加。
JPush 推送 iOS 消息时,有指定 badge 的参数。在手机上显示的数值,就是每条推送指定的 badge 参数。
Badge number 的清空方法:
APN 推送内容指定 badge number 为 0;
在代码中使用以下代码清空 badge number: [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
5.为什么推送一条 APN 后,点击通知中心的 APN 通知打开 App,但是 APN 通知在通知中心依然存在而未被删除?
若是推送 APN 时,Badge number 被指定为0 ,则可能出现 APN 消息在通知中心被点击后,尽管调用了 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 但 APN 消息在通知中心不会被删除的状况。 这种状况能够按以下代码调用以清除通知中心的 APN 通知。
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]; [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
若是仍有其余消息,则考虑清除 local notification 通知。( [[UIApplication sharedApplication] cancelAllLocalNotifications] )
6.出现Not get deviceToken yet. Maybe: your certificate not configured APNs?...错误日志时如何排除问题?
若是出现上述日志,则说明一段时间内都没法获取device token,那么:
1)确认你的app配置了apns权限,若是未配置apns权限,则应该会出现此错误提示。
2)确认你的app运行在ios真机而非模拟器上,且通知中心中对应app的通知权限没有彻底关闭(alert/sound/badge至少有一个权限是打开的)。
3)确认你的网络情况,与apple的服务器的链接是经过tcp的 5223端口链接,确认你网络的对应端口是否可用,可经过下列命令来确认这点:
telnet 1-courier.push.apple.com 5223
4)在代码中可在如下两个函数中断点以确认device token的获取状态。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken; - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
若是app运行进入didFailToRegisterForRemoteNotificationsWithError 则说明app的APNS权限问题或者app运行在模拟器;
若是app运行进入didRegisterForRemoteNotificationsWithDeviceToken 则说明运行正常,请确认你在此函数中的代码中有将token传递给jpush的调用:
[APService registerDeviceToken:deviceToken];
5)若是以上两个registerRemoteNotification的函数都未进入, 请确认你的代码中有注册申请apns的函数调用:
[APService registerForRemoteNotificationTypes:];
6)若是上述状况都已确认且未进入第4步的任意回调函数,则能够判断没法获取token的缘由在于设备与apple的网络连通性问题(注:一个设备只有在未申请过token的状况下才会须要与apple的网络交互来获取token,已经获取过某一环境token的设备在无网络的状况下也能获取到对应环境的token(环境分为 开发/生产)),这种状况下切换网络可以在大部分状况下解决此问题。
7)若是仍然有问题,请将上述步骤的结果以邮件附件的形式发送到JPush支持邮箱,咱们将协助你解决此问题。
7.上传到appStore的版本为何收不到推送?
请确认xcode选择的生产证书和上传的证书的bundleid一致;
8.iOS 平台上传证书一直为未经过状态
证书上传未经过的缘由通常有:
1)当前上传的p12证书密码输入有误;
2.)证书导出的时候展开了证书,把我的私钥导了出来,导证书的时候请不要展开证书;
3)当前上传的证书环境不对,如:在上传开发证书的地方上传了生产环境;
4)该证书已在本帐号的其它应用使用;
5)现上传的证书与当前应用已上传成功的证书的bundle id不一致。
具体请看上传后显示的错误输出内容。