[IOS开发]IOS开发之推送

最近的项目中使用到了推送,第一次搞推送,遇到了不少坑,所以记录下来。

参考:手把手教你做IOS推送

首先是一些基础知识

APNS的推送机制

首先我们看一下苹果官方给出的对iOS推送机制的解释。如下图

Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。

上图可以分为三个阶段:

第一阶段:应用程序的服务器端把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

 APNS推送通知的详细工作流程

下面这张图是说明APNS推送通知的详细工作流程:

根据图片我们可以概括一下:

1、应用程序注册APNS消息推送。

2、iOS从APNS Server获取devicetoken,应用程序接收device token。

3、应用程序将device token发送给程序的PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

好啦,流程讲完,再来讲讲要准备的东西

1.一台iphone。ipod 或者ipad

2.开发者账户

3.IOS开发环境

下面,正式开始。

一.新建工程

记住我们的Bundle Identifier是 com.slpcb.PushDemo

二.制作证书

我们的客户端与苹果服务器之间和我们自己的服务器与苹果服务器之间都需要证书来进行链接。下面我们来开始进入证书的制作过程。

1.生成CSR文件

首先我们要有生成一个Certificate Signing Request(也就是CSR)的请求文件。

打开钥匙串访问,点击  钥匙串访问-》证书助理-》从证书颁发机构请求证书

2.制作证书

进入苹果开发者网站

添加新的APPID

填写必要信息

注意必须填写确定的appid,通配的时不可以的

勾选push notification,然后点击继续

接下来就是提交

下面我们回到APPID列表,编辑刚刚生产的APPID

点击创建证书

一步步确定

这里选择我们第一步创建的CSR文件

选择好之后确定

然后下载证书(记得下载后双击安装)

3.生成Profile

证书生产好了之后 ,我们还需要对应的Profile文件

照例先进入管理界面,点击添加

继续

现则App ID,继续

选择证书,继续

选择设备,继续

起个名字,继续

好啦,完成啦 ,下载下来

制作证书完毕,接下来就是处理它们了。

首先先把证书导出来。

打开钥匙串访问 ,右击导出我们刚刚生成的证书

起个名字

设置密码,这个密码很重要。要记住。这里我设置为123456

现在来整理一下,做了上面的步骤之后。我们得到了下面几个文件

1.PushDemoDev.certSigningRequest    CSR文件

2.aps_development.cer     SSL证书文件

3.PushDemo.p12                             秘钥文件

但是这些还不够,我们需要的是生成一个后缀为pem的文件,接下来我们搞定它

打开终端,定位到我们那几个文件所在的位置

1、把.cer的SSL证书转换为.pem文件,执行命令:

openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem

在推送整理文件夹内会生成一个PushChatCert.pem文件

2、把私钥PushDemo.p12文件转化为.pem文件:

openssl pkcs12 -nocerts -out PushChatKey.pem -in PushDemo.p12

,这里会让你输入3次密码,第一次是你到处p12文件的时候设置的密码,也就是我们上面设置的123456

第二第三次是对我们生成的pem文件设置密码,这个密码是需要告诉服务器的。为了方便,我们还是设置为123456

3、对生成的这两个pem文件再生成一个pem文件,来把证书和私钥整合到一个文件里:

cat PushChatCert.pem PushChatKey.pem > ck.pem

生成ck.pem文件

下面我们要使用我们生成的SSL证书和私钥来设置一个安全的链接去链接苹果服务器:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

执行完这一句命令后需要我们输入密语

Enter pass phrase for PushChatKey.pem:

我们输入123456按回车

你会看到一个完整的输出,让你明白OpenSSL在后台做什么。如果链接是成功的,你可以随便输入一个字符,按下回车,服务器就会断开链接,如果建立连接时有问题,OpenSSL会给你返回一个错误信息。

如果看到下面的反馈,说明你成功了

好啦,此间事了,改去看看我们一开始新建的工程了

打开工程PushDemo

打开AppDelegate

换上

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

//推送的形式:标记,声音,提示

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];

return YES;

}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken
{

NSLog(@"regisger success:%@",pToken);

//注册成功,将deviceToken保存到应用服务器数据库中

}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

// 处理推送消息

NSLog(@"userinfo:%@",userInfo);

NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);

}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{

NSLog(@"Registfail%@",error);

}

然后设置

好的  run 一个。成功进入后,应用会弹出窗口让用户确认接收通知

这时,我们看看xcode的output,里面输出了我们苹果机器的deviceToken,把它记下来

点击 好。

接下来就是我们的服务端登场了

pushMe.php

里面的代码如下

这里要注意的是

$deviceToken 的值换成我们上面得到的deviceToken,空格去掉

$passphrase 是我们之前设置的密码,123456

<?php

// Put your device token here (without spaces):

$deviceToken = ‘978042ec5cda4a0e790b14431d00e33218c9707526d3ac3cf0d8549b72cef2cd‘;

// Put your private key‘s passphrase here:密语

$passphrase = ‘123456‘;

// Put your alert message here:

$message = ‘发布测试!"‘;

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();

stream_context_set_option($ctx, ‘ssl‘, ‘local_cert‘, ‘ck.pem‘);

stream_context_set_option($ctx, ‘ssl‘, ‘passphrase‘, $passphrase);

// Open a connection to the APNS server

$fp = stream_socket_client(

‘ssl://gateway.sandbox.push.apple.com:2195‘, $err,

$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)

exit("Failed to connect: $err $errstr" . PHP_EOL);

echo ‘Connected to APNS‘ . PHP_EOL;

// Create the payload body

$body[‘aps‘] = array(

‘alert‘ => $message,

‘sound‘ => ‘default‘

);

// Encode the payload as JSON

$payload = json_encode($body);

// Build the binary notification

$msg = chr(0) . pack(‘n‘, 32) . pack(‘H*‘,
$deviceToken) . pack(‘n‘, strlen($payload)) . $payload;

// Send it to the server

$result = fwrite($fp, $msg, strlen($msg));

if (!$result)

echo ‘Message not delivered‘ . PHP_EOL;

else

echo ‘Message successfully delivered‘ . PHP_EOL;

// Close the connection to the server

fclose($fp);

?>

把我们的pushMe.php放在证书的那个目录,然后终端定位到该目录

执行:php pushMe.php

yeah, 大功告成!

不过,这只是开发版的而已,如果是要发布版,则要创建对应的发布版证书,当然,地址也得变变。

APNS地址

测试地址gateway.sandbox.push.apple.com:2195 

发布地址 gateway.push.apple.com:2195

测试的地址用的是沙盒,发布地址是不同的。发布软件的时候记得改过来.

时间: 2024-08-07 00:06:25

[IOS开发]IOS开发之推送的相关文章

IOS平台的几个推送服务的对比

IOS平台的几个推送服务的对比 http://blog.163.com/[email protected]/blog/static/171370086201399113833299/ 最近研究了一下极光推送(JPush),百度云推送和个推在IOS平台的推送机制,做了一下对比.       首先, 介绍苹果推送通知服务的推送机制(APNS: Apple Push Notification Service):                                              

android系统和ios系统是如何实现推送的,ios为什么没有后台推送

ios系统为什么没有后台推送? iOS 为了真正地为用户体验负责,不允许应用在后台活动.有了这个限制,但是对于终端设备,应用又是有必要“通知”到达用户的,随时与用户主动沟通起来的(典型的如聊天应用). 这就是 APNs 的逻辑所在:iOS 自己做个长驻后台保持连接.所有应用,有必要(申请)并且被允许(用户可以改设置)的话,可以通过 APNs 中转到达用户.这样就完善了! 有可能很多人没有真正地体会到 iOS 不允许后台应用的好处.我是 Android 开发人员,Android 手机上一般只保留几

APNS编程----iOS真机测试消息推送

一.准备工作 1 拥有一台iOS为操作系统的苹果设备,iPhone,iPad,iPod都可以. 2 拥有苹果开发者账号,需要真机调试,最好是是付费开发者,后面的步骤将会更顺利. 3 需要一台PC做推送服务器,如果是台拥有MAC OS系统,将会更方便. 二.了解大致步骤 我们需要从测试的消息推动服务器,发送一条消息到Apple Push Notification Services,然后APNS转发到iOS设备,完成消息推送过程. 由于我们的测试服务器到APNS,传递的是加密后的消息,所以需要申请证

解决iOS 使用腾讯信鸽推送sdk编译链接不能通过的问题

默认demo,在64bit模拟器上会link不过: target 中的 architectures 的valid architectrues里面,去掉 arm64, build active architecture only: 改为no 解决iOS 使用腾讯信鸽推送sdk编译链接不能通过的问题

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

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

iOS开发——iOS10升级极光推送SDK、友盟分享SDK

前不久升级了Xcode8 ,同时iOS10系统也推送久. 由于公司需要适配iOS 10系统,同时第三方sdk建议升级. 包含替换升级新的SDK和相应的代码修改. 主要分享如何升级极光推送SDK,友盟分享SDK和升级过程中的遇到的报错 一. 升级极光推送SDK,有一篇不错的博客,代码变更也写的挺详细就不在多写, 遇到的编译报错见第三部分 http://blog.csdn.net/cloud_pro/article/details/52574637 二. 升级友盟分享SDK到目前最新版5.2.1(升

iOS开发之功能模块--推送之坑问题解决

苹果开发证书中,有一个根证书,根证书可以绑定相关的开发者设备合作开发一个app项目,如果是多人团队一般根证书是由老大搞定和统一管理我们的设备,这时候老大他会用到他电脑的keychain来生成P12文件,然后并把根证书一并给我们用. 但是,开发苹果推送功能的人不一定是老大,比如老大交给我来弄这个推送证书并给app添加推送功能,而生成苹果的推送cer后缀的证书,就当然在我的电脑生成了,当然肯定要通过老大用的那个开发者账号登录苹果官网,并且要下载和app同一个bundle ID一致的推送证书: 下载好

微信小程序开发:设置消息推送

开发设置中,启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中. 不过照着说明去操作,即使按照最简单的明文方式去设置,还是提示Token验证失败.仔细研究说明,其实服务器验证过程很简单,用Get发来一个连接,然后在自己的页面中去检验,不想做也可以先不做,直接返回echostr即可.关键在,怎么返回,开始我还以为必须要按照xml或者json返回,试了半天,其实很简单,清空所有其他输出,直接返回echostr即可. Response.Clear()

iWatch开发:WatchOS 消息推送教程

简介 在watch 中,通知是和iPhone 同步的,在iPhone上的APP收到通知的同事,也会默认推送到iWatch 上,基于watch 的穿戴性,对用户来说,它上面的通知信息将比iPhone更及时. iWatch 上的通知分为两部分:short-look 与 long-look short-look short-look的预览界面比较简单,它会将通知发起的APP和主要标题等信息展示给大家,让你一目了然,当用户抬起手,查看这个通知的时候,这个短通知就会转换为long-look通知.短通知的通

iOS - 判断用户是否允许推送通知(iOS7/iOS8)

(iOS8中用户开启的推送通知类型对应的是UIUserNotificationType(下边代码中UIUserNotificationSettings的types属性的类型),iOS7对应的是UIRemoteNotificationType) 此处以iOS8的UIUserNotificationType为例,(如下图)当本地通知或push/远程通知 推送时,这个常量指明了app如何去提醒用户(比如:Badge,Sound,Alert的组合) 那么如何获得呢,在iOS8中是通过types属性,[[