(iOS)推送常见问题

1.为什么启动的时候出现 Did Fail To Register For Remote Notifications With Error的错误
程序运行的时候出现下面的错误信息:

did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}

这个是由于你的Provisioning Profile文件,不具备APNS功能导致的。请登陆Apple Developer 网站设置好证书,更新Provisioning Profile,重新导入Xcode。

2.如何在接收到 APN 的时候获取 APN 消息内容并进行跳转或做出响应处理?

如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 
// apn 内容获取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]

如果 App状态为正在前台或者后台运行,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
// apn内容为userInfo

如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用

- (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 推送?

关闭推送有以下两种方式关闭:

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不一致。

具体请看上传后显示的错误输出内容。

原文地址:https://www.cnblogs.com/mingfung-liu/p/3668282.html