作者:黄志成(小黄)作者博客:博客地址新版本推送的要求变复杂了。它需要连接到专业的推送。之前一直基于APP,目前市面上主流的推送平台有极光、友盟、信鸽等,经过调研,最终选择了极光推送平台。什么是推送平台?下面是我们业务服务器请求极光的例子。平台提供的接口。请求他们,然后极光平台会将信息推送给我们的用户。一些新手朋友可能对一直提到的推送还一头雾水。什么是推??通常,在HTTP请求中,客户端向服务器请求,然后服务器响应数据。但在某些情况下,我们需要主动响应数据给客户端。主动响应数据的过程就是push。那么如何实现推送呢?简单来说,就是建立一个长连接。通常的HTTP是短连接,响应数据后就会关闭。但是长连接是一直连接的。既然一直连接着,我们就可以找到这个连接,然后主动给他推送消息。好的。回到主题。接下来我们继续说说如何接入极光推送。先了解几个概念。RegistrationID客户端初始化极光推送成功后,极光推送服务器会为设备分配一个注册ID。(同一手机不同APP的注册ID不同)。开发人员可以通过指定特定的注册ID推送到单个设备。别名每个用户只能指定一个别名。建议在同一应用程序中为不同的用户使用不同的别名。这样,只要有可能,用户就可以通过他们的别名来唯一标识。标签用于标记已安装该应用程序的用户。主要目的是方便开发者根据标签批量发送Push消息。每个用户可以使用多个标签。让我们通过一张图来理解其中的关系。首先,注册ID是唯一的。我们可以给这个Id设置一个别名,也就是一个注解。该别名可以设置为与我们平台上的用户账户相同。这样方便我们Push。当然,一个一个推是很麻烦的。我们可以标记这些用户。例如,北京用户被放置在BeijingTag标签下。单个用户放置在单个Tag标签下。我们使用Tag来推送,就可以达到群发的效果。理解了概念之后,我们应该清楚了,这个时候,我们需要将JPush注册用户和开发者App用户进行绑定。这种绑定有两种基本思路:将绑定关系保存到极光推送服务器,将绑定关系保存到开发者的应用服务器。首先是前面提到的别名和标签。别名由客户端设置。客户端开发者会调用setAlias或setTagsAPI设置关系SDK,并将关系设置保存到JPushServer。在服务器端推送消息时,指定之前设置的别名或标签进行推送。第二第一个相对麻烦。客户端会将RegistrationID传递给服务端,然后由服务端处理对应关系。我们这里使用第一种,通过客户端设置别名或标题。JPush提供四种消息形式:通知、自定义消息、富媒体和本地通知。这里主要介绍通知消息。只要理解了第一种,其他的看文档就很容易理解了。Notification或PushNotification是指会显示在手机通知栏(状态栏)上的通知信息。Notifications主要用于提醒用户,应用于新闻内容、促销活动、产品信息、版本更新提醒、订单状态提醒等各种场景。这里先附上官网文档地址,以及描述的内容下面是基于这个文档The.Documentaddress:JPush还是需要先了解几个概念。platform:推送平台JPush目前支持Android、iOS、WindowsPhone三种平台的推送。关键字是:“android”、“ios”、“winphone”。如果目标平台是iOS平台,需要通过options中的apns_production字段设置推送环境。True表示推送生产环境,False表示推送开发环境;如果不指定,将生产环境推送到所有平台:{"platform":"all"}指定具体的推送平台:{"platform":["android","ios"]}通常指定android和ios。如果产品有winphone版本,也可以选择推送到所有平台。这里没有问题。Audience:pushtarget推送设备对象,表示一个推送可以推送到的设备列表。极光推送提供了多种方式确认推送设备对象,例如:别名、标签、注册ID、分组、广播等。具体参数请参考这里的文档。我们在使用封装推送方式时,需要分别设置Android和ios的配置。我会在我的封装方法中说明。首先,集成sdk。通过Composer在项目中的composer.json文件中添加jpush依赖:"require":{"jpush/jpush":"^3.5"}执行$phpcomposer.pharinstall**或**$composerinstall进行安装。也可以直接下载。下载地址可以在文档中找到。安装composer后,可以直接通过命名空间引用。下面是我简单封装的一个push方法。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,])->发送();返回$结果;}catch(\Exception$e){//写入错误日志//这里根据自己的业务来决定}}}从代码中可以看出。我使用iosNotification和androidNotification方法Push两个设备的设置//ios通知配置项->iosNotification($content,//推送内容['sound'=>'1',//是否有声音'badge'=>(int)$ios_badge,//徽章显示个数'content-available'=>true,//去文档查看具体使用,一般设置为true或1'category'=>'jiguang',//这里也去文档里查一下Let'extras'=>$params,//extension字段根据自己的业务场景确定。])Androidpush也类似。更具体的配置项可以查看文档在开发的过程中,我们发现了一个坑。即我们的业务需求不要求Ios显示角标。根据文档,将徽章设置为0就足够了。但是我们设置之后还是没有效果。查看网页控制端的API调用记录时发现是否传递或显示徽章的参数。最后追查方法,发现是他们SDK的问题。该类的路径为/JPush/PushPayload.phpif(isset($notification['badge'])&&(int)$notification['badge']){$ios['badge']=$notification['badge'];}当pass为0时,不走这一步,那么默认就是if(!isset($ios['badge'])){$ios['badge']='+1';}太惨了,最后修改SDK解决了这个问题。当然这个问题在最新版本的SDK中已经被官方解决了。我的包是我直接用之前的另一个项目。最后调用了封装好的代码constPUSH_TYPE=['push_new_info'=>'1','push_visitor_alert'=>'2'];constAPP_NAME="****";公共静态函数pushNewInfoNotice($uids,$title,$url,$txt,$type='1'){$ext=['push_type'=>strval(self::PUSH_TYPE['push_new_info']),'info_type'=>strval($type),//1-information,2-item'title'=>empty($title)?self::APP_NAME:$title,'content'=>$txt,'redirect_url'=>$url];$res=JPush::pushMessageByAlias($title,$txt,$uids,$ext);返回$res;}我们只需要调用这个方法就可以实现推送了。$ext是我们和客户端定义的信息格式。它们会根据push_type执行不同的操作。最后一件事要补充。也就是我们用一个来开发和生产极光应用。所以你不能只在开发环境中发送广播消息。如何区分生产环境和开发环境?以下是官方的建议1、使用相同的Appkey和包名,推送时使用registrationID、tag、alias2、如果一定要测试广播推送,那就在官网新建一个测试应用。Appkey和包名不同,专门用于测试。3.如果还是需要同包名测试广播推送,那就在官网创建极光账号,新建一个测试应用,同包名测试:32
