(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:];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:];
如果仍有其他消息,则考虑清除 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 -courier.push.apple.com
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不一致。
具体请看上传后显示的错误输出内容。
(iOS)推送常见问题的更多相关文章
- 一步一步教你做ios推送
最近在研究ios的推送问题,遇到了一些问题,最终整理了一下.放在这里和大家分享 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服 ...
- iOS推送证书转pem文件
iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...
- IOS 推送-客户端处理推送消息
IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...
- IOS 推送-配置与代码编写
IOS 推送配置与代码编写 这里介绍IOS的推送,本文章已经在IOS6/7/8上都能运行OK,按照道理IOS9应该没问题. 大纲: 1.文章前提 2.推送介绍 3.推送文件账号设置 4.推送证书介绍 ...
- IOS 推送消息 php做推送服务端
IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPh ...
- 友盟iOS推送配置(从真机调试到推送)
下面我来讲解一下友盟iOS的推送配置,其实友盟只是一个示例,换做其余的第三方推送服务也会适用,只是第三方的后面服务变了而已. iOS推送(包括真机调试)所需要的步骤和文件如下: 备注:这里我将省略掉一 ...
- iOS 推送全解析
本文旨在对 iOS 推送(以下简称 推送)进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacod ...
- “iOS 推送通知”详解:从创建到设置到运行
这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...
- 转载:iOS 推送的服务端实现
参考网址1: iOS消息推送机制的实现 http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html 参考网址2: iOS 推送的 ...
- C#调用IOS推送
C#调用IOS推送 使用的是 PushSharp 开源库 源码代码如下 点我
随机推荐
- a simple erlang process pool analysis
a simple erlang process pool analysis 这是一个简单的erlang进程池分析,是learn you some erlang for Great Good 里面的一个 ...
- (转)探讨:ASP.NET技术的学习顺序问题
探讨:ASP.NET技术的学习顺序问题 摘要:很多人对于ASP.NET的入门和学习顺序比较迷茫,今天让我们一起来跟随作者的思路学习探讨ASP.NET的学习顺序问题,希望有所帮助. 如果你已经有较多的面 ...
- 从零开始Unity3D游戏开发【2 简单的水管工例子】
1.首先,创建一个新的Project. 2.hierarchy(层)窗体下的Create下添加一个plane(平面) 3.调整Main Camera的视角,让panel显示在Game窗体.这一步比较困 ...
- 响应式(css_media)
开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变 ...
- CentOS配置ftp服务器
1.首先更新yum 源 yum update 2. 安装vsftpd yum install vsftpd -y // 安装 移除是 yum remove vsftpd 3. 配置Vsftp ...
- Java调用ICTCLAS2015
最近老板让做分词,指定使用ICTCLAS,于是到官网下载了2015,鼓捣了一晚上也没弄出来,百度了一上午还是一头雾水,,幸运的是现在已经弄好了,趁着没忘赶紧写下来. 1.首先解压并找到:2015080 ...
- poj 1469(二分图 最大匹配)
这道题让我认识到了c++cin,cout确实会使其超时,还是我用的c printf吧 #include<cstdio> #include<iostream> #include& ...
- java正则表达式,将字符串中\后的第一个字母变成大写
java正则表达式,将字符串中\后的第一个字母变成大写 例子是比较简单,注意的是java中的“\\”意义是:我要插入一个正则表达式的反斜线,所以其后面的字符有特殊有意义.所以普通反斜线应该是" ...
- idea15破解
注册方法: 注册码可以沿用14的,只是在 注册时选择 License server ,填 http://idea.lanyus.com ,然后点击 OK 14的话,网上可以找到一个,根据你的用户名 ...
- MMDrawerController 的实践,已经实现,几行简单的代码实现侧栏
学习方法,看readme,看给的Demo 看功能怎么实现的去模仿,个人感觉模仿是最快的学习方法 废话少说,上代码 导入MMDrawerController框架我就不多少了,之后做什么才是我们才关注的事 ...