zoukankan      html  css  js  c++  java
  • 【PHP】iOS推送通知以及反馈服务

    近来项目是完成一个PHP的推送服务器,无论是PHP,APNs还是GCM基本上都是从零开始。

    写下一点见解,方便以后继续做代码的搬运工。

    因为对PHP跟iOS都不熟悉,可能有错漏。。。穷孩子没有用过iOS的东西。。。

    设备如果希望能够及时收到服务器的消息,大概有三种方式:

    1)轮询(Pull)方式:客户端与服务器主动连接查询。因为及时性以及耗电量等要求不可得兼,一般不考虑。

    2)SMS(Push)方式:在Android平台,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。但是这个方案的成本相对较高,需向移动公司缴纳费用

    3)持久连接(Push)方式:在Android上有GCM,设置可以跑自己的后台程序链接自己的服务器。在iOS上就限定了只能使用苹果自身的APNs(Apple Push Notification Service)

    【PHP实现APNs的推送通知】

    准备好pem文件之后,php方面发送推送通知的代码如下:

    private static function pushIOS($deviceToken='',$message=''){
    
            $body = array("aps" => array("alert" => $message,"badge" => 2,"sound"=>'default'));  //推送方式,包含内容和声音
    
            $ctx = stream_context_create();
            //如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:
            $pem = dirname(__FILE__) . '/' . 'apns-dev.pem';
            stream_context_set_option($ctx,"ssl","local_cert",$pem);
            //linux 的服务器直接写pem的路径即可
            //stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");
            $pass = "1234";
            stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
            //must select between two servers:if for testing,select sandbox server and Dev pem file ; if for relese,use Product pem and server
            //$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
            $fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
            if (!$fp) 
            {
                echo "Failed to connect $err $errstrn";
                return;
            }
            print "Connection OK
    ";
            $payload = json_encode($body);
            $msg = chr(0) . pack("n",32) . pack("H*", str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
            echo "sending message :" . $payload ."
    ";
            fwrite($fp, $msg);
            fclose($fp);
        }

    【PHP实现APNs的Feedback Service】

    function send_feedback_request() {
        //connect to the APNS feedback servers
        //make sure you're using the right dev/production server & cert combo!
        $stream_context = stream_context_create();
        stream_context_set_option($stream_context, 'ssl', 'local_cert', '/path/to/my/cert.pem');
        $pass = "1234";
        stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
        
        $apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);//如果是开发中的话,地址应该是:feedback.sandbox.push.apple.com:2196
        if(!$apns) {
            echo "ERROR $errcode: $errstr
    ";
            return;
        }
    
    
        $feedback_tokens = array();
        //and read the data on the connection:
        while(!feof($apns)) {
            $data = fread($apns, 38);
            if(strlen($data)) {
                $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
            }
        }
        fclose($apns);
        return $feedback_tokens;
    }

    顺利的话,这个方法的返回值应该是如下形式:

    Array
    (
        Array
        (
            [timestamp] => 1266604759
            [length] => 32
            [devtoken] => abc1234..............etcetc
        ),
        Array
        (
            [timestamp] => 1266604922
            [length] => 32
            [devtoken] => def56789..............etcetc
        ),
    )

    苹果的尿性,一点都不人性化。Google的GCM每次推送过去都会返回每条消息的发送结果,如果设备已经卸载了应用导致id不再可用也马上可以看到,群发消息也支持一千条一千条地发送。

    苹果的只能一条条发送,并且调用这个不知所谓的反馈服务。

    果粉看到这里可以能骂人,不过我是果黑,不管。

  • 相关阅读:
    牛客练习赛64 C 序列卷积之和 (推式子 数学)
    HDU 汉诺塔系列
    牛客挑战赛40 A-小V和方程 (思维、数学、整数拆分、dp)
    HDU 2048 2049 (错位排列)
    组合数奇偶性判断
    bzoj 1249: SGU277 HERO
    CF70D Professor's task
    P3829 [SHOI2012]信用卡凸包
    CF316E3 Summer Homework
    P5284 [十二省联考2019]字符串问题
  • 原文地址:https://www.cnblogs.com/AlvinLiang/p/3939950.html
Copyright © 2011-2022 走看看