IOS推送通知实现步骤

名词解释

APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的推送服务器;
Device 安装带有推送服务程序的iPhone手机;
Provider 程序服务器,把需要推送的信息发给 APNS;
DeviceToken  
在Device第一次连接APNS时,由APNS生成的经过加密的连接认证信息。在以后的连接中,无论时Provider到APNS还是APNS到Device 都需要 DeviceToken作为认证。
Payload  需要推送的消息的主体内容。alert-alert消息的消息体,按键标题等badge-显示在程序icon右上角的数字,sound-声音提示文件的文件名,该声音资源文件要在程序包中。

Push的原理

Push 的工作机制可以简单的概括为下图


图中,Provider是一般指某个ios软件的服务器。 

上图可以分为三个阶段。

第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。


整体流程

1.Device --> 连接-->  APNS  获取 DeviceToken 
2. Device -->连接-->  Provider 提供DeviceToken 


3. Provider侦测需要push的消息生成Notification信息


4. Provider侦把要push的消息推送到APNS
5. APNS把该消息推送到手机


具体实现

一、获取推送服务认证书

认证书 是用于服务器与APNS服务器SSL 连接时的认证,而获取p12的前提是获取APNS Assistant。

1. 在apple开发中心生成  App ID(如PushDemo),注意:Bundle Indentifier值格式必须为反向域名格式,如com.bluestar.PushDemo;
2. 单击App ID 的后面的 
Configure; 

3. 在新的页面中,勾选Enable Push Notification Services , 而后点击Configure ,随后出现APNs Assistant,APNs助手会引导生成你的程序与APNs服务器进行SSL连接的认证书App ID specific Client SSL certificate[注释:一般文件名为“aps_developer_identity.cer” 可修改]
4. APNs助手会引导你保存SSL certificate到你的硬盘,保存好后双击,安装到你的keychain;
5. 执行完以上四步,可以点击Done,关闭APNs助手;
6. 启动Keychain Access程序,查看刚才安装的认证,name 为apple Development/Production  push Services。。。 
导出--即获得Certificates.p12 保存好给Provider 服务器使用;

二、IOS应用程序开启推送服务

1. iPhone provisioning  以开启了PUSH功能App ID (如前述PushDemo)生成相应的provisioning,并下载;

2. 以前述App ID(PushDemo),创建应用程序,并指定Bundle Indentifier为注册时使用的Bundle Indentifier (本例为com.bluestar.PushDemo);

3. iPhone需要用到的方法函数如下:

//注册启用 push
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge /*|UIRemoteNotificationTypeSound*/)];

//用该判断 程序是不是通过push消息启动的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

//iPhone 从APNs服务器获取
deviceToken后激活该方法
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

//注册push功能失败 后 返回错误信息,执行相应的处理
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err


附录:使用OpenSSL转换证书格式

1. 将aps_developer_identity.cer转换成 aps_developer_identity.pem格式。

openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM

2. 将Certificates.p12格式的私钥转换成pem,需要设置4次密码,密码都设置为:abc123。

openssl pkcs12 -nocerts -out aps_developer_key.pem -in Certificates.p12

3. 用certificate和the key 创建PKCS#12格式的文件。

openssl pkcs12 -export -in aps_developer_identity.pem -inkeyaps_developer_key.pem -certfile PushTest.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12

 

 

步骤一、

创建需要的证书 & 使用PHP编写服务器端推送代码

1. 登录 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action ) 然后点击 App IDs
2. 创建一个 Apple ID ,如: com.tadpole.TestAPNs  注意:通配符 ID 不能用于推送通知服务。
3. 点击Apple ID旁的“Configure”,根据“向导” 的步骤生成一个签名上传,然后下载生成的许可证。
4. 双击.cer文件将你的 aps_development.cer 导入Keychain中。
5. 在Mac上打开“钥匙串访问”,然后在“登录”中选择 "密钥"分类,找到我们创建的证书,然后右击“Apple Development IOS Push Services: com.tadpole.TestAPNs” > 导出 “Apple Development IOS Push Services: com.tadpole.TestAPNs”。保存为 cert.p12 文件。
6. 通过终端命令将这个cert.p12文件转换为PEM格式,打开终端,cd  进入证书所在目录,执行如下命令:

$ openssl pkcs12 -in cert.p12 -out apple_push_notification_production.pem -nodes -clcerts

执行完上面命令会在当前目录下生成一个名为apple_push_notification_production.pem文件,这个文件就是我们需要得到php连接APNS 的文件,将apple_push_notification_production.pem和push.php放入同一目录上传到服务器,push.php的代码如下:

 

<?php 

// 这里是我们上面得到的deviceToken,直接复制过来(记得去掉空格)

$deviceToken = '740f4707bebcf74f 9b7c25d4 8e3358945f6aa01da5ddb387462c7eaf 61bb78ad';

 

// Put your private key's passphrase here:

$passphrase = 'abc123456';

 

// Put your alert message here:

$message = 'My first push test!';

 

 

$ctx = stream_context_create();

stream_context_set_option($ctx, 'ssl''local_cert''apple_push_notification_production.pem');

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

 

// Open a connection to the APNS server

//这个为正是的发布地址

 //$fp = stream_socket_client(“ssl://gateway.push.apple.com:2195“, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);

//这个是沙盒测试地址,发布到appstore后记得修改哦

$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);

?>

 

步骤二

创建一个具备推送通知的应用

首先,我们需要先对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];

    returnYES;

}

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

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

    //注册成功,deviceToken保存到应用服务器数据库中,因为在写向ios推送信息的服务器端程序时要用到这个

}

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

    // 处理推送消息

    NSLog(@"userInfo == %@",userInfo);    

    NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];

    UIAlertView *createUserResponseAlert = [[UIAlertViewalloc] initWithTitle:@"提示" 

                                  message: message

                                  delegate:self 

                               cancelButtonTitle:@"取消" 

                               otherButtonTitles: @"确认",

                                          nil];

    [createUserResponseAlert show];

}

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

    NSLog(@"Regist fail%@",error); 

到这里一切顺利的话我们就可以在真机运行了,注册成功我们会得到iphone 的deviceToken,

 

步骤三、

接下来我们访问http://localhost/push/push.php

iphone就会接收到一条推送消息了,如果有问题的话就检查上面的操作步骤,特别是加红的部分

另外去除标记的方法为,在viewDidApper中加入

int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;

    if(badge > 0)

    {

        badge--;

        [UIApplication sharedApplication].applicationIconBadgeNumber = badge;

    }

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值