转自:http://wangjianlewo.blog.163.com/blog/static/176568051201262710213967/
一、消息推送原理:
在实现消息推送之前先提及几个于推送相关概念,如下图1-1:
1-1
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-2:
1-2
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à应用程序à实用工具à钥匙串访问à证书助手à从证书机构求证书?à证书信息(用户电子邮箱地址{填写您的邮箱,如:[email protected]},常用名称{任意,如:PushDemo},请求是:{单选,选择‘存储到磁盘’})à继续à保存],这时会在您指定的地方生成你指定的文件,默认为CertificateSigningRequest.certSigningRequest文件,这里命名为:PushDemo.certSigningRequest.在此*.certSigningRequest已经生成,具体操作步骤如图2-1、2-2所示。
2-1
2-2
如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certSigningRequest关联的密钥,这里是PushDemo,如图2-3所示:
2-3
2、 新建一个App ID(在苹果开发者账号中配置)
(1) 登录iOS Dev Center,登录成功后,点击(iOS Provisioning Portal对应链接),如图2-4所示:
2-4
(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}),如下图2-5所示:
2-5
这样就会生成下面这条记录,如图2-6所示:
2-6
(3) 配置上一步中生成的App ID,让其支持消息推送[点击2-6中的Configureà选中Enable for Apple Push Notification serviceà点击Configure],如图2-7所示:
2-7
(4) Generate a Certificate Signing Request(生成部署请求认证)[点击2-7中的2ConfigureàContinueà步骤1生成的*certSigningRequest文件(这里是iShop. certSigningRequest)à Generateà生成完成后将其下载下来,命名为:aps_developer_identity.cer],双击aps_developer_identity.cer证书{将证书与密钥关联,并将证书导入到MacBook中},如下图2-8所示:
2-8
(5) 创建Development Provisioning Profiles[开发许可配置文件](Provisioning| Development|New Profile),具体操作流程如下图2-9所示:
2-9
点击图2-9中Submit,生成Development Provisioning Profiles[开发许可配置文件],这里是:iShopDevprofile.mobileprovision如下图2-10所示:
2-10
下载此开发许可证书(用于联机调试)。将文件装到手机中,打开organizer,拖动到Provisioning Profiles ,即可联机调试
首先,我们需要先对Xcode项目进行一些设置,确保App ID和provisioning profile都被设置成良好的状态。
1.在Supporting Files文件夹下选中ProjectName-Info.plist,对右侧视图中的Bundle Identifier选项进行修改,和你自己创建的App ID保持一致(形如:com.parseSampleApp)。
2.在左侧的菜单中选中刚创建的project文件,在下面找到Build Settings然后搜索Code Signing Identity。
3.将对应provisioning profile的所有的值全部设置好。
4.选择左手边Targets下面的项目名称,再次找到Build Settings,来到Code Signing Identity区域,确保所有的值都和新的provisioning profile保持一致。
代码环节
接下来就开始进入编程模式了。我们需要对应用程序代理(app delegate)进行少量的修改,从而使得我们的应用可以接受到推送通知。步骤如下:
1.注册设备需要在app delegate的[application:didFinishLaunchingWithOptions:]方法中调用[application registerForRemoteNotificationTypes:]方法,代码如下:
- - (BOOL)application:(UIApplication *)application
- didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- ...
- // Register for push notifications
- [application registerForRemoteNotificationTypes:
- UIRemoteNotificationTypeBadge |
- UIRemoteNotificationTypeAlert |
- UIRemoteNotificationTypeSound];
- ...
- }
2.一旦成功,以上方法会在app delegate中执行回调方法[application:didRegisterForRemoteNotificationsWithDeviceToken:] 。
我们需要实现这个方法,用它来告知Parse我们的设备信息。代码如下:
NSString *strDev = [[[[[deviceToken description]
stringByReplacingOccurrencesOfString: @"<" withString: @""]
stringByReplacingOccurrencesOfString: @">" withString: @""]
stringByReplacingOccurrencesOfString: @" " withString: @""] retain];
NSLog(@"strDev is %@", strDev);
const void *devTokenBytes = [deviceToken bytes];
[self sendProviderDeviceToken:devTokenBytes]; // cus
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{ NSLog(@"Failed to get token, error: %@", error);
}
//当客户端收到推送通知后会触发方法. 消息在userInfo里.
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"%@",userInfo);
}
3,模拟服务器测试推送通知(使用php脚本,用来建立到APNS的连接和发送测试信息到之前的设备上。)
钥匙串选择登录,种类选择所有项目,在右侧列表中选中push的证书以及对应的专用密钥,并导出2项,命名为ck.p12。
在终端执行以下命令,生成ck.pem文件。
ps:开发环境下的deviceToken与生产环境下的deviceToken不同,所以服务端若要保存deviceToken,则应分别保存数据
- 然后,下载SimplePush源代码 解开后,修改simplepush.php中的以下几个地方:
// Put your device token here (without spaces): $deviceToken ='0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';// Put your private key's passphrase here: $passphrase ='pushchat';// Put your alert message here: $message ='My first push notification!';
复制设备识别ID到变量$deviceToken,别留下任何一个空格,完完全全就是64个16进制字符;指定私钥的口令和要发送的信息内容;复制ck.pem到脚本所在文件夹,ck.pem包括了证书和私钥。
开启终端程序( Terminal):
$ php simplepush.php
如果一切OK的话,脚本将返回:
Connected to APNS Message successfully delivered
几秒钟内,你应该可以在设备上收到推送的信息了。