iOS8下的远程推送
本篇文章主要介绍了"iOS8下的远程推送",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下: 昨天做了一下远程推送,今天写下来,分享给需要的人。参考了很多篇文章,或许是iOS8的改动,没有一篇可以完整的看下来,所以打算自己写一篇。后台我也写了,用的是...
昨天做了一下远程推送,今天写下来,分享给需要的人。参考了很多篇文章,或许是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文件。打开应用程序中的“钥匙串访”,从菜单中选择“证书助理”-》“从证书颁发机构请求证书”
IT经典笑语录:有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他说,“你知道不知道这个东西会危害你的健康?我是说,你有没有注意到香烟盒上的那个警告(Warning)?” 小伙子说,“没事儿,我是一个程序员”。 那妇女说,“这又怎样?” 程序员说,“我们从来不关心Warning,只关心Error”
然后保存在本地就行。这样我们就获取了一个证书请求文件。
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,真正的推送是后台判断的。不是我们去调接口。
就到这里吧。
以上就介绍了iOS8下的远程推送,包括了方面的内容,希望对IOS开发有兴趣的朋友有所帮助。
iOS8下的远程推送的更多相关文章
- iOS---iOS10适配iOS当前所有系统的远程推送
一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...
- iOS本地推送与远程推送
原文在此 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程 ...
- iOS远程推送1
一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...
- IOS之推送通知(本地推送和远程推送)
推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...
- iOS开发中的远程推送实现(最新,支持iOS9)
我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,而且iOS8之后的推送和之前的版本是有所不同的,因此这篇文章希望总结一下最新的iOS推 ...
- iOS本地推送与远程推送详解
一.简介 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程 ...
- 81、iOS本地推送与远程推送详解
一.简介 分为本地推送和远程推送2种.可以在应用没打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户石否同意,如果同意则正常使用:如果用户不同意则下次打开程序 ...
- 包教包会:本地推送 & 远程推送
什么是推送?注意,和我们常用的抽象通知不同(NSNotification): 可以让不在前台运行的app,告知用户app内部发生了什么事情:或者没有运行的app接收到服务器发来的通知..比如离线QQ接 ...
- iOS开发之远程推送
说到远程推送,应该用的也挺多的,今天就基于SEA的云推送服务,做一个推送的小demo,来了解一下iOS中的远程推送是怎么一回事儿,首先你得有苹果的开发者账号,好咸蛋也差不多了,主要内容走起. 一.准备 ...
随机推荐
- elk-filebeat收集docker容器日志
目录 使用docker搭建elk filebeat安装与配置 docker容器设置 参考文章 首发地址 使用docker搭建elk 1.使用docker-compose文件构建elk.文件如下: ve ...
- UEFI
UEFI,全称Unified Extensible Firmware Interface,即“统一的可扩展固件接口”,是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替BIOS(基 ...
- 大图轮播js
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- JavaWeb笔记(十一)Maven
什么是Maven Maven是Apache旗下一款开源自动化的项目管理工具,它使用java语言编写,因此Maven是一款跨平台的项目管理工具. 主要功能 项目构建 在实际开发中,不仅仅是写完代码项目就 ...
- Python下安装protobuf
1. 下载安装包 2. 解压缩 tar –xzvf protobuf-2.6.1.tar.gz 3. 安装protoc 在python中使用protocbuf需要Protocal Buffer 编译器 ...
- 【python基础】--常用数据结构
list tuple dict set四种常用数据结构 list list 有序的集合,可以随时添加.删除其中元素值; 支持list嵌套模式, >>> p = ['a','b']&g ...
- 锚点自适应 map area coords
最近做MOBILE的HTML5开发,人体图和页面一样,需要自适应不同的手机屏幕,蛋疼的是coords里面的标记是固定的,图片自适应后,锚点的标记就会产生空白区域,看了下https://github.c ...
- P3153 [CQOI2009]跳舞
题目描述 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会”单向喜欢“) ...
- ubuntu服务器环境配置参考
一.基本的Linux系统命令: ls 查看当前目录下的文件及文件夹 cd /var/www/html 转换目录到/var/www/html cd abc/ddd/ 转换目录到当前目录下的abc文件夹下 ...
- 湘潭邀请赛 2018 D Circular Coloring
题意: 给一个环,环上有n+m个点.给n个点染成B,m个点染成W.求所有染色情况的每段长度乘积之和. 题解: 染成B的段数和染成W的段数是一样的(因为是环). 第一段是可以移动的,例如BBWWW移动为 ...