• android推送-PHP(第三方推送:个推)


    在项目初期,就安卓推送功能怎么做,曾经参考过例如XMPP之类的推送方法。但苦于那些是些英文档案,又没太多时间研究,所以打算采用第三方推送(个推,极光推送等),后来在美图技术老大推荐下用采用个推。
    PS:网传个推的采用者有如(新浪微博、百度、网龙、去哪儿等)。

    该android的PHP推送采用的思维逻辑跟 ios+php 推送同理,为APP推送架设的android_push.php部分

    在linux的 crontab 定时计划里 加入

    1
    * * * * * /usr/local/php/bin/php /www/push/getui/android_push.php app1_android 100

    第一个参数 app1_ios
    标识app1应用,memcacheq队列里面等待推送的android队列名也是app1_android 在app推送架设里就是android_go所代表的那些中的一个队列
    第二个参数 100
    运行一次往个推服务器发送要推送的消息数。

    android_push.php (该文件在个推的php demo上进行适当修改)

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    #!/usr/local/php/bin/php
    <?php
    date_default_timezone_set('Asia/Shanghai');
    set_time_limit(0);
    /**
     * 推送器安卓个推模块
     * @param string $argv[1] memcacheq 键值
     */
    require_once(dirname(__FILE__). '/' . 'IGt.Push.php');
     
    $mem_key = $argv[1];
    $key_count = $argv[2];
     
    if(empty($mem_key))
    {
        exit('first parameter is a must');
    }
    if(empty($key_count))
    {
        exit('second parameter is a must');
    }
    if($key_count>2000||$key_count<1){
        exit('error second parameter');
    }
     
    //该配置信息为注册个推时所给的app唯一标识信息
    $app_config_arr=array(
        'app1_push_android' => array(
            'APPKEY' => 'xxxxxooooooddddddd',
            'APPID' => 'xxxxxooooooddddddd',
            'MASTERSECRET' => 'xxxxxooooooddddddd',
        ),
    );
     
    $app_config=$app_config_arr[$mem_key];
    if(empty($app_config))
    {
        exit('error app push name');
    }
     
    //开始推送
    run($app_config, $mem_key, $key_count);
     
    //用while死循环,来提高推送频率,间隔5秒。(可根据实际情况而定)
    //createPidFile和deletePidFile 用来确保同一时刻只存在一个进程在执行推送php
    function run($app_config,$mem_key,$key_count)
    {
        if (createPidFile(__DIR__.'/../logs/cron_'.$mem_key.'_android.pid'))
        {
            exit();
        }
        while (TRUE)
        {
            try
            {
                pushMessageToSingle($app_config,$mem_key,$key_count);
                sleep(5);
            }
            catch (Exception $e)
            {
                log_error($mem_key,date("[Y-m-d H:i:s] ", time()) . $e->getMessage() . " ");
                sleep(5);
            }
        }
        deletePidFile(__DIR__.'/../logs/cron_'.$mem_key.'_android.pid');
    }
     
    function pushMessageToSingle($app_config,$mem_key,$key_count){
         
        $igt = new IGeTui(HOST,$app_config['APPKEY'],$app_config['MASTERSECRET']);
        $time=time();
        //通用文字模板
        $template_base new IGtNotificationTemplate();
        $template_base->set_appId($app_config['APPID']);//应用appid
        $template_base->set_appkey($app_config['APPKEY']);//应用appkey
        $template_base->set_title("测试应用");//通知栏标题
        $template_base->set_transmissionType(1);//透传消息类型,打开应用
        $template_base->set_logo("logo.png");//通知栏logo
        $template_base->set_isRing(false);//是否响铃
        $template_base->set_isVibrate(false);//是否震动
        $template_base->set_isClearable(true);//通知栏是否可清除
         
         
        //通用带连接模板
        $template_url new IGtLinkTemplate();
        $template_url->set_appId($app_config['APPID']);//应用appid
        $template_url->set_appkey($app_config['APPKEY']);//应用appkey
        $template_url->set_title("测试应用");//通知栏标题
        $template_url->set_logo("logo.png");//通知栏logo
        $template_url->set_isRing(false);//是否响铃
        $template_url->set_isVibrate(false);//是否震动
        $template_url->set_isClearable(true);//通知栏是否可清除
         
        //个推信息体
        $message = new IGtSingleMessage();
        $message->set_isOffline(true);//是否离线
        $message->set_offlineExpireTime(3600*24);//离线时间
         
        //接收方
        $target = new IGtTarget();
        $target->set_appId($app_config['APPID']);
    //开始连接推送memcacheq队列
        $m = new memcache();
        $m->connect('127.0.0.1',22201);
        for($i=0;$i<$key_count;$i++)
        {
            $push_body=$m->get($mem_key);
    //从推送队列取出的推送体push_body,详见底部PS:1
            if(empty($push_body))
            {
                break;
            }
            else if(is_string($push_body))
            {
                $push_body=unserialize($push_body); //居然要反序列--
            }
            if($push_body['push_type']==1)  //文字推送 
            {
                $template_base->set_text($push_body['content']);//通知栏内容
                $message->set_data($template_base);//设置推送消息类型
            }
            else    //带连接推送
            {
                $template_url->set_text($push_body['content']);//通知栏内容
                $template_url->set_url($push_body['msg_link']);//打开连接地址
                $message->set_data($template_url);//设置推送消息类型
            }
            $target->set_clientId($push_body['device_code']);
            $rep = $igt->pushMessageToSingle($message,$target);
            if($rep["result"]!='ok')
            {
                log_pushed($push_body,$mem_key,$rep["result"]);
            }
            $push_body['push_time']=$time;
    //每个完成推送的消息将附上时间,然后存储进推送完毕队列
            $m->set($mem_key.'_end',$push_body);
        }
    }
    //传输错误日志
    function log_pushed($push_body,$mem_key,$result)
    {
        $file = __DIR__.'/../logs/'.$mem_key.'_error_' . date("Y-m-d") . '.log';
        $str='[ '. date('Y-m-d H:i:s',time()) .' ] [ device_id - '.$push_body['id'].' ] [ '.$push_body['content'].' ] [ result :'.$result." ] ";
        error_log($str, 3, $file);
    }
    //定时错误日志
    function log_error($mem_key,$msg)
    {
        $file = __DIR__.'/../logs/'.$mem_key.'_error_' . date("Y-m-d") . '.log';
        error_log($msg, 3, $file);
    }
    //将当前php文件执行进程写进pid文件
    function createPidFile($pid_filename)
    {
        if (file_exists($pid_filename))
        {
            $old_pid = trim(file_get_contents($pid_filename));
            if (file_exists('/proc/' . $old_pid . '/cmdline'))
            {
                return TRUE;
            }
        }
        $pid = posix_getpid();
        $pid = strval($pid);
        file_put_contents($pid_filename, $pid);
        return FALSE;
    }
    //删除pid文件
    function deletePidFile($pid_filename)
    {
        @unlink($pid_filename);
    }
    ?>

    PS:
    1、从推送队列取出的推送体push_body
    可能直接是个数组,也可能个字符串。这取决于你存入memecacheq时所处的位置。
    (1)若是本台服务器代码组装push_body存入本身的memcacheq,那么取出时将直接是个数组。
    (2)若是跨服务器的传输memcacheq,那么取出是将是个数组字符串化,需要unserialize。

    2、个推demo
    (下载地址:http://www.igetui.com/download/android/SDK_OPEN.zip
    客户端包含:
    • 文档(手把手教你在Android上嵌入SDK)
    • 需导入的资源(包含GexinSdk.jar包,您的应用需导入该jar库用于和SDK通信)
    • 演示工程源码
    • 真机测试包
    服务端包含:
    • 文档(服务端API文档,详细指导如何调用接口)
    • 需导入的资源
    • php演示工程

  • 相关阅读:
    C++学习笔记27,虚函数作品
    HDU
    POJ 2524 Ubiquitous Religions
    HDU-3839-Ancient Messages(DFS)
    thinkphp 删除所有缓存 Rumtime 以及 Html 静态缓存
    [AngularJS] Design Pattern: Simple Mediator
    [Javascript] Add a browser build to an npm module
    [Angular 2] ngrx/store
    [Typescript] Introduction to Generics in Typescript
    [AngularJS] angular-md-table for Angular material design
  • 原文地址:https://www.cnblogs.com/try-better-tomorrow/p/5337454.html
Copyright © 2020-2023  润新知