为什么启动的时候出现didfailtoregisterforremotenotificationswith case

【Cocos2d-x教程】iOS集成push
招聘信息:
使用推送消息,可提醒用户,召回玩家。延长游戏的寿命和收益!下面我们就一起来学习,cocos2d-x iOS集成push。
收到push消息:&&
本文主要内容:
1. iOS Push基本理念
2. 创建工程
3. ios push相关配置
4. push集成
5. push 测试和使用
7. 相关资料
iOS Push基本理念
我们先来了解,iOS push实现的大概原理
从上图我们可以看到。
1. 首先是应用程序注册消息推送。
2. IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3. 应用程序将deviceToken发送给PUSH服务端程序。
4. 服务端程序向APNS服务发送消息。
5. APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的
工程基于 cocos2d-x-3.0rc2 版本, 针对ios平台.
,如果已经有cocos2d-x 引擎可以跳过下载。解压文件进入该目录 创建工程
$&cd&cocos2d-x&$&./setup.py&$&source&FILE_TO_SAVE_SYSTEM_VARIABLE&$&cocos&new&pushDemo&-p&com.your_company.pushDemo&-l&cpp&-d&/home&$&cd&/home/pushDemo&
push相关配置
登陆 选择进入iOS Provisioning Portal。创建应用程序ID&&
在 iOS Provisioning Portal中,点击App IDs进入App ID列表。&
创建 App ID,如果 ID 已经存在可以直接跳过此步骤&
为 App 开启 Push Notification 功能。如果是已经创建的 App ID 也可以通过设置开启 Push Notification 功能。
根据实际情况完善 App ID 信息并提交,注意此处需要指定具体的 Bundle ID 不要使用通配符。
push cer创建 develop 和 production 如果你之前没有创建过 Push 证书或者是要重新创建一个新的,请在证书列表下面新建。&
新建证书需要注意选择证书种类(开发证书用于开发和调试使用,生产证书用于 App Store 发布)&
点击 Continue 后选择证书对应的应用ID,然后继续会出现&About Creating a Certificate Signing Request (CSR)&。&&
根据它的说明创建打开KeychainAccess 创建 Certificate Signing Request。&&
填写&User Email Address&和&Common Name& 后选择 Saved to disk 进行保存 。
继续返回Apple developer 网站点击 Continue ,上传刚刚生成的 .certSigningRequest 文件生成 APNs Push Certificate。 下载并双击打开证书,证书打开时会启动&钥匙串访问&工具。 在&钥匙串访问&中你的证书会显示在&我的证书&中,注意选择&My Certificates& 和"login" 。&
导出 .p12 证书文件 在&钥匙串访问&中,选择刚刚加进来的证书,选择右键菜单中的&导出&...&&。 注意要选&login&和&My Certificates& 导出证书时要选中证书文件,不要展开private key。&&
将文件保存为Personal Information Exchange (.p12)格式。 保存p12文件时,可以为其设置密码,也可以让密码为空。
app Provisioning Profile 创建,选取app Id, Certificates,Devices. 分develop 和 production
新建pushHelper C++类,定义监听push回调相关的接口。
class&&pushHelper&{&&&&&public:&&&&&&&&&&&&static&pushHelper*&sharedPushHelper(void);&&&&&&&&&&&&&bool&applicationDidFinishLaunchingWithNotification(const&char*&notificationJson);&&&&&&&&&&&&&void&applicationDidRegisterForRemoteNotificationsWithDeviceToken(const&char&*deviceToken);&&&&&&&&&&&&&void&applicationdidFailToRegisterForRemoteNotificationsWithError(const&char&*error);&&&&&&&&&&&&void&applicationDidReceiveRemoteNotification(const&char*&notificationJson);&};&
在AppController.mm加入 ios remoteNotification 相关实现
1.在application: didFinishLaunchingWithOptions:注册push的种类,并处理启动时收到push
&&&&&&[application&registerForRemoteNotificationTypes:&&&&&&UIRemoteNotificationTypeAlert&&&&&&|&UIRemoteNotificationTypeBadge&&&&&&|&UIRemoteNotificationTypeSound];&&&&&&[application&setApplicationIconBadgeNumber:0];&&&&&&&&&&&NSDictionary&*&userInfo&=&[launchOptions&objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];&&&&&if(userInfo)&{&&&&&&&&&[application&setApplicationIconBadgeNumber:0];&&&&&&&&&NSLog(@"LaunchOptionsRemoteNotification:%@",[userInfo&description]);&&&&&&&&&&dispatch_after(dispatch_time(DISPATCH_TIME_NOW,&(int64_t)(5&*&NSEC_PER_SEC)),&dispatch_get_main_queue(),&^{&&&&&&&&&&&&&pushHelper::sharedPushHelper()->applicationDidFinishLaunchingWithNotification([[userInfo&description]&cStringUsingEncoding:NSUTF8StringEncoding]);&&&&&&&&&});&&&&&}&&&&&&&
2.在application: didRegisterForRemoteNotificationsWithDeviceToken:处理收到注册push成功返回的device token:
NSLog(@"push&deviceToken:%@",deviceToken);&pushHelper::sharedPushHelper()->applicationDidRegisterForRemoteNotificationsWithDeviceToken([[deviceToken&description]&cStringUsingEncoding:NSUTF8StringEncoding]);&
3.在application: didReceiveRemoteNotification: 处理app运行状态下接收到的Push消息:&
NSLog(@"Receive&Notify:&%@",&[userInfo&description]);&&&&&&[application&setApplicationIconBadgeNumber:0];&&&&&&pushHelper::sharedPushHelper()->applicationDidReceiveRemoteNotification([[userInfo&description]&cStringUsingEncoding:NSUTF8StringEncoding]);&
4.在application: didFailToRegisterForRemoteNotificationsWithError:处理注册push失败
pushHelper::sharedPushHelper()->applicationdidFailToRegisterForRemoteNotificationsWithError([[error&description]&cStringUsingEncoding:NSUTF8StringEncoding]);&
实现pushHelper.cpp
在cocos2dx 3.0的版本中 CCNotificationCenter 被废弃。我们 使用自定义事件进行推送通知派发。
bool&pushHelper::applicationDidFinishLaunchingWithNotification(const&char*&notificationJson)&{&CCLOG("applicationDidFinishLaunchingWithNotification=%s",notificationJson);&dispatcherNotificationEvent(notificationJson,&NOTIFICATION_EVENT);&return&true;&}&void&pushHelper::applicationDidRegisterForRemoteNotificationsWithDeviceToken(const&char&*deviceToken)&{&&&CCLOG("applicationDidRegisterForRemoteNotificationsWithDeviceToken=%s",deviceToken);&dispatcherNotificationEvent(deviceToken,&REGISTER_NOTIFICATION_DEVICETOKEN_EVENT);&}&void&pushHelper::applicationdidFailToRegisterForRemoteNotificationsWithError(const&char&*error)&{&&&&CCLOG("FailToRegisterForRemoteNotificationsWithError=%s",error);&dispatcherNotificationEvent(error,&REGISTER_NOTIFICATION_ERROR_EVENT);&}&void&pushHelper::applicationDidReceiveRemoteNotification(const&char*&notificationJson)&{&&&CCLOG("applicationDidReceiveRemoteNotification=%s",notificationJson);&dispatcherNotificationEvent(notificationJson,&NOTIFICATION_EVENT);&}&void&pushHelper::dispatcherNotificationEvent(const&char*&data,&const&char*&notificationEventType)&{&&&&&auto&director&=&Director::getInstance();&&&&&char*&buf&=&new&char[256];&&&&&sprintf(buf,&"%s",&data);&&&&&EventCustom&event(notificationEventType);&&&&&event.setUserData(buf);&&&&&director->getEventDispatcher()->dispatchEvent(&event);&&&&&CC_SAFE_DELETE_ARRAY(buf);&}&
push 消息的推送 需要客户端和服务器的支持。自己搭建推送服务器(对于没有服务器编程经验的人)比较麻烦。现在国内主流的第三方push方案(百度云推送、极光推送、个推),都提供push集成客户端SDK 和 push消息推送控制台 或 消息推送服务SDK,推送结果统计。根据应用ID注册,消息推送条数 决定收费。开发者可以灵活选择使用。在此,本demo使用免费百度云推送方案,使用百度云推送的推送控制台测试。
集成百度云推送
1.上注册工程&
2.参照文档完成客户端SDK的集成,加入baidu 云推送 依赖的framework
3.完善工程配置,develop / production选择,上传APNS证书&
4.使用百度云推送控制台推送push
在想使用推送通知消息的地方加入监听推送通知事件的代码:
在HelloWorldScene.cpp中监听remoteNotification
&&void&HelloWorld::onEnter()&&{&&&&&&addNotificationListener();&&}&&void&HelloWorld::onExit()&&{&&&&&&removeNotificationListener();&&}&&void&HelloWorld::addNotificationListener()&&{&&&&&&notification_listener&=&&EventListenerCustom::create(NOTIFICATION_EVENT,&[=](EventCustom*&event){&&&&&&&&&&char*&buf&=&static_cast<char*>(event->getUserData());&&&&&&&&&&CCLOG("Notification=%s",buf);&&&&&&});&&&&&&_eventDispatcher->addEventListenerWithFixedPriority(notification_listener,&1);&&&&&&register_notification_deviceToken_listener&=&&EventListenerCustom::create(REGISTER_NOTIFICATION_DEVICETOKEN_EVENT,&[=](EventCustom*&event){&&&&&&&&&&char*&buf&=&static_cast<char*>(event->getUserData());&&&&&&&&&&CCLOG("register&notification&deviceToken=%s",buf);&&&&&&});&&&&&&_eventDispatcher->addEventListenerWithFixedPriority(register_notification_deviceToken_listener,&1);&&&&&&register_notification_error_listener&=&&EventListenerCustom::create(REGISTER_NOTIFICATION_ERROR_EVENT,&[=](EventCustom*&event){&&&&&&&&&&char*&buf&=&static_cast<char*>(event->getUserData());&&&&&&&&&&CCLOG("register&notification&error=%s",buf);&&&&&&});&&&&&&_eventDispatcher->addEventListenerWithFixedPriority(register_notification_error_listener,&1);&&}&&void&HelloWorld::removeNotificationListener()&&{&&&&&&_eventDispatcher->removeEventListener(notification_listener);&&&&&&_eventDispatcher->removeEventListener(register_notification_deviceToken_listener);&&&&&&_eventDispatcher->removeEventListener(register_notification_error_listener);&&}&
push运行结果
1.获取device Token成功 绑定百度云推送成功&
2.收到push消息&
3.系统通知栏显示&
本demo 基于3.0 rc2版本实现,但是使用其他版本集成push功能与之类似,没有太大变化。 开发者可以灵活选择。 push 消息的处理 和 使用第三方推送SDK集成也可以灵活选择。
1.push 不能获取device Token "未找到aps environment 的权利字串"。
没有配置push 证书,App id 没有配置push。
2.push 不能再 模拟器 和 已经越狱的机子上工作
3.收不到push 的可能原因:
1)根据devlop or production 模式选取 对应的APNS push证书配置和profile.
2)push 受网络因素影响,请检查网络连接是否畅通。
3)push存在一定的延时。
CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocostudio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!
请搜索微信号&CocoaChina&关注我们!
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
点击量15926点击量10778点击量5957点击量5368点击量5062点击量5014点击量4965点击量4785点击量4699
&2015 Chukong Technologies,Inc.
京公网安备89当前位置: >
为什么没调用 didRegisterForRemoteNotificationsWithDeviceToke
时间: 22:21
作者:什么蚂蚁
一步一步按照网上 push notification 教程走下来,发现didRegisterForRemoteNotificationsWithDeviceToken 和 didFailToRegisterForRemoteNotificationsWithError 就是不被调用,没法获得device token。最后看了《iPhone的Push(推送通知)功能原理浅析》发现是iPhone网络没连上,自然接口不会被调用(碰巧这两天换了个路由器,这酸爽。。。)。
下一篇:没有了IOS开发之实现App消息推送
一切从0开始,包括XCode6, IOS8,
以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适)
首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。
Provider是给你手机应用发出推送消息的服务器,而APNS(Apple
Push Notification
Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。
接下来再看一张解释图:
根据上图的逻辑我来给大家解释一下:
1.你的IOS应用需要去注册APNS消息推送功能。
2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)
3.将应用收到的device Token传给你本地的Push服务器。
4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服
5.APNS再将消息推送给目的iphone
1.从证书颁发机构颁发证书
打开你mac的钥匙串访问:&然后点击钥匙串访问
随后它会弹出一个窗口 用户电子邮件信息
就填写你苹果开发者账号的名称即可(应该是一个邮件名称),点击保存到磁盘的选项,点击继续,显示如下
点击存储,文件名为:CertificateSigningRequest.certSigningRequest
随后将他放在一个文件夹中我们取名push吧!
访问苹果开发者网址:/
选中MemberCenter选项,进入登陆页面,用你的苹果开发者账号登陆,过一会网页就会自动跳转到下图。
点击红色所选部分
内容进行下一步的操作。
选择Certificates选项,设置证书,如图所示先解释一下
Development选项的作用顾名思义就是用来作为开发使用的证书,Production选项则
是用来发布产品使用的,名称很陌生是不是,之前的开发者网页是没有这一选项的,可能是苹果把他修改了,用这个名称更加能让人
理解吧(字面上解释就是产品么)。两个选项生成证书的步骤是一样的,现在我们使用开发者的选项进行证书的制作,步骤如下:
选择Development选项
点击上面的加号选项,
选择APNS选项(开发么当然是在沙盒环境下了,模拟真实情况),然后Continue
这个AppID我们在下一部分讲如何生成,现在我用的是已经生成好的一个应用ID,继续Continue
这边就要选择在钥匙串访问环节下载下来的CertificateSigningRequest.certSigningRequest文件了,选择并生成
点击下载,得到aps_development
.cer,保存到push文件中去。
新建一个AppID,选择网页上的AppIDs,然后点击右上角的
App的取名只要按照苹果要求的就可以了
然后BundleID是比较重要的,在提交审核以及测试(苹果的TestFlight)和付费环节都需要用到,也只需按照苹果要求来写就好了。
接下来就是对你的应用需要使用苹果的哪些服务进行选择就行了,例如广告,游戏中心,推送,付费等等情况。
最后选择“Submit”选项,在下一个界面中选择“done”选项,这样我们设置AppID的步骤我们就完成了。
第五部分:生成Provisioning Profiles
这个配置概要文件分为两种,一种是为开发使用的,还有一种则是为发布到appStore上面。
创建发布版的ProvisioningProfile与开发版的流程相同,点击Development然后点击右上角的加号
会进入选择何种配置概要文件的界面
我们现在时测试,所以选择“IOS App
Development”的选项,在下面的Distribution发布选项中有两个选择,“App Store”以及“Ad
hoc”,你可以根据下面的描述
选择你发布所需的选项。点击Continue进入下一步。
选择你上一步创建的AppID,点击Continue
进行下一步
选择你的开发者账号,Continue进行下一步
在这一步上选择你的设备(你只有在这一步上勾选了你的设备,你才能在设备上用这个签名进行调试)。关于如何将你的设备号添加进去也是非常
简单的,选择左侧的"Devices",然后点击右上角的加号,在随后出来的页面上添加你设备的UUID(在XCode中可以查看到)以及name(
可以随便取,自己看的懂就行)
然后Register一下,照着流程走到最后一步就完成了。
好咋们继续回到上面的Provisioning
Profile配置环节,当你选好了你的设备后点击“Continue”进入下一页,
输入一个文件名(最好是起的能看懂是干嘛的,当然也可以随便起),点击“Generate”进入下一个页面,在这个页面中就会有一个下载按钮让你下载这个文件,
我们把它下载下来放在Push文件夹中。
好了,前期的准备工作都已经做完了,现在让我们开始推送吧!(吼吼)
首先双击我们生成的 “aps_development .cer”
文件,进入钥匙串访问,找到我们的专用秘钥(根据在第二部分中从证书机构颁发证书操作中填写的常用名)
我在第二部分填写的是“silicon”,由于换了一台mac之前安装的没有了,之前没有截图,所以随便找了个图给大家看一下,凭大家的聪明才智应该不难理解吧。
然后右击导出,会弹出如下所示的图。
将他存储到push文件夹中,命名为“push.p12”,在这一步中导出会让你输入密码并验证,你可以自定义一个密码,例如abc123。
现在push文件夹中应该有几个文件“aps_development
,"push.p12",“CertificateSigningRequest.certSigningRequest”以及刚才下下来的配置概要文件。
接下来我们打开终端将他们生成.pem文件
1.把aps_development
.cer文件生成.pcm文件,cd到push文件夹下
2.把push.p12文件生成为.pem文件
上边输入的密码则是你导出证书所设的密码,即abc123.接着还会让你输入.pem文件的密码,还是使用abc123好了,防止混淆。
这样我们在push文件夹中就又得到了两个文件,PushChatCert.pem和PushChatKey.pem。
3.把PushChatCert.pem和PushChatKey.pem合并为一个pem文件,
在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了
接下来就要测试一下啦,是不是很激动~
为了测试证书工作的状况,我们可以使用“telnet
gateway.sandbox. 2195”来检测一下,如果显示
则表示成功了。
然后,我们使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器
在终端输入如下命令:openssl s_client -connect
gateway.sandbox.:2195 -cert PushChatCert.pem -key
PushChatKey.pem
需要输入密码(abc123
我们刚才所设置的)。
然后他会返回一系列的数据,这里我就粘贴一部分啦:
CONNECTED()
depth=1 /C=US/O=Entrust,
Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c)
2009 Entrust, Inc./CN=Entrust Certification Authority -
verify error:num=20:unable to get local issuer
certificate
verify return:0
Certificate chain
。。。。。(省略)
。。。。。(省略)
。。。。。(省略)
&&Start Time:
& & Timeout
& : 300 (sec)
& & Verify
return code: 0 (ok)
测试就到这里啦。。。
1.建立推送项目
在appdelegate.m中加入以上代码,
由于ios8的推送跟ios7及以下的不一样,所以需要加判断来注册消息推送。
会接收来自苹果服务器给你返回的deviceToken,然后你需要将它添加到你本地的推送服务器上。(很重要,决定你的设备能不能接收到推送消息)。
这个函数则是当设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息。
当注册失败时,触发此函数。
2.PHP服务端
将simplepush.php这个推送脚本也放在push文件夹中
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。转:http://blog.csdn.net/ios_che/article/details/7428413
推送通知的步骤:1、询问是否允许推送通知。2、如果用户允许在APPDELEGATE 中实现
- (void)application:(UIApplication&*)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData&*)deviceToken{
3、将token发送到服务器上
4、服务器收到toke后 发送推送通知,客户端相应该推送同通知
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 smart swith 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信