iOS实现远程推送原理及过程

时间:2022-08-24 12:04:15

推送通知,是现在的应用必不可少的功能。那么在 ios 中,我们是如何实现远程推送的呢?ios 的远程推送原理又是什么呢?在做 ios 远程推送时,我们会遇到各种各样的问题。那么首先让我们准备一些做推送需要的东西。我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书。然后下载证书,供我们后面使用,详细的证书配置过程,我们下面再说。

首先我们要说说ios推送通知的基本原理

苹果的推送服务通知是由自己专门的推送服务器apns (apple push notification service)来完成的,其过程是 apns 接收到我们自己的应用服务器发出的被推送的消息,将这条消息推送到指定的 ios 的设备上,然后再由 ios设备通知到我们的应用程序,我们将会以通知或者声音的形式收到推送回来的消息。 ios 远程推送的前提是,装有我们应用程序的 ios 设备,需要向 apns 服务器注册,注册成功后,apns 服务器将会给我们返回一个 devicetoken,我们获取到这个 token 后会将这个 token 发送给我们自己的应用服务器。当我们需要推送消息时,我们的应用服务器将消息按照指定的格式进行打包,然后结合 ios 设备的 devicetoken 一起发给 apns 服务器。我们的应用会和 apns 服务器维持一个基于 tcp 的长连接,apns 服务器将新消息推送到ios 设备上,然后在设备屏幕上显示出推送的消息。

设备注册apns的流程图

iOS实现远程推送原理及过程

上图完成了如下步骤:

1.device(设备)连接apns服务器并携带设备序列号(uuid)

2.连接成功,apns经过打包和处理产生devicetoken并返回给注册的device(设备)

3.device(设备)携带获取的devicetoken发送到我们自己的应用服务器

4.完成需要被推送的device(设备)在apns服务器和我们自己的应用服务器的注册

推送过程图:

iOS实现远程推送原理及过程

推送的过程经过如下步骤

1.首先,我们的设备安装了具有推送功能的应用(应用程序要用代码注册消息推动),我们的 ios设备在有网络的情况下会连接apns推送服务器,连接过程中,apns 服务器会验证devicetoken,连接成功后维持一个基于tcp 的长连接;

2.provider(我们自己的应用服务器)收到需要被推送的消息并结合被推送的 ios设备的devicetoken一起打包发送给apns服务器;

3.apns服务器将推送信息推送给指定devicetoken的ios设备;

4.ios设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框)

比较直观的流程图:

iOS实现远程推送原理及过程

信息包结构图:

iOS实现远程推送原理及过程

上图显示的这个消息体就是我们的应用服务器(provider)发送给apns服务器的消息结构,apns验证这个结构正确并提取其中的信息后,再将消息推送到指定的ios设备。这个结构体包括五个部分,第一个部分是命令标示符,第二个部分是我们的devicetoken的长度,第三部分是我们的devicetoken字符串,第四部分是推送消 息体(payload)的长度,最后一部分也就是真正的消息内容了,里面包含了推送消息的基本信息,比如消息内容,应用icon右上角显示多少数字以及推送消息到达时所播放的声音等

payload(消息体)的结构:

?
1
2
3
4
5
6
7
{
 “aps”:{
 “alert”:“听云给您发送了新消息”,
 “badge”:1,
 “sound”:“default
 },
}

这其实就是个json结构体,alert标签的内容就是会显示在用户手机上的推送信息,badge显示的数量(注意是整型)是会在应用icon右上角显示的数量,提示有多少条未读消息等,sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音。

下面就是我们推送通知所需要的证书的推送过程

1.首先我们要新建一个certificate signing request(也就是csr)的请求文件

在应用程序里的使用工具中找到钥匙串访问,选择从证书颁发机构请求证书

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

注意:邮箱地址,填自己的开发者账号,常用名,随便填一个记住就行。然后选择存储到磁盘。继续就行。

iOS实现远程推送原理及过程

保存位置在 tingyun(指定自己的文件夹,这里我选择的是我的文件夹),点击存储

然后点击完成后我们会在 tingyun 里看到一个certificatesigningrequest.certsigningrequest的请求文件,也就是我们说的csr文件。在我们生成csr文件的同时,会在钥匙串访问中生成一对秘钥,名称为刚才我们填写的常用名

2.配置appid

到苹果开发者网站https://developer.apple.com

点击account 

iOS实现远程推送原理及过程

选择 certificates,identifiers&profiles 

iOS实现远程推送原理及过程

选择 identifiers ->app ids 点击上方的+号创建一个 app id.

iOS实现远程推送原理及过程

name: 填写 app 的名字就行

app id suffix 选择不用通配符的及 explicit app id

bundle id:填写自己应用的 bundle id 一定要和自己应用的一致.

iOS实现远程推送原理及过程

在下面的 app services 中选择自己需要的服务

我们需要推送服务,所以在push notifications上打勾

然后点击continue

iOS实现远程推送原理及过程

3.创建证书

证书需要创建两种,一种是开发的、一种是发布的,开发的是做测试用的。

选择development 点击右上角的+号,创建证书,我们首先创建开发证书

iOS实现远程推送原理及过程

选择apple push notification service ssl (sandbox),创建推送服务证书点击下一步

iOS实现远程推送原理及过程

这儿的 app id 选择我们刚才创建的 app id

然后点击下一步,下一步

iOS实现远程推送原理及过程

这儿点击 choose file,选择我们刚才创建的 csr 文件.

然后点击生成(generate)

最后点击下载,下载证书。将下载的证书,放到指定位置。

iOS实现远程推送原理及过程

发布证书的创建和开发证书一样,选择production->apple push notification service ssl (production)后面和开发证书一样

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

4.添加 devices:

首先选中你要添加哪种设备,然后在左上角点击“+”号。

iOS实现远程推送原理及过程

name 填写一个设备名字。

udid 填写自己需要加入测试的设备的 udid。

然后点击下一步

iOS实现远程推送原理及过程

然后点击 register 即可

iOS实现远程推送原理及过程

点击done。

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

5.查找设备的 udid:

用自己的 ios 设备连接到电脑上,打开 itunes。

在设备摘要处可以看见一个序列号,点击序列号就会变成 udid。

iOS实现远程推送原理及过程

6.生成配置文件

配置文件也有两种,一种是开发的,一种是发布的,开发的使我们做测试需要的,发布的是我们在 appstore 上发布时需要的,我们都需要生成。

我们先生成开发配置文件,选择provisioning profiles->development点击右上角的+号。

iOS实现远程推送原理及过程

选择ios app development 点击下一步

iOS实现远程推送原理及过程

这儿的 app id 仍然选择我们刚才创建的 app id

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

这儿选择我们开发者的证书,如果不知道是哪个选择全部即可

iOS实现远程推送原理及过程

这儿选择我们的测试设备,如果没有则在前面的devices里面添加即可

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

随便取个名字即可,然后下载下来

iOS实现远程推送原理及过程

发布配置文件和开发配置文件一样创建,选择distribution->ad hoc即可,后面与发布配置文件一样。

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

iOS实现远程推送原理及过程

证书配置完成,打开我们创建的应用项目

打开appdelegate.m 文件,在- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions 方法中添加下面代码,注册消息推送

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
 // override point for customization after application launch.
  /** 消息推送注册 */
 if ([uidevice currentdevice].systemversion.floatvalue >= 8.0) {
  
  uiusernotificationsettings *settings = [uiusernotificationsettings settingsfortypes:uiusernotificationtypebadge | uiusernotificationtypesound | uiusernotificationtypealert categories:nil];
  [application registerusernotificationsettings:settings];
  [application registerforremotenotifications];
 }else {
  [application registerforremotenotificationtypes:(uiremotenotificationtypebadge | uiremotenotificationtypesound | uiremotenotificationtypealert)];
 }
 
 return yes;
}
下面方法是返回 anps 苹果推送服务器生成的唯一标识
/** 接收服务器传回的设备唯一标识 token */
-(void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)devicetoken{
 
 // 第一次运行获取到devicetoken时间会比较长!
 // 将devicetoken转换成字符串,以便后续使用
 nsstring *token = [devicetoken description];
 nslog(@"description %@", token);
}
 
下面方法是当有消息推送回来时,接收推送消息
/** 设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息 */
 
-(void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo{
 
 nslog(@"userinfo == %@",userinfo);
}
 
上面方法是当注册推送服务失败时,接收错误信息
/** 注册推送服务失败 */
-(void)application:(uiapplication *)application didfailtoregisterforremotenotificationswitherror:(nserror *)error{
 nslog(@"注册失败 %@",error);
}

服务器端(java服务器)

服务器端我们需要,一个后缀为. p12的证书,以及需要的 jar 包

服务器端的证书生成方式:

打开我们前面下载的证书,在钥匙串中找到它

iOS实现远程推送原理及过程

点击鼠标右键选择导出

iOS实现远程推送原理及过程

导出后缀为.p12的文件保存到自己的电脑上,需要输入一个密码,在 java 服务器端要用到

iOS实现远程推送原理及过程

java服务器端需要的 jar 包

iOS实现远程推送原理及过程

java 服务器端代码:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import javapns.back.pushnotificationmanager;
import javapns.back.sslconnectionhelper;
import javapns.data.device;
import javapns.data.payload;
public class pushservice {
 public static void main(string[] args) {
  
  
 try {
    string devicetoken = "eab6df47eb4f81e0aaa93bb208cffd7dc3884fd346ea0743fcf93288018cfcb6";
    //被推送的iphone应用程序标示符 
    payload payload = new payload();
    payload.addalert("测试我的push消息");
    payload.addbadge(1);
    payload.addsound("default");
      
    pushnotificationmanager pushmanager = pushnotificationmanager.getinstance();
    pushmanager.adddevice("iphone", devicetoken);
    
       //测试推送服务器地址:gateway.sandbox.push.apple.com /2195
   //产品推送服务器地址:gateway.push.apple.com / 2195
    string host="gateway.sandbox.push.apple.com"; //测试用的苹果推送服务器
    int port = 2195;
    string certificatepath = "/users/hsw/desktop/pushtest/pushtest.p12"; //刚才在mac系统下导出的证书
    
    string certificatepassword= "123456";
   
    pushmanager.initializeconnection(host, port, certificatepath,certificatepassword, sslconnectionhelper.keystore_type_pkcs12);
      
    //send push
    device client = pushmanager.getdevice("iphone");
    pushmanager.sendnotification(client, payload); //推送消息
    pushmanager.stopconnection();
    pushmanager.removedevice("iphone");
   }
   catch (exception e) {
    e.printstacktrace();
    system.out.println("push faild!");
    return;
   }
   system.out.println("push succeed!");
   }
 
}

以上就是完整的ios远程推送原理及实现过程,希望对大家的学习有所帮助。