zoukankan      html  css  js  c++  java
  • 远程推送

    玩了一年的iPhone了各种App的远程通知接收了不少,每次接收到的时候,就在反思,这丫的怎么实现的! 

    由于工作方面一直没有接触的机会,所以只好自己主动去做做练习试试了.

    实践后发现,一系列的配置非常繁琐,当然咯,网上的教程已经一大堆了.

    在这里还是写一篇文章来记录一些自己容易忘记的细节,以备日后所需时能够有用武之地.

    依照自己的习惯,喜欢把参考过的教程列举出来,真的很感谢这些网上的牛人.

    1: ios本地通知和远程通知

    http://wangjun.easymorse.com/?p=1482

    2: 苹果远程通知服务申请激活例图 (外国佬写的.)

    http://mobiforge.com/developing/story/programming-apple-push-notification-services

    3:书籍参考:iPhone 开发秘籍 第16章 推送通知.

    好了,进入正文:

    首先是申请证书的网址

    https://developer.apple.com/ios/manage/overview/index.action

    登录成功以后,进入iOS 配置管理的 主页面.

    [转载]IOS开发之----远程推送通知

    第一步操作是去创建一个新的App IDs创建成功后,会需要提供安全证书来激动推送服务,如下图:

     

    [转载]IOS开发之----远程推送通知

     


    [转载]IOS开发之----远程推送通知

    [转载]IOS开发之----远程推送通知

    选择存储到磁盘以后,生成一个文件名称为(简称CSR): CertificateSigningRequest.certSigningRequest

    回到Apple页面 将这个提交并提示激动成功.

    激活成功后的App  IDs 提供下载开发版或是发布版的主动推送证书(aps_development.cer),如果需要做服务器方面的主动推送的话,就必须要下载这个文件来使用推送服务了.

    第二步要为App提供接受推送许可的证书,点击Provisioning进行设置,添加一个新的许可,选择刚刚新创建的App IDs. 再选择可以调试的iPhone 设备.

    最后,同样是下载下来: YsyPushMessageDemo.mobileprovision双击该证书,让其加载一次.

    接下来,进入iOS工程,选择使用该证书来调试.

    [转载]IOS开发之----远程推送通知

    红圈中,全部设置刚刚加载的许可证书.

    那么到这里,关于证书类的准备工作,已经全部准备就绪.

    在这里再此强调一次,每个文件的具体作用

    1: CertificateSigningRequest.certSigningRequest : 为生成App IDs 而用

    2: aps_development.cer 为开发主动推送服务而用到的证书

    3: YsyPushMessageDemo.mobileprovision 为App 接受推送通知的许可服务

    主动推送的Push 代码及使用,请参考一开始介绍的第一篇博客

    这里只附上下载地址: https://github.com/stefanhafeneger/PushMeBaby

    接下来,说说收到推送通知代码方面.

    1:申请本App需要接受来自服务商提供推送消息,


    1. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];  

    2:申请发出后,如果成功,委托会自动返回一个设备令牌(toKen),如果失败,将会进入另外一个失败的委托

    1. //远程通知注册成功委托  
    2. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  
    3. {  
    4.     NSLog(@"%@",deviceToken);  
    5.     self.viewController.toKenValueTextView.text = [NSString stringWithFormat:@"%@",deviceToken];  
    6.     self.viewController.pushStatusLabel.text = @"已经注册.";  
    7. }  
    8. //远程通知注册失败委托  
    9. -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error  
    10. {  
    11.     self.viewController.toKenValueTextView.text = [error description];  
    12. }  

    3:将设备令牌码提供给服务商,以供推送到具体的手机上面. 如果远程推送消息来了,用户点击了推送消息,或者应用已经处于打开状态,系统都会自动调用以下委托:

    1. //点击某条远程通知时调用的委托 如果界面处于打开状态,那么此委托会直接响应  
    2. -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  
    3. {  
    4.     NSLog(@"远程通知");  
    5.     [self PMD_uesPushMessage:userInfo];  
    6. }  

    4: 第三点里面的介绍的情况是应用程序已经处于运行状态,上面的委托才会被执行,如果应用程序处于未启用状态,此时又需要响应消息,那么需要以下委托处理.

    1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
    2. {  
    3.     //这里处理应用程序如果没有启动,但是是通过通知消息打开的,此时可以获取到消息.  
    4.     if (launchOptions != nil) {  
    5.         NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];  
    6.         [self PMD_uesPushMessage:userInfo];  
    7.     }  
    8.     return YES;  
    9. }  

    5:清空通知中心已有的推送消息,只需要将指定App 的 Badge 设置为 0即可


    1. [[UIApplication sharedApplication ] setApplicationIconBadgeNumber:0];  

    6:主动推送的字符串必须符合如下Json数组的格式,才能正确推送到手机当中.

        @"{

           //自定义参数

           "userinfo":

                  {

                     "name":"remote notice"

                  },

           //标准写法

           "aps":

                  {

                     "alert":

                               {

                                  "action-loc-key":"Open",//支持多语言

                                  "body":"messgae content"//消息正文

                               },

                     "badge":1,//为App 的icon  标记 具体数值

                     "sound":"default" //播放的音频文件,default 表示系统默认的选择列铃声

                 } 

         }";


    到这里就差不多结束了.

    php服务器推送消息

    1. <?php  
    2.   
    3. $deviceToken = '38c866dd bb323b39 ffa73487 5e157ee5 a85e0b7ce90d56e9 fe145bcc 6c2c594b'// masked for security reason  
    4. // Passphrase for the private key (ck.pem file)  
    5. // $pass = '';  
    6. // Get the parameters from http get or from command line  
    7. $message = $_GET['message'or $message = $argv[1] or $message = 'Message received from javacom';  
    8. $badge = (int)$_GET['badge'or $badge = (int)$argv[2];  
    9. $sound = $_GET['sound'or $sound = $argv[3];  
    10. // Construct the notification payload  
    11. $body = array();  
    12. $body['aps'] = array('alert' => $message);  
    13. if ($badge)  
    14. $body['aps']['badge'] = $badge;  
    15. if ($sound)  
    16. $body['aps']['sound'] = $sound;  
    17.   
    18.   
    19. $ctx = stream_context_create();  
    20. stream_context_set_option($ctx'ssl''local_cert''ck.pem');  
    21. // assume the private key passphase was removed.  
    22. // stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);  
    23. $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195'$err$errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
    24. if (!$fp) {  
    25. print "Failed to connect $err $errstrn";  
    26. return;  
    27. }  
    28. else {  
    29. print "Connection OKn";  
    30. }  
    31. $payload = json_encode($body);  
    32. $msg = chr(0) . pack("n",32) . pack('H*'str_replace(' '''$deviceToken)) . pack("n",strlen($payload)) . $payload;  
    33. print "sending message :" . $payload . "n";  
    34. fwrite($fp$msg);  
    35. fclose($fp);  
    36. ?>

     这个帖子写的也不错

    http://blog.csdn.net/bl1988530/article/details/6729369

    代码例子下载:

    http://ishare.iask.sina.com.cn/f/33789601.html



    客户端Apple Development IOS Push Services:XXXXXX证书安装成功以后,在系统的钥匙串中--》我的证书可以看到安装后的证书,选中导出,比如我们导出的名字为apns.p12.

    打开“终端”,进入桌面路径,运行如下命令:

    openssl pkcs12 -in apns.p12 -out apple_push_notification_production.pem -nodes -clcerts

    然后会提示输入密码,如果有密码输入即可,没有密码直接回车即可。

    然后会看到一条输出信息:

    MAC verified OK

    证明证书生成成功,这个就是服务器端用的证书了。

    以上是在php服务器测试环境测试。

    需要通过终端命令将这些文件转换为PEM格式:

    --发布

    openssl pkcs12 -clcerts -nokeys -out apns-pro-cert.pem -in apns-pro-cert.p12

    openssl pkcs12 -nocerts -out apns-pro-key.pem -in apns-pro-key.p12

    cat apns-pro-cert.pem apns-pro-key.pem > apns-pro.pem

    --开发

    openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12

    openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12

    cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem
    最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:

    cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

  • 相关阅读:
    ImportError: Matplotlib qt-based backends require an external PyQt4, PyQt5, PySide or PySide2 package to be installed, but it was not found.
    cannot load library 'libportaudio.so.2': libportaudio.so.2: cannot open shared object file: No such file or directory
    如何解决Linux系统下pyaudio安装缺少文件问题error: portaudio.h: 没有那个文件或目录
    完美解决 python ImportError: Failed to import any qt binding
    Linux傻瓜式四步完美安装Python3.7
    为什么诺贝尔奖得主很少有中国人?
    Web前端入门知识
    MySQL通用编程
    其实我想做个诗人
    八皇后问题Python实现
  • 原文地址:https://www.cnblogs.com/superchao8/p/2998453.html
Copyright © 2011-2022 走看看