给APP接入极光推送:后端(PHP)

栏目: PHP · 发布时间: 6年前

内容简介:作者:黄志成(小黄)作者博客:博客地址新版本推送的需求变的更加复杂.需要接入一个专业的推送了.之前一直基于APP的IM来实现的.

作者:黄志成(小黄)

作者博客:博客地址

新版本推送的需求变的更加复杂.需要接入一个专业的推送了.之前一直基于APP的IM来实现的.

目前市面上主流的推送平台有 极光、友盟、信鸽等等..

通过调研最后选择了 极光推送平台

什么是推送平台呢?下面通过一张图来举例

给APP接入极光推送:后端(PHP)

我们业务服务器请求极光平台提供的接口.请求他们,然后由极光平台将信息推送给我们的用户.

一直提到的 推送 ,可能有些新手朋友还是很懵.什么是推送??

通常HTTP请求中,都是由客户端向服务端请求,然后服务器响应数据.可是有些情况下,需要我们主动向客户端响应数据.

而这个主动响应数据的过程就是推送.

那么是如何实现推送的呢?

简单点说就是建立一条长连接.平常的HTTP都是短连接,响应完数据后就会被关闭.而长连接却一直连接着.既然是一直连接着的,我们就可以找到这条连接,然后主动给他推送消息.

好了.回到正题.下面我们来继续说如何接入极光推送.

先了解几个概念

  • Registration ID

客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 APP 的 Registration ID 是不同的)。开发者可以通过指定具体的 Registration ID 来进行对单一设备的推送。

  • 别名

每个用户只能指定一个别名。 同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。

  • 标签

为安装了应用程序的用户打上标签,其目的主要是方便开发者根据标签,来批量下发 Push 消息。 可为每个用户打多个标签。

咱们在通过一张图来理解之间的关系

给APP接入极光推送:后端(PHP)

首先 Registration ID 是唯一的.我们可以给这个Id设置一个别名,也就是一个备注.这个别名可以设置成与我们平台的用户账号相同.这样可以方便我们推送.

当然逐个推送是很麻烦的.我们可以给这些用户打一个 Tag 标签. 比如北京的用户放在北京的Tag标签下.单身的用户放在单身的Tag标签下.我们以Tag来推送,就能达到群发效果.

了解概念后.我们应该清楚这个时候需要把 JPush 注册用户与开发者App 用户绑定起来。

这个绑定有两个基本思路:

  • 把绑定关系保存到 JPush 服务器端

  • 把绑定关系保存到开发者应用服务器中

第一种就是之前说到的别名和标签。由客户端来设置别名.

客户端开发者会调用 setAlias或者setTags API 来设置关系

SDK 把该关系设置保存到 JPush Server 上

在服务器端推送消息时,指定向之前设置过的别名或者标签推送.

第二种就相对麻烦一些.由客户端将 Registration ID 传递给服务端,然后由服务端来处理对应关系.

我们这里采用的是第一种,通过客户端来设置别名或者标题.

JPush提供四种消息形式:通知,自定义消息,富媒体和本地通知。

这里我们主要介绍通知消息.只要理解了第一种,其他在文档中看看就能很轻松理解.

  • 通知

或者说 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息。 通知主要用于提示用户的目的,应用于新闻内容、促销活动、产品信息、版本更新提醒、订单状态提醒等多种场景

这里先附上官网文档的地址,下面所说的内容都是基于这个文档的.

文档地址:极光推送

还是先了解几个概念

  • platform:推送平台

JPush 当前支持 Android, iOS, Windows Phone 三个平台的推送。其关键字分别为:"android", "ios", "winphone"。

如果目标平台为 iOS 平台 需要在 options 中通过 apns_production 字段来设定推送环境。True 表示推送生产环境,False 表示要推送开发环境; 如果不指定则为推送生产环境

推送到所有平台:

{ "platform" : "all" }
复制代码

指定特定推送平台:

{ "platform" : ["android", "ios"] }
复制代码

通常情况下指定 android 和 ios 就可以了。如果产品有winphone版本的也可以选择推送到所有平台,这里没有什么太多问题.

  • audience:推送目标

推送设备对象,表示一条推送可以被推送到哪些设备列表。确认推送设备对象,JPush 提供了多种方式,比如:别名、标签、注册ID、分群、广播等。

这里具体的参数就请看文档吧.

我们在封装推送方法的使用,需要对Android 和 ios 的配置进行分别设置.下面我会在我封装的方法里进行说明.

首先先去集成sdk.通过Composer就可以了

在项目中的 composer.json 文件中添加 jpush 依赖:

"require": {
    "jpush/jpush": "^3.5"
}
复制代码

执行 composer install 进行安装。

也可以直接下载.下载地址去文档中找吧~

composer 安装完后 就可以通过命名空间直接引用了.

下面是我简单封装的一个推送方法.

<?php
/**
 * Created by PhpStorm.
 * User: huangzhicheng
 * Date: 2018/8/28
 * Time: 下午3:12
 */

namespace data\tools;

use data\tools\config\Output;
use JPush\Client as Client;

class JPush
{
    /**
     * 通过别名发送极光推送消息
     * @param $title // 标题
     * @param $content // 内容
     * @param $alias // 别名
     * @param array $params // 扩展字段
     * @param string $ios_badge // ios 角标数
     * @param array $platform // 推送设备
     * @return array|bool
     * @author huangzhicheng 2018年08月29日
     */
    public static function pushMessageByAlias ($title, $content, $alias, $params = [], $ios_badge = '0', $platform = ['ios', 'android'])
    {

        if (!is_array ($alias)) return false;
        $jpush_conf = Output::getJPushKey (); // 获取配置信息 app_key 和 master_secret

        $app_key = $jpush_conf[ 'app_key' ];
        $master_secret = $jpush_conf[ 'master_secret' ];
        try {
            // 初始化
            $client = new Client($app_key, $master_secret);

            $result = $client->push ()
                ->setPlatform ($platform)
                ->addAlias ($alias)
                ->iosNotification (
                    $content, [
                    'sound' => '1',
                    'badge' => (int)$ios_badge,
                    'content-available' => true,
                    'category' => 'jiguang',
                    'extras' => $params,
                ])
                ->androidNotification ($content, [
                    'title' => $title,
                    //'build_id' => 2,
                    'extras' => $params,
                ])
                ->options ([
                    'sendno' => 100,
                    'time_to_live' => 86400,
                    'apns_production' => true, // ios推送证书的选择,True 表示推送生产环境,False 表示要推送开发环境
                    //'big_push_duration' => 10,
                ])
                ->send ();
            return $result;
        } catch (\Exception $e) {
            // 写入错误日志
            // 这里根据自己的业务来定
        }
    }
}
复制代码

可以根据代码看出来.我使用 iosNotificationandroidNotification 方法进行两个设备的推送设置.

// Ios的通知配置项
->iosNotification (
    $content, // 推送的内容
    [
        'sound' => '1', // 是否有声音
        'badge' => (int)$ios_badge, // 显示的角标数
        'content-available' => true, // 去文档中查看具体用处,一般设置为true或者1
        'category' => 'jiguang', // 这里也去文档中查看吧
        'extras' => $params, // 扩展字段 根据自己业务场景来定.
    ])
复制代码

安卓的推送也是类似的.更多具体的配置项去文档中查看。

最后就调用封装的代码

const PUSH_TYPE = [
        'push_new_info' => '1',
        'push_visitor_alert' => '2'

    ];

const APP_NAME = "****";
    
public static function pushNewInfoNotice ($uids, $title, $url, $txt, $type = '1')
{

    $ext = [
        'push_type' => strval (self::PUSH_TYPE[ 'push_new_info' ]),
        'info_type' => strval ($type),//1-资讯,2-项目
        'title' => empty($title) ? self::APP_NAME : $title,
        'content' => $txt,
        'redirect_url' => $url
    ];

    $res = JPush::pushMessageByAlias ($title, $txt, $uids, $ext);
    return $res;
}
复制代码

我们只要调用这个方法就能实现推送了.

$ext 就是我们与客户端定义的信息格式.他们会根据push_type来执行不同操作.

最后再补充一点.就是我们开发和生产使用的是一个极光应用.所以不能随便发送广播消息在开发环境中.

那如何区分生产环境和开发环境呢?

下面是官方给出的建议

1.使用相同的 Appkey 和 包名,推送时使用 registrationID、tag、alias 针对性的对测试机进行推送测试

2.如果你一定要测试广播推送,那么在官网新建一个测试应用,Appkey 和包名不一样,专门用作测试

3.如果你还需要包名一样并测试广播推送,那么在官网新建一个极光账号,新建一个测试应用,配相同的包名进行测试。

这篇文章就记录到这,以后有想补充的在更新了.

完成于:2018年09月01日00:22:32


以上所述就是小编给大家介绍的《给APP接入极光推送:后端(PHP)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Think Python

Think Python

Allen B. Downey / O'Reilly Media / 2012-8-23 / GBP 29.99

Think Python is an introduction to Python programming for students with no programming experience. It starts with the most basic concepts of programming, and is carefully designed to define all terms ......一起来看看 《Think Python》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器