本篇文章主要介绍了"iOS8下的远程推送",主要涉及到方面的内容,对于IOS开发感兴趣的同窗能够参考一下: 昨天作了一下远程推送,今天写下来,分享给须要的人。参考了不少篇文章,或许是iOS8的改动,没有一篇能够完整的看下来,因此打算本身写一篇。后台我也写了,用的是...php
昨天作了一下远程推送,今天写下来,分享给须要的人。参考了不少篇文章,或许是iOS8的改动,没有一篇能够完整的看下来,因此打算本身写一篇。前端
后台我也写了,用的是SAE,PHP代码,很简单,调用SAE封装好的一个类就能够向APNS发推送信息。ios
首先,来讲一下苹果的推送机制。顾名思义,推送,是指服务器向客户端发送消息,那么在iOS中,应用是被后台挂起的,并不能一直链接网络,那么服务器怎么才能把消息发送到客户端呢?这就用到推送,苹果的推送机制,是只能由APNS发送推送通知,因此你本身的后台服务器想给客户端推送通知,得把要推送的内容发送给APNS。程序员
说到这里,若是还不了解苹果的推送机制,能够自行查看资料。总之总体的流程就是:APP启动的时候,获取本设备的device_token,而后把这个device_token告诉你本身的服务器,服务器拿到这个device_token后,使用证书文件,向苹果的APNS服务器发起一个SSL链接,链接成功后发送一个JSON串,JSON里面包含device_token、通知内容以及其余的一些东西。苹果的APNS获得JSON后,经过device_token查找设备推送消息。json
那么,咱们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,收到了一条通知,那么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开发有兴趣的朋友有所帮助。