(iOS)推送常见问题

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

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

相关文章
相关标签/搜索