博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 消息推送原理
阅读量:4321 次
发布时间:2019-06-06

本文共 5816 字,大约阅读时间需要 19 分钟。

一、消息推送原理:

在实现消息推送之前先提及几个于推送相关概念,如下图:

1、 Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);
2、 APNS:Apple Push Notification Service[苹果消息推送服务器];
3、 iPhone:用来接收APNS下发下来的消息;
4、 Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端 app[消息的最终响应者];
上图可以分为三个阶段:
阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS;
阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备;
阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。
具体过程,如下图:

1、 [Client App]注册消息推送;

2、 [Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
3、 [Client App]将deviceToken发送给[Provider]Push服务端程序;
4、 当Push服务端程序满足发送消息条件了,[Provider]向[APNS Service]发送消息;
5、 [APNS Service]将消息发送给[Client App].

二、消息推送实现:

1、 生成*.certSigningRequest文件,步骤如下:

[MacBookà应用程序à实用工具à钥匙串访问à证书助手à从证书机构求证书?à证书信息(用户电子邮箱地址{填写您的邮箱, 如:your@email.com},常用名称{任意,如:PushDemo},请求是:{单选,选择‘存储到磁盘’})à继续à保存],这时会在您指定 的地方生成你指定的文件,默认为CertificateSigningRequest.certSigningRequest文件,这里命名 为:PushDemo.certSigningRequest.在此*.certSigningRequest已经生成,具体操作步骤如下面两张图所示。

如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certSigningRequest关联的密钥,这里是PushDemo,如下图所示:

2、 新建一个App ID(在苹果开发者账号中配置)
(1) 登录,登录成功后,点击(iOS Provisioning Portal对应链接),如下图所示:

(2) 创建New App ID[App IDsàManageàNew App ID]( Description{填写您对此App ID 的描述,如:iShop},Bundle Seed ID(App ID Prefix){选择绑定App ID前缀,如:默认选择Generate New},Bundle Identifier(App ID Suffix){填写绑定App ID后缀,如:com.yourcorp.iShop}),如下图所示:

这样就会生成下面这条记录,如下图所示:
(3) 配置上一步中生成的App ID,让其支持消息推送[点击2-6中的Configureà选中Enable for Apple Push Notification serviceà点击Configure],如下图所示:
(4) Generate a Certificate Signing Request(生成部署请求认证)[点击上图中的2ConfigureàContinueà步骤1生成的*certSigningRequest文件 (这里是iShop. certSigningRequest)à Generateà生成完成后将其下载下来,命名为:aps_developer_identity.cer],双击 aps_developer_identity.cer证书{将证书与密钥关联,并将证书导入到MacBook中},如下图所示:
(5) 创建Development Provisioning Profiles[开发许可配置文件](Provisioning| Development|New Profile),具体操作流程如下图所示:
点击上图中Submit,生成Development Provisioning Profiles[开发许可配置文件],这里是:iShopDevprofile.mobileprovision如下图所示:

下载此开发许可证书(用于联机调试)。

总结,到现在为止,我们已经生成:A:*.certSigningRequest文件(在步骤(4)中使用,用于生成证书B)、B: aps_developer_identity.cer证书(在Provider[Push服务器]服务端应用使用)、 C:*..mobileprovision开发许可配置文件(在Client App客户端应用联机调试使用)。

至此,消息推送的配置已经全部完成,接下来的工作就是编写Provider[Push服务器]服务端应用和Client App客户端应用的程序。

三、Provider服务端的实现

在这里只是简单讲述Provider服务端(JAVA实现)步骤如下:

(1) 制作Provider服务端所需要的*.p12文件:

在上面的实现的(4) 部分的图所展示的密钥、证书,我们并没有使用到它,那么为什么要展示出来呢,猜猜是为什么?为制作*.p12文件?哈哈,您猜对了,下面我们就利用它来制 作*.p12文件,步骤:([MacBookà应用程序à实用工具à钥匙串访问[钥匙串:登录,种类:证书]à选择刚刚生成的证书(Apple Development IOS Services:*******)à菜单à文件à导出项目…à[存储为:任意文件名(如:iPush),文件格式:默认(个人信息交换 (.p12))]à输入密码以进行导出[密码:任意,验证:与密码同一]à输入MACBook登录密码à允许à最终生成。

关键步骤如下图:

(2) 编写Client App客户端的关键代码,如下:

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
-
(
BOOL
)application
:
(UIApplication
*
)application didFinishLaunchingWithOptions
:
(
NSDictionary
*
)launchOptions
{
    self.window
=
[
[
[UIWindow alloc
] initWithFrame
:
[
[UIScreen mainScreen
]bounds
]
] autorelease
];
    self.window.backgroundColor
=
[UIColor whiteColor
];
   
[self.window makeKeyAndVisible
];
   
//消息推送支持的类型
    UIRemoteNotificationType types
=
   
(UIRemoteNotificationTypeBadge
     |UIRemoteNotificationTypeSound
     |UIRemoteNotificationTypeAlert
);
   
//注册消息推送
   
[
[UIApplication sharedApplication
]registerForRemoteNotificationTypes
:types
];
   
return
YES;
}
 
//获取DeviceToken成功
-
(
void
)application
:
(UIApplication
*
)application
didRegisterForRemoteNotificationsWithDeviceToken
:
(
NSData
*
)deviceToken
{
    NSLog
(
@
"DeviceToken: {%@}",deviceToken
);
   
//这里进行的操作,是将Device Token发送到服务端
}
 
//注册消息推送失败
-
(
void
)application
:
(UIApplication
*
)application
didFailToRegisterForRemoteNotificationsWithError
:
(
NSError
*
)error
{
    NSLog
(
@
"Register Remote Notifications error:{%@}",
[errorlocalizedDescription
]
);
}
 
//处理收到的消息推送
-
(
void
)application
:
(UIApplication
*
)application
didReceiveRemoteNotification
:
(
NSDictionary
*
)userInfo
{
    NSLog
(
@
"Receive remote notification : %@",userInfo
);
    UIAlertView
*alert
=
   
[
[UIAlertView alloc
] initWithTitle
:
@
"温馨提示"
                               message
:
@
"推送成功!"
                              delegate
:
nil
                     cancelButtonTitle
:
@
"确定"
                     otherButtonTitles
:
nil
];
   
[alert show
];
   
[alert release
];
}

(3)编写Provider服务端关键代码,如下:

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
45
import
javapns.back.PushNotificationManager
;
import
javapns.back.SSLConnectionHelper
;
import
javapns.data.Device
;
import
javapns.data.PayLoad
;
 
public
class MainSend
{
   
public
static
void main
(
String
[
] args
)
throws
Exception
   
{
       
try
       
{
           
//从客户端获取的deviceToken
           
String deviceToken
=
"3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46"
;
           
System.
out.
println
(
"Push Start deviceToken:"
+ deviceToken
)
;
           
//定义消息模式
            PayLoad payLoad
=
new PayLoad
(
)
;
            payLoad.
addAlert
(
"消息推送测试!"
)
;
            payLoad.
addBadge
(
4
)
;
            payLoad.
addSound
(
"default"
)
;
           
//注册deviceToken
            PushNotificationManager pushManager
= PushNotificationManager.
getInstance
(
)
;
            pushManager.
addDevice
(
"iPhone", deviceToken
)
;
           
//连接APNS
           
String host
=
"gateway.sandbox.push.apple.com"
;
           
int port
=
2195
;
           
String path
=
"/Users/iMilo/Work.localized/iShop/project/service/iPush/"
;
           
String certificatePath
=
(path
+
"src/ipush/iPush.p12"
)
;
           
//certificatePath 步骤一中生成的*.p12文件位置
           
String certificatePassword
=
"Love24mm"
;
            pushManager.
initializeConnection
(host, port, certificatePath, certificatePassword, SSLConnectionHelper.
KEYSTORE_TYPE_PKCS12
)
;
           
//发送推送
            Device client
= pushManager.
getDevice
(
"iPhone"
)
;
            pushManager.
sendNotification
(client, payLoad
)
;
           
//停止连接APNS
            pushManager.
stopConnection
(
)
;
           
//删除deviceToken
            pushManager.
removeDevice
(
"iPhone"
)
;
           
System.
out.
println
(
"Push End"
)
;
       
}
       
catch
(
Exception ex
)
       
{
            ex.
printStackTrace
(
)
;
       
}
   
}
}

注意:如果Provider服务端为Objective-C实现的话,就不需要*.p12证书。

转载于:https://www.cnblogs.com/zhwl/p/3198427.html

你可能感兴趣的文章
My third day of OpenCV
查看>>
Android的View和ViewGroup分析
查看>>
echarts.js中的图表大小自适应
查看>>
Delphi的FIFO实现
查看>>
牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)
查看>>
(转)AS3 面相对象 高级话题
查看>>
Missile
查看>>
关于kindedit和 Uedit后者兼容前者
查看>>
微软BI 之SSIS 系列 - 利用 SSIS 模板快速开发 SSIS Package
查看>>
eclipse中使用git上传到githup,报401 Authorization Required
查看>>
基于Golang打造一款开源的WAF网关
查看>>
POJ 2955 Brackets
查看>>
Python: execute an external program (zz)
查看>>
在T-SQL语句中访问远程数据库(openrowset/opendatasource/openquery)
查看>>
闭包2
查看>>
轮播图组件及vue-awesome-swiper的引入
查看>>
Java 笔记07
查看>>
POJ 3041 Asteroids (二分匹配)
查看>>
响应式布局
查看>>
缺陷跟踪系统Mantis之安装篇(转载)
查看>>