IOS8下的远程推送(转载)

原文地址:http://blog.sina.com.cn/s/blog_71715bf80101615c.html

昨天做了一下远程推送,今天写下来,分享给需要的人。参考了很多篇文章,或许是iOS8的改动,没有一篇可以完整的看下来,所以打算自己写一篇。

  后台我也写了,用的是SAE,PHP代码,很简单,调用SAE封装好的一个类就可以向APNS发推送信息。

  首先,来说一下苹果的推送机制。顾名思义,推送,是指服务器向客户端发送消息,那么在iOS中,应用是被后台挂起的,并不能一直连接网络,那么服务器怎么才能把消息发送到客户端呢?这就用到推送,苹果的推送机制,是只能由APNS发送推送通知,所以你自己的后台服务器想给客户端推送通知,得把要推送的内容发送给APNS。

  说到这里,如果还不了解苹果的推送机制,可以自行查看资料。总之整体的流程就是:APP启动的时候,获取本设备的device_token,然后把这个device_token告诉你自己的服务器,服务器拿到这个device_token后,使用证书文件,向苹果的APNS服务器发起一个SSL连接,连接成功后发送一个JSON串,JSON里面包含device_token、通知内容以及其他的一些东西。苹果的APNS得到JSON后,通过device_token查找设备推送消息。

  那么,我们iOS前端的工作量是非常简单的,只需要获取device_token和接到通知后做什么事就可以。那么,怎么样获取设备的device_token,iOS8用到了新的方法。在APP启动的时候就调用,比如在application: didFinishLaunchingWithOptions:这个方法里,调用APP的注册远程推送申请方法。

  

1 //ios8
2
3     UIUserNotificationSettings * s =[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
4
5     [[UIApplication sharedApplication] registerUserNotificationSettings:s];
6
7     [application registerForRemoteNotifications];

  若注册成功,则会回调一个方法,代码如下

 1 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
 2 {
 3     NSString *decToken = [NSString stringWithFormat:@"%@", deviceToken];
 4     //获取到之后要去掉尖括号和中间的空格
 5     NSMutableString *st = [NSMutableString stringWithString:decToken];
 6     [st deleteCharactersInRange:NSMakeRange(0, 1)];
 7     [st deleteCharactersInRange:NSMakeRange(st.length-1, 1)];
 8     NSString *string1 = [st stringByReplacingOccurrencesOfString:@" " withString:@""];
 9     //保存到本地
10     NSUserDefaults *u = [NSUserDefaults standardUserDefaults];
11     [u setObject:string1 forKey:@"deviceToken"];
12 }

  相对应的,肯定也有一个注册失败的回调。里面写错误处理的代码就可以,这里就不举例了。

  那有没有想过,正常的推送通知会在我们的通知面板里,那如果我正在使用这个APP,那么推送肯定不会到通知面板里的,我们怎么找到它呢。在下面这个回调方法里,当我们正在使用APP,收到了一条通知,那么APP会直接回调这个方法,不会去弹出通知。

1 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
2 {
3     NSLog(@"Receive remote notification : %@",userInfo);
4     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"好" otherButtonTitles:nil, nil];
5     [alert show];
6
7 }

  在这个方法里面,处理我们接收到的消息即可。

  前端的任务就这么多,别忘了把device_token交给你的服务端。

  服务端的代码本来不用我们写,但是遇到不会写的,让他们去看苹果的官方文档就行。要是还看不懂,就找一个现成的代码研究一下。

  程序猿攻城狮都是万能的,不仅会修电脑,还要会写后台。那么,我们就来看看后台是怎么实现的。

  首先,按照上面流程来说,服务端获取到device_token后,使用证书向APNS发送推送请求,那么问题来了。挖掘机技术哪家强?

  推送证书哪里来?

  需要一个开发者账号。没错,和我们真机调试的证书一样,至少需要99刀。有了账号,我们就可以申请一个证书。下面,跟着一步一步看,比较麻烦。

  

  1.需要在MacOS上生成一个CertificateSigningRequest.certSigningRequest文件。打开应用程序中的“钥匙串访问”,从菜单中选择“证书助理”-》“从证书颁发机构请求证书”

然后保存在本地就行。这样我们就获取了一个证书请求文件。

  2.这里就要用到开发者账号了。进入developer.apple.com,选择numberCenter-》Certificates, Identifiers & Profiles-》Identifiers-》APP IDs。点右上角的+号,注册一个APPID,写id名,默认是Explicit App ID写个bundle名。还要勾选住App Services下的Push Notifications。这样就注册好了。

  3.生成推送证书。点Certificates,右上角+,创建一个证书,以Development为例,选Apple Push Notification service SSL (Sandbox),然后直接下一步,会让你选一个APPID,选择你刚刚创建好的那个APPID,下一步,提交我们第一步生成的请求文件,然后求送证书就完成了。download下来即可。

  4.下载到的是一个cer文件,我们后台肯定不能直接使用。需要做一个整合。以下以PHP为例。双击证书,或者用拖拽,把证书放到钥匙串中。

这样,在钥匙串中找到这个推送证书,前面的名字是一样的,后面是你起的bundle名。接着,就是把cer证书转化成pem文件,供后台使用。右键点击这个证书,选择“导出”,放到本地。会得到一个后缀为p12的文件。然后打开MacOS下的命令行程序,运行以下几条命令,其中会让你输入密码,是不可见的,输入完回车就行,屏幕上是看不到输入的字符的,会输入好几次密码,所以建议每次密码都输一样的。

  openssl pkcs12 -clcerts -nokeys -out 文件名A.pem -in 苹果证书.p12

  openssl pkcs12 -nocerts -out 文件名B.pem -in 苹果证书.p12

  最后把用证书拆出来的两个文件合到一起:cat 文件名A.pem 文件名B.pem > lltpush.pem

最终的这个lltpush.pem是我们需要的,给后台用。

  这样,就基本完成了。再写后台代码之前,还需要去developer.apple.com上建一个证书和一个描述文件,一点要选支持push的那个APPID,就是我们刚才创建的那个。这样,我们才能真机调试。总结一下,要在developer.apple.com上获取三个东西。

  开头说到,后台是搭建在SAE云端的,推送代码都不用些,只要调用SAE封装好的一个类就可以。那么,想要用SAE,自己去注册一个应用,然后进入到应用首页,得配置一下证书才能使用推送。这个很简单,看一下SAE的推送说明文档就OK。

到这个设置页面,把证书上传上去,密码写你在命令行合成时候填的密码。记住你的证书序号,因为写推送的时候,要选择用哪个证书发推送。

  SAE就不多介绍了,自己看下文档。现在就开始写代码了,新建一个PHP页面出来。看以下的代码。

 1 <?php
 2
 3 $cert_id = 1686;
 4 $device_token = $_REQUEST[‘device_token‘];
 5 $message = $_REQUEST[‘message‘];
 6
 7 //这个是简单的例子,更复杂的消息格式请查看苹果官方文档
 8 $body = array(
 9     ‘aps‘ => array( ‘alert‘ => $message , ‘badge‘ => 1, ‘sound‘ => ‘in.mp3‘)
10 );
11 $apns = new SaeAPNS();
12 //push消息到SAE推送服务器
13 $result = $apns->push( $cert_id , $body , $device_token );
14
15 if( $result && is_array($result) ){
16     $dic = array(‘success‘ => ‘0‘);
17     echo json_encode($dic);
18    // var_dump( $result );
19 } else {
20     $dic = array(‘success‘ => ‘1‘);
21     echo json_encode($dic);
22     //var_dump($apns->errno(), $apns->errmsg());
23 }
24 ?>

  这个接口呢,需要两个参数,一个是设备的device_token,还有就是你要推送的消息内容。然后调用SAE的方法就可以。发送成功返回JSON串。复杂的代码就不说了。

  这只是个测试demo,真正的推送是后台判断的。不是我们去调接口。

  就到这里吧。 

时间: 2024-10-25 22:55:53

IOS8下的远程推送(转载)的相关文章

iOS8下的远程推送

昨天做了一下远程推送,今天写下来,分享给需要的人.参考了很多篇文章,或许是iOS8的改动,没有一篇可以完整的看下来,所以打算自己写一篇. 后台我也写了,用的是SAE,PHP代码,很简单,调用SAE封装好的一个类就可以向APNS发推送信息. 首先,来说一下苹果的推送机制.顾名思义,推送,是指服务器向客户端发送消息,那么在iOS中,应用是被后台挂起的,并不能一直连接网络,那么服务器怎么才能把消息发送到客户端呢?这就用到推送,苹果的推送机制,是只能由APNS发送推送通知,所以你自己的后台服务器想给客户

两年后回首phonegap2.9,及与IOS结合结合下的远程推送

最早接触phoneGap,也是源于机缘巧合,现在都已经更新到了3.1版本,对于各大平台的兼容性,相对之前有了很大的提高,但是的对于一些老旧设备(android和wp7)还是存在那么一点的硬伤: 最当初对其性能进行了测试,设备分别是 摩托罗拉BM200 系统 andriod 2.1  内存256MB 算是对于现在来说相对较渣的手机了,但是用来跑phoneGap性能上还是相对于另外一部 HTC WP7设备(内存 512MB cpu 1GHZ)效果比较理想,这种情况的出现,只能归结于 其系统搭载浏览器

ios (推送之远程推送)升级成ios8系统之后有些程序接收不到远程推送

维护一个程序,当手机升级到ios8之后就不能接收到远程推送,显示注册失败,查了下资料,原来是没有获取用户许可,加了个方法试了下,ok if ([[[UIDevice currentDevice]systemVersion ]integerValue] >= 8) { UIUserNotificationSettings*setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUser

iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解(转载自薛银亮 [email&#160;protected])

原文地址:http://www.cnblogs.com/66it/p/4784224.html iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解 什么是消息推送 举一个常见的例子,我们的手机上经常会有弹出一些信息,例如QQ信息.微信信息等等,这就是常见的消息推送. 例如: 消息推送的类型: 在屏幕顶部显示一块横幅(显示具体内容) 在屏幕中间弹出一个UIAlertView(显示具体内容) 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容) 更新app图标的数字(说明新

ios8以上远程推送 demo

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送、本地推送

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送本地推送 2015-05-03 14:12 3510人阅读 评论(0) 收藏 举报 本文章已收录于:  iOS知识库  分类: [IOS -事件响应者链](3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知 本地推送通知(L

IOS本地,APNS远程推送(具体过程)

添加本地推送 ///本地添加 -(void)addLocalPushNotification:(UIButton*)sender; { NSLog(@"%s",__FUNCTION__); UILocalNotification* localNotification=[[UILocalNotification alloc]init]; if (localNotification) { //设置时间当前加20秒 NSDate* pushDate=[NSDate dateWithTimeI

iOS开发中的远程推送实现(最新,支持iOS9)

我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,因此这篇文章希望总结一下最新的iOS推送功能,因为iOS8之后的推送和致之前的版本是有所不同的,也希望想能帮助到需要的朋友.这篇文章将从零开始,向大家介绍远程推送功能的原理和使用. 什么是远程推送通知 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为APNs(Apple Push Notification Services). 为什么程序中需要远程推送功能 1.传统

iOS远程推送原理

远程推送 就是从远程服务器推送消息给客户端的通知,当然需要联网. 远程推送服务APNs (Apple Push NotificationServices) 为什么需要远程推送通知? 传统获取数据的局限性是只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容 而远程推送通知可以解决这个问题,不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知. 我们先从网络连接开始了解下. http协议:是个短连接,一个请求一个响应就结束了.典型的网络请求. tcp