做者:黄志成(小黄)php
做者博客:博客地址android
新版本推送的需求变的更加复杂.须要接入一个专业的推送了.以前一直基于APP的IM来实现的.ios
目前市面上主流的推送平台有 极光、友盟、信鸽等等..web
经过调研最后选择了 极光推送平台json
什么是推送平台呢?下面经过一张图来举例api
咱们业务服务器请求极光平台提供的接口.请求他们,而后由极光平台将信息推送给咱们的用户.bash
一直提到的推送,可能有些新手朋友仍是很懵.什么是推送??服务器
一般HTTP请求中,都是由客户端向服务端请求,而后服务器响应数据.但是有些状况下,须要咱们主动向客户端响应数据.app
而这个主动响应数据的过程就是推送.composer
那么是如何实现推送的呢?
简单点说就是创建一条长链接.日常的HTTP都是短链接,响应完数据后就会被关闭.而长链接却一直链接着.既然是一直链接着的,咱们就能够找到这条链接,而后主动给他推送消息.
好了.回到正题.下面咱们来继续说如何接入极光推送.
先了解几个概念
客户端初始化 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,即指在手机的通知栏(状态栏)上会显示的一条通知信息。 通知主要用于提示用户的目的,应用于新闻内容、促销活动、产品信息、版本更新提醒、订单状态提醒等多种场景
这里先附上官网文档的地址,下面所说的内容都是基于这个文档的.
文档地址:极光推送
仍是先了解几个概念
JPush 当前支持 Android, iOS, Windows Phone 三个平台的推送。其关键字分别为:"android", "ios", "winphone"。
若是目标平台为 iOS 平台 须要在 options 中经过 apns_production 字段来设定推送环境。True 表示推送生产环境,False 表示要推送开发环境; 若是不指定则为推送生产环境
推送到全部平台:
{ "platform" : "all" }
复制代码
指定特定推送平台:
{ "platform" : ["android", "ios"] }
复制代码
一般状况下指定 android 和 ios 就能够了。若是产品有winphone版本的也能够选择推送到全部平台,这里没有什么太多问题.
推送设备对象,表示一条推送能够被推送到哪些设备列表。确认推送设备对象,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) {
// 写入错误日志
// 这里根据本身的业务来定
}
}
}
复制代码
能够根据代码看出来.我使用 iosNotification 和 androidNotification 方法进行两个设备的推送设置.
// 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