iOS极光推送别名限制问题

iOS极光推送别名限制问题,第1张

我们的项目中集成了极光推送,将用户id设置为别名,方便服务端对某个用户发送自定义消息。前几天遇到了一个用户反应无法收到推送,经过调试发现在设置别名时返回了错误码6009,极光官网的说明如下:

然后设置为debug模式,依然不知道是什么原因。于是先想到的就是升级一下SDK。升到最新版340之后,错误码变成了6017。错误原因如下:

然后在极光官方文档上发现了这样一句话:

RegistrationID就算作一个设备,即使我们是同一个手机,在卸载重装之后如果RegistrationID发生变化,就会算作一个新的设备,当重复卸载重装就会出现别名绑定失败,导致接收不到推送。

什么情况下RegistrationID会发生变化

然后我就尝试卸载重装,发现RegistrationID并未发生变化,这就很奇怪了。又是一通查找,找到了 这篇文章

里面有提到极光内部的一些处理,极光会将数据保存到粘贴板,如果重装时发现粘贴板有数据,RegistrationID就跟上次一样,如果没有数据,就会生成新的RegistrationID。

然后尝试卸载APP后关机重启,再安装。RegistrationID果然发生了变化。

到现在知道了收不到推送的原因了,极光官方提倡我们去充钱,能将设备上限提升到100个。但是无法从根本上解决问题,所以继续寻找解决方案。

在极光服务端的API文档中找到了 这一部分

我们可以在客户端通过调用极光服务端的API,解除别名绑定的设备。

具体解决思路如下:

极光在2020/03/10对别名绑定的设备数做了限制,在之前接入极光SDK的APP,使用别名功能时应该都存在这个问题的隐患,在此记录一下。

不得不吐槽一下极光的文档,对于设备也就是RegistrationID是否发生变化说的并不准确,而且iOS的SDK里并未提供批量解除别名绑定的API。

至于这个API到底是由客户端去调用还是服务端去调用,就仁者见仁智者见智了。

应用场景:在我们的项目中我们用的是创建视频会议和预警消息通知推送这两种情况,首先创建视频会议和中途邀请人参加会议我采用的是自定义推送消息,因为此应用场景传递的参数比较多,在推送过去之后android和ios可以很方便的将参数传递过去,但是我们考虑到邀请的所有人都在登录状态的时候才可以创建会议房间,我们采用的是腾讯视频会议的sdk,因为我们采用的是别名推送,当用户在登录的时候安卓端将用户uuid设置为别名,退出时取消别名,我在服务端根据传递过来的uuid利用别名查询registration_ids的数组大小是否为空判断当前用户是否设置别名,当邀请的所有人都设置了别名之后我才调用创建会议房间的接口。而预警消息推送我采用的是通知推送,当气象预警触发的时候我会采用通知推送的方式推送给app,这种方式比较简单。

极光推送是给app推送消息的,我们首先需要在服务端集成maven依赖

<!-- 极光推送 -->

    <groupId>cnjpushapi

    <artifactId>jpush-client

    <version>323

</dependency>

接着我们需要了解极光推送有哪些推送方式,对于安卓和ios都适用的情况,我在项目中使用的是别名推送alias,(还有标签推送tag),推送方式又分为通知推送和自定义推送,通知推送能够显示在手机提示框中,而自定义推送却不能,我看安卓他们做的能跟微信视频一样的d出一个会话框,看着挺不错的,这跟微信不同的是可以邀请多个,之前用阿里云的好像只能一对一,所以才换成腾讯视频会议的,好了,废话不多说,上我写的一个工具类,

package comjpxxhomepagehomePageserviceutils;

import cnjpushapiJPushClient;

import cnjpushapipushPushResult;

import cnjpushapipushmodelOptions;

import cnjpushapipushmodelPlatform;

import cnjpushapipushmodelPushPayload;

import cnjpushapipushmodelaudienceAudience;

import cnjpushapipushmodelnotificationNotification;

import cnjpushapipushmodelMessage;

import cnjpushapipushmodelPushPayloadBuilder;

public class SendMessageUtils {

private static StringAppKey="8a7880c6fb81ad494b224078";

    /

    JPush MasterSecret 极光推送平台生成的密钥

    /

    private static StringMasterSecret="c0fc675c4c48f9bf35269cf4";

    //两个参数分别填写你申请的masterSecret和appKey

    private static JPushClientjPushClient=new JPushClient(MasterSecret,AppKey);

    /

    通知推送

    备注:推送方式不为空时,推送的值也不能为空;推送方式为空时,推送值不做要求

    @param type 推送方式:1、“tag”标签推送,2、“alias”别名推送

    @param value 推送的标签或别名值

    @param alert 推送的内容

    /

    public static StringpushNotice(String type,String title,String value,String alert,int roomId,String MessageType,String name,String promoterAdavter,String meetingTitle,String sig){

Builder builder= PushPayloadnewBuilder();

        buildersetPlatform(Platformall());//设置接受的平台,all为所有平台,包括安卓、ios、和微软的

        //设置如果用户不在线、离线消息保存的时间

        Options options=Optionssendno();

        optionssetTimeToLive(86400l);    //设置为86400为保存一天,如果不设置默认也是保存一天

        buildersetOptions(options);

        buildersetMessage(MessagenewBuilder()

setMsgContent(value)

setTitle(title)

addExtra("roomId",roomId)

addExtra("MessageType",MessageType)

addExtra("name",name)

addExtra("promoterAdavter",promoterAdavter)

addExtra("meetingTitle",meetingTitle)

addExtra("userSig",sig)

build());

        //设置推送方式

        if(typeequals("alias")){

buildersetAudience(Audiencealias(value));//根据别名推送

        }else if(typeequals("tag")){

buildersetAudience(Audiencetag(value));//根据标签推送

        }else{

buildersetAudience(Audienceall());//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到

        }

//设置为采用通知的方式发送消息

        buildersetNotification(Notificationalert(alert));

        PushPayload pushPayload=builderbuild();

        Systemoutprintln("ggggggg"+pushPayload);

        try{

//进行推送,实际推送就在这一步

            //Systemoutprintln("zzzzzzzzz "+jPushClientsendPush(pushPayload));

            PushResult pushResult=jPushClientsendPush(pushPayload);

            return "success";

        }catch(Exception e){

Systemoutprintln("异常 "+e);

            eprintStackTrace();

            return "fail";

        }

}

/

    自定义消息推送

    备注:推送方式不为空时,推送的值也不能为空;推送方式为空时,推送值不做要求

    @param type 推送方式:1、“tag”标签推送,2、“alias”别名推送

    @param value 推送的标签或别名值

    @param alert 推送的内容

    /

    public static StringpushMsg(String type,String title,String value,String alert,int roomId,String MessageType,String name,String promoterAdavter,String meetingTitle,String sig){

Builder builder= PushPayloadnewBuilder();

        buildersetPlatform(Platformall());//设置接受的平台

        if(typeequals("alias")){

buildersetAudience(Audiencealias(value));//别名推送

        }else if(typeequals("tag")){

buildersetAudience(Audiencetag(value));//标签推送

        }else{

buildersetAudience(Audienceall());//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到

        }

MessageBuilder newBuilder=MessagenewBuilder();

        newBuildersetMsgContent(alert);//消息内容

        newBuildersetTitle(title);

        newBuilderaddExtra("roomId",roomId);

        newBuilderaddExtra("MessageType",MessageType);

        newBuilderaddExtra("name",name);

        newBuilderaddExtra("promoterAdavter",promoterAdavter);

        newBuilderaddExtra("meetingTitle",meetingTitle);

        newBuilderaddExtra("userSig",sig);

        Message message=newBuilderbuild();

        buildersetMessage(message);

        PushPayload pushPayload=builderbuild();

        try{

PushResult pushResult=jPushClientsendPush(pushPayload);

            Systemoutprintln(pushResultisResultOK());

            return "success";

        }catch(Exception e){

eprintStackTrace();

            return "fail";

        }

}

public static void main(String[] args) {

//给标签为kefu的用户进行消息推送

        //SendMessageUtilspushMsg("alias","标题","5b9022746e284ea0992e3baa983035dc","你有新的任务,请及时处理",111,"meetingType","name","avater","meetingTitle","");

//sendNotificationWirhAlias_Ios("zzzzzzzzzzzz","uuid");

        //String result = SendMessageUtilspushNotice("alias","标题","5b9022746e284ea0992e3baa983035dc","你有新的任务,请及时处理",111,"meetingType","name","avater","meetingTitle","");

        //Systemoutprintln("返回结果"+result);

        /String result = SendMessageUtilspushNotice("alias","预警标题","5b9022746e284ea0992e3baa983035dc","dddd",0,"warnType","","","","");  //userDtogetUuId()

Systemoutprintln("result "+result);/

        //根据uuid查询别名信息是否存在

        String result = >

消息推送(Push)就是通过服务器把内容主动发送到客户端的过程。运营人员通过自己的产品或第三方工具对用户移动设备进行主动消息推送。完成推送后,消息通知会展示在移动设备的锁定屏幕及通知栏上,用户点击通知即可去往相应页面。

现在流行的消息推送实现方式,主要为长链接方式实现。其原理是客户端主动和服务器建立TCP长链接,长链接建立之后,客户端定期向服务器发送心跳包用于保持链接,当有消息要发送的时候,服务器可以直接通过这个已经建立好的长链接,将消息发送到客户端。

个推作为国内移动推送领域的早期进入者,于2010年推出个推消息推送SDK产品,十余年来持续为移动开发者提供稳定、高效、智能的消息推送服务,成功服务了人民日报、新华社、CCTV、新浪微博等在内的数十万APP客户。个推消息推送,也是运用长链接的方式实现消息推送的,其长链接稳定性高、存活好,消息送达率高。开发者通过集成个推消息推送SDK,即可简单、快捷地实现Android和iOS平台的消息推送功能,有效提高产品活跃度、增加用户留存。

如果您对个推消息推送感兴趣,欢迎前往个推开发者中心免费注册体验。

个推的合作客户

以上就是关于iOS极光推送别名限制问题全部的内容,包括:iOS极光推送别名限制问题、极光推送总结、如何实现消息推送功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9320636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存