SDK FAQ
最近更新:2022-03-14
展开全部

SDK FAQ

极光推送 Android SDK 是否会自动初始化服务进行数据采集?

  • 如果开发者使用的是 JCore Android SDK v2.3.0 及其以上版本,不会有自动初始化逻辑,更不会在服务未初始化之前进行数据采集;
  • 开发者如果主动调用了 SDK 的 init 方法 或者其它带 context 参数的方法,就会进行 SDK 初始化;
  • 考虑 APP 上线合规,开发者必须在 APP 用户同意了隐私政策后,再调用初始化接口使用极光服务;
  • 关于 APP 隐私政策建议和说明,具体可以参考 如何草拟合规的隐私政策

为什么应用程序无法收到 Push 消息(Android)?

  • 确认 appKey(在 Portal 上生成的)已经正确的写入 Androidmanifest.xml
  • 确认测试手机(或者模拟器)已成功连入网络
  • 确认有客户端 "Login succeed" 日志

日志:Java.lang.UnsatisfiedLinkError

E/art: No implementation found for int cn.jiguang.service.Protocol.GetSdkVersion() (tried Java_cn_jiguang_service_Protocol_GetSdkVersion and Java_cn_jiguang_service_Protocol_GetSdkVersion__) E/JIGUANG-JCore: [JCoreGlobal] Get sdk version fail![获取sdk版本失败!] W/System.err: java.lang.UnsatisfiedLinkError: No implementation found for int cn.jiguang.service.Protocol.GetSdkVersion() (tried Java_cn_jiguang_service_Protocol_GetSdkVersion and Java_cn_jiguang_service_Protocol_GetSdkVersion__) W/System.err: at cn.jiguang.service.Protocol.GetSdkVersion(Native Method) W/System.err: at cn.jiguang.d.a.a(Unknown Source) W/System.err: at cn.jiguang.d.a.d(Unknown Source) W/System.err: at cn.jiguang.d.a.b(Unknown Source) W/System.err: at cn.jiguang.api.JCoreInterface.init(Unknown Source) W/System.err: at cn.jiguang.d.d.j.b(Unknown Source) W/System.err: at cn.jiguang.api.JCoreInterface.triggerSceneCheck(Unknown Source) W/System.err: at cn.jiguang.a.a.d.a.onActivityStarted(Unknown Source) E/JIGUANG-JCore: [JCoreGlobal] JCore .so file do not match JCore .jar file in the project, Failed to init JCore W/JIGUANG-JCore: [JCoreInterface] JCore init failed
          E/art: No implementation found for int cn.jiguang.service.Protocol.GetSdkVersion() (tried Java_cn_jiguang_service_Protocol_GetSdkVersion and Java_cn_jiguang_service_Protocol_GetSdkVersion__)
E/JIGUANG-JCore: [JCoreGlobal] Get sdk version fail![获取sdk版本失败!]
W/System.err: java.lang.UnsatisfiedLinkError: No implementation found for int cn.jiguang.service.Protocol.GetSdkVersion() (tried Java_cn_jiguang_service_Protocol_GetSdkVersion and Java_cn_jiguang_service_Protocol_GetSdkVersion__)
W/System.err:     at cn.jiguang.service.Protocol.GetSdkVersion(Native Method)
W/System.err:     at cn.jiguang.d.a.a(Unknown Source)
W/System.err:     at cn.jiguang.d.a.d(Unknown Source)
W/System.err:     at cn.jiguang.d.a.b(Unknown Source)
W/System.err:     at cn.jiguang.api.JCoreInterface.init(Unknown Source)
W/System.err:     at cn.jiguang.d.d.j.b(Unknown Source)
W/System.err:     at cn.jiguang.api.JCoreInterface.triggerSceneCheck(Unknown Source)
W/System.err:     at cn.jiguang.a.a.d.a.onActivityStarted(Unknown Source)
E/JIGUANG-JCore: [JCoreGlobal] JCore .so file do not match JCore .jar file in the project, Failed to init JCore
W/JIGUANG-JCore: [JCoreInterface] JCore init failed

        
此代码块在浮窗中显示

此错误是由于没有正确的加载 libjcore.so 文件,请检查 libjcore.so 是否在正确的位置(libs–>armeabi–>libjcore.so)

JPush SDK 迁移到 Android Studio 需要添加 .so 文件打包到 APK 的 lib 文件夹中,可以编辑 build.gradle 脚本,自定义 *.so 目录,参考 Demo:

jpush_android_so

日志:The permission should be defined

E/JIGUANG-JCore: [AndroidUtil] The permissoin is required - com.jpush.test.permission.JPUSH_MESSAGE E/JIGUANG-JCore: [AndroidUtil] The permission should be defined - com.jpush.test.permission.JPUSH_MESSAGE W/JIGUANG-JCore: [JCoreInterface] JCore init failed
          E/JIGUANG-JCore: [AndroidUtil] The permissoin is required - com.jpush.test.permission.JPUSH_MESSAGE
E/JIGUANG-JCore: [AndroidUtil] The permission should be defined - com.jpush.test.permission.JPUSH_MESSAGE
W/JIGUANG-JCore: [JCoreInterface] JCore init failed

        
此代码块在浮窗中显示

此错误是没有正确的定义 permision,请添加权限:

<permission android:name="您应用的包名.permission.JPUSH_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" />
              <permission
        android:name="您应用的包名.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />
  
    <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" />

        
此代码块在浮窗中显示

如何在代码时混淆忽略 jpush-sdk-release.jar

  • 请下载 4.x 及以上版本的 proguard.jar, 并替换你 Android SDK "tools\proguard\lib\proguard.jar"

  • 开发工具使用 Eclipse 或者 Android Studio,请在工程的 project.properties 中配置好 proguard-android.txt,并且在 proguard-android.txt 配置:

    -dontoptimize -dontpreverify -dontwarn cn.jpush.** -keep class cn.jpush.** { *; }
                -dontoptimize
      -dontpreverify
    
      -dontwarn cn.jpush.**
      -keep class cn.jpush.** { *; }
    
            
    此代码块在浮窗中显示
  • 请使用 SDK1.3.X 及以后的版本

  • v2.0.5 及以上的版本由于引入了 protobuf ,在上面基础之上增加排出混淆的配置。

    #==================gson========================== -dontwarn com.google.** -keep class com.google.gson.** {*;} #==================protobuf====================== -dontwarn com.google.** -keep class com.google.protobuf.** {*;}
                #==================gson==========================
      -dontwarn com.google.**
      -keep class com.google.gson.** {*;}
    
      #==================protobuf======================
      -dontwarn com.google.**
      -keep class com.google.protobuf.** {*;}
    
            
    此代码块在浮窗中显示

推送成功了,为什么有部分客户端收不到推送?

请检查收不到通知的手机:

  • 请在 logcat 查看日志,确定客户端的 jpush 是否集成成功,网络是否有问题
  • 请看日志或使用接口 isPushStopped 来检查是否调用了 stoppush
  • 检查手机的 JPush 高级设置中是否设置了“允许推送时间”
  • 手机的应用中是否勾选了“显示通知”

第三方系统收不到推送的消息

由于第三方 ROM 的管理软件需要用户手动操作

  • 小米【 MIUI 】

    • 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启
    • 通知栏设置:应用默认都是显示通知栏通知,如果关闭,则收到通知也不会提示
    • 网络助手:可以手动禁止已安装的第三方程序访问 2G/3G 和 WIFI 的网络和设置以后新安装程序是否允许访问 2G/3G 和 WIFI 的网络
    • MIUI 7 神隐模式: 允许应用进行自定义配置模式,应用在后台保持联网可用,否则应用进入后台时,应用无法正常接收消息。【设置】下电量和性能中【神隐模式】
  • 华为【 Emotion 】

    • 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程不会开启,只能手动开启应用
    • 后台应用保护:需要手动把应用加到此列表,否则设备进入睡眠后会自动杀掉应用进程,只有手动开启应用才能恢复运行
    • 通知管理:应用状态有三种:提示、允许、禁止。禁止应用则通知栏不会有任何提醒
  • 魅族【 Flyme 】

    • 自启动管理:需要把应用加到【自启动管理】列表,否则杀进程或重新开机后进程无法开启
    • 通知栏推送:关闭应用通知则收到消息不会有任何展示
    • 省电管理: 安全中心里设置省电模式,在【待机耗电管理】中允许应用待机时,保持允许,否则手机休眠或者应用闲置一段时间,无法正常接收消息。
  • VIVO【 Funtouch OS 】

    • 内存一键清理:需要将应用加入【白名单】列表,否则系统自带的“一键加速”,会杀掉进程
    • 自启动管理:需要将应用加入 “i 管家”中的【自启动管理】列表,否则重启手机后进程不会自启。但强制手动杀进程,即使加了这个列表中,后续进程也无法自启动。
  • OPPO【 ColorOS 】

    • 冻结应用管理:需要将应用加入纯净后台,否则锁屏状态下无法及时收到消息
    • 自启动管理:将应用加入【自启动管理】列表的同时,还需要到设置-应用程序-正在运行里锁定应用进程,否则杀进程或者开机后进程不会开启,只能手动开启应用
  • 三星

    • 内存一键优化:需要将应用加入【白名单】列表,否则系统内存优化后,会杀掉应用进程

如何解决与其他第三方推送的 SDK 冲突?

该方法仅适用于手动集成的方式。

如果 App 还集成了其他第三方推送 SDK,如个推、友盟推送等,您需要进行以下步骤处理:

小米厂商通道:
可以将这个极光内置的Receiver,换成自己定义的Receiver。 这个Receiver必须继承小米的com.xiaomi.mipush.sdk.PushMessageReceiver 且在每个回调方法,都回调给极光的PluginXiaomiPlatformsReceiver。

public class XMPushReceiver extends PushMessageReceiver { final PluginXiaomiPlatformsReceiver receiver = new PluginXiaomiPlatformsReceiver(); @Override public void onReceivePassThroughMessage(final Context context, final MiPushMessage message) { receiver.onReceivePassThroughMessage(context, message); } @Override public void onNotificationMessageClicked(Context context, MiPushMessage message) { receiver.onNotificationMessageClicked(context, message); } @Override public void onNotificationMessageArrived(Context context, MiPushMessage message) { receiver.onNotificationMessageArrived(context, message); } @Override public void onCommandResult(Context context, MiPushCommandMessage message) { receiver.onCommandResult(context, message); } @Override public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) { receiver.onReceiveRegisterResult(context, message); } }
          public class XMPushReceiver extends PushMessageReceiver {

    final PluginXiaomiPlatformsReceiver receiver = new PluginXiaomiPlatformsReceiver();

    @Override
    public void onReceivePassThroughMessage(final Context context, final MiPushMessage message) {
        receiver.onReceivePassThroughMessage(context, message);
    }

    @Override
    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        receiver.onNotificationMessageClicked(context, message);
    }

    @Override
    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        receiver.onNotificationMessageArrived(context, message);
    }

    @Override
    public void onCommandResult(Context context, MiPushCommandMessage message) {
        receiver.onCommandResult(context, message);
    }

    @Override
    public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        receiver.onReceiveRegisterResult(context, message);
    }


}

        
此代码块在浮窗中显示

华为厂商通道:

1.创建 Service 继承华为的 com.huawei.hms.push.HmsMessageService。
2.在每个回调方法,都回调给极光的 PluginHuaweiPlatformsService。

public class MyHWPushService extends HmsMessageService { final PluginHuaweiPlatformsService service = new PluginHuaweiPlatformsService(); @Override public void onNewToken(String s) { service.onNewToken(s); } @Override public void onMessageReceived(RemoteMessage remoteMessage) { service.onMessageReceived(remoteMessage); } @Override public void onMessageSent(String s) { service.onMessageSent(s); } @Override public void onSendError(String s, Exception e) { service.onSendError(s,e); } @Override public void onDeletedMessages() { service.onDeletedMessages(); } }
          public class MyHWPushService extends HmsMessageService {

    final PluginHuaweiPlatformsService service = new PluginHuaweiPlatformsService();

    @Override
    public void onNewToken(String s) {
        service.onNewToken(s);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        service.onMessageReceived(remoteMessage);
    }

    @Override
    public void onMessageSent(String s) {
        service.onMessageSent(s);
    }

    @Override
    public void onSendError(String s, Exception e) {
        service.onSendError(s,e);
    }

    @Override
    public void onDeletedMessages() {
        service.onDeletedMessages();
    }
}

        
此代码块在浮窗中显示

魅族厂商通道:

1.创建 Receiver 必须继承魅族的 com.meizu.cloud.pushsdk.MzPushMessageReceiver.
2.每个回调方法都回调给极光的 PluginMeizuPlatformsReceiver。

public class MyMZPushReceiver extends MzPushMessageReceiver { final PluginMeizuPlatformsReceiver receiver = new PluginMeizuPlatformsReceiver(); @Override public void onReceive(Context context, Intent intent) { receiver.onReceive(context, intent); } @Override public void onRegister(Context context, String s) { receiver.onRegister(context, s); } @Override public void onMessage(Context context, String s) { receiver.onMessage(context, s); } @Override public void onNotificationArrived(Context context, MzPushMessage mzPushMessage) { receiver.onNotificationArrived(context, mzPushMessage); } @Override public void onNotificationClicked(Context context, MzPushMessage mzPushMessage) { receiver.onNotificationClicked(context, mzPushMessage); } @Override public void onUnRegister(Context context, boolean b) { receiver.onUnRegister(context, b); } @Override public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) { receiver.onPushStatus(context, pushSwitchStatus); } @Override public void onRegisterStatus(Context context, RegisterStatus registerStatus) { receiver.onRegisterStatus(context, registerStatus); } @Override public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) { receiver.onUnRegisterStatus(context, unRegisterStatus); } @Override public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) { receiver.onSubTagsStatus(context, subTagsStatus); } @Override public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) { receiver.onSubAliasStatus(context, subAliasStatus); } @Override public void onUpdateNotificationBuilder(PushNotificationBuilder pushNotificationBuilder) { receiver.onUpdateNotificationBuilder(pushNotificationBuilder); } }
          public class MyMZPushReceiver extends MzPushMessageReceiver {

    final PluginMeizuPlatformsReceiver receiver = new PluginMeizuPlatformsReceiver();

    @Override
    public void onReceive(Context context, Intent intent) {
        receiver.onReceive(context, intent);
    }

    @Override
    public void onRegister(Context context, String s) {
        receiver.onRegister(context, s);
    }

    @Override
    public void onMessage(Context context, String s) {
        receiver.onMessage(context, s);
    }

    @Override
    public void onNotificationArrived(Context context, MzPushMessage mzPushMessage) {
        receiver.onNotificationArrived(context, mzPushMessage);
    }

    @Override
    public void onNotificationClicked(Context context, MzPushMessage mzPushMessage) {
        receiver.onNotificationClicked(context, mzPushMessage);
    }


    @Override
    public void onUnRegister(Context context, boolean b) {
        receiver.onUnRegister(context, b);
    }

    @Override
    public void onPushStatus(Context context, PushSwitchStatus pushSwitchStatus) {
        receiver.onPushStatus(context, pushSwitchStatus);
    }

    @Override
    public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
        receiver.onRegisterStatus(context, registerStatus);
    }

    @Override
    public void onUnRegisterStatus(Context context, UnRegisterStatus unRegisterStatus) {
        receiver.onUnRegisterStatus(context, unRegisterStatus);
    }

    @Override
    public void onSubTagsStatus(Context context, SubTagsStatus subTagsStatus) {
        receiver.onSubTagsStatus(context, subTagsStatus);
    }

    @Override
    public void onSubAliasStatus(Context context, SubAliasStatus subAliasStatus) {
        receiver.onSubAliasStatus(context, subAliasStatus);
    }

    @Override
    public void onUpdateNotificationBuilder(PushNotificationBuilder pushNotificationBuilder) {
        receiver.onUpdateNotificationBuilder(pushNotificationBuilder);
    }
}

        
此代码块在浮窗中显示

Android 5.0 系统报错:INSTALL_FAILED_DUPLICATE_PERMISSION

与 5.0 的多账户系统有关,其中一个账号安装一个应用,其他账号也会自动安装了这个应用;如果其中一个账号卸载了这个应用,那其他账号是不受影响的(其他账号仍有这个应用),所以如果在某个账号下卸载了应用,安装一个同包名但是签名不一致的包,就会安装失败了。

解决办法:在各个账户上的安装这个程序的应用卸载,然后重新安装即可解决这个问题。


AsyncTask 就没办法执行到 onPostExecute() 方法

这是 Android 旧系统带有的问题,解决办法如下:

在 application 里 onCreate 方法加上:

try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
          try {
            Class.forName("android.os.AsyncTask");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        
此代码块在浮窗中显示

详情请看链接:https://code.google.com/p/android/issues/detail?id=20915


Tag、Alias、Registration ID 需要每次初始化时都重新设置吗,会变化吗?

  • tag、alias 可以参考 别名与标签 API 进行设置,3.0.7 版本以前的接口每次设置是覆盖设置,而不是增量设置;从 3.0.7 版本开始,对别名标签提供增删改查接口。Tag 和 alias 一经设置成功,除非取消或覆盖,是不会变化的。设置好的 tag、alias 与客户端的对应关系保存在 JPush 服务器,目前没有从 JPush 服务器查询这个对应关系的接口,所以需要客户将对应关系保存在 APP 应用服务器。

  • Registration ID 是客户端 SDK 第一次成功连接到 JPush 服务器时,JPush 服务器给分配的。可以通过 获取 RegistrationID API 来获取 Registration ID 进行推送。Registration ID 对应一个应用的一个客户端,Android 的 registration ID 一般不会改变。


没有沙箱 API 怎么测试?

直接用 JPush 的 API 测试就行。


其他国家能否使用极光推送(局域网能否使用极光推送)?

只要能连网到 JPush 服务器都可以。判断能否联网到 JPush 服务器的方法:ping 通 api.jpush.cn 443


为什么发送推送提示没有任何设备或调用 API 返回 1011

这可能有如下几种情况:

  • SDK 没有集成成功,客户端有 "Login succeed" 日志、获取到了 registration ID 才表示 SDK 集成成功。
  • 广播推送有 10 分钟延迟,在第一个设备初始化成功后立即进行广播推送会报错。
  • 设置别名或标签失败,请注意查看设置别名标签的回调结果,从 3.0.7 版本开始,新接口是异步回调,需要在 Androidmanifest 里面配置自定义广播接收器,参考 错误码定义来修改直到设置成功返回 0。
  • 所传的 registration ID 对应的客户端所配的 Appkey 与推送使用的 Appkey 不一致。

可以打开极光官网 www.jiguang.cn,但打不开极光文档,提示无法找到 docs.jiguang.cn

  • 换个浏览器试试
  • 如果还是不行,执行下面的命令反馈结果排查一下问题
    • ping docs.jiguang.cn
    • nslookup docs.jiguang.cn
    • telnet docs.jiguang.cn
    • 检查一下自己机器访问外网其他网站是否正常

appkey 是怎么对应的?

一个 Appkey 只允许配置一个包名,Appkey 和包名在极光唯一确定一个应用。


内网使用极光推送应该怎么设置?

内网使用极光推送需要服务器开放下列端口限制,用于 JPush 的登录注册及保持推送长链接:

  • 19000
  • 3000-3020
  • 7000-7020
  • 8000-8020

文档内容是否对您有帮助?

Copyright 2011-2022, jiguang.cn, All Rights Reserved. 粤ICP备12056275号-13 深圳市和讯华谷信息技术有限公司

在文档中心打开