资讯专栏INFORMATION COLUMN

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

kamushin233 / 1901人阅读

摘要:开发者可以通过指定具体的来进行对单一设备的推送。同一个应用程序内,对不同的用户,建议取不同的别名。其关键字分别为。确认推送设备对象,提供了多种方式,比如别名标签注册分群广播等。

作者:黄志成(小黄)

作者博客:博客地址

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

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

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

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

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

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

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

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

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

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

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

先了解几个概念

Registration ID

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

别名

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

标签

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

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

首先 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"
}

执行 $ php composer.phar install** 或 **$ composer install 进行安装。

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

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

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

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, // 扩展字段 根据自己业务场景来定.
    ])

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

在开发的过程中发现了一个坑.就是我们的业务需求不需要Ios显示角标,根据文档所述,设置badge为0就可以了.但是我们设置后还是没效果.查看网页控制端的API调用记录时,发现传递还是显示角标的参数.

最后跟踪方法,发现是他们SDK的问题.类的路径是 /JPush/PushPayload.php

if (isset($notification["badge"]) && (int)$notification["badge"]) {
    $ios["badge"] = $notification["badge"];
}

当传递为0的时候就不走这一步,然后默认就是

if (!isset($ios["badge"])) {
    $ios["badge"] = "+1";
}

太坑了,最后修改SDK解决了这个问题.当然在最新版的SDK中官方已经解决了这个问题.我这个包是之前别的项目里的.我直接拿来用的.

最后就调用封装的代码

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29359.html

相关文章

发表评论

0条评论

kamushin233

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<