Giter Club home page Giter Club logo

onepush's Introduction

目前OnePush在Android8.0上不兼容的问题,OnePush暂时不进行维护了,建议大家使用友盟的聚合推送,上面已经有各大厂商的推送。

消息推送用OnePush,就够了!

模块 one-push-core one-push-huawei one-push-xiaomi one-push-meizu one-push-huawei-hms
lastVersion
模块 one-push-umeng one-push-getui one-push-jpush
lastVersion
QQ交流群(459480065)

QQ群:459480065

手机系统级推送
小米推送 华为推送 魅族推送
第三方平台推送
友盟推送 个推推送 极光推送

前言

OnePush从诞生到目前600多的star,由当初的不知名到现在很多朋友都应用到商业项目中,我真的很高兴,当然也有部分的朋友质疑,说:“OnePush有啥用呀,工信部都已经开始统一Android的推送了,而且已经召集各大厂商开始讨论了”,我想说的是,工信部的确准备一统Android的推送,但是这些工作还在进行中,那我们的应用,不可能等到他们统一以后再发布吧,其次,就算统一了,那么可能会涉及到手机系统升级的问题,没有升级的手机,是没办法享受到统一推送的渠道,你在看看,目前厂商几年前生产的手机,绝大部分的手机,系统是得不到官方的升级的,那么这些用户我们在统一推送之后,就不管他们了?显然是不行的,OnePush的诞生,和当初**NineOldAndroids**的出现有点类似,可以说NineOldAndroids,当初在我们开发兼容2.3的应用做了很大的贡献,虽然我们现在应用不再兼容到2.3,但是NineOldAndroids的功劳是不可磨灭的。

快速集成指南

如果集成的是1.0版本的OnePush建议升级到1.2版本。 1.0版本集成文档 所有的lastVersion对应的是上面表格的最新的版本号,集成的时候,需要进行替换。 设置Deubg模式:OneLog.setDebug(),该方法需要在OnePush.init()方法前调用。

1. 添加OnePush主要依赖(必须添加)

项目project的build.gradle

allprojects {
    repositories {
        jcenter()
        maven { url 'https://jitpack.io' }
        //由于魅族个推等第三方库使用了不同的仓库,需要加上这个
        maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
        maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/" }
        maven { url 'http://developer.huawei.com/repo/' }
    }
}

工程module的build.gradle

dependencies {
      compile 'com.peng.library:one-push-core:lastVersion'
}

2. 添加第三方推送依赖(根据自己的需求进行添加,当然也可以全部添加)

dependencies {
    //华为推送和HMS服务只能选择其中的一个
    //compile 'com.peng.library:one-push-huawei:lastVersion'
    compile 'com.peng.library:one-push-huawei-hms:lastVersion'
    compile 'com.peng.library:one-push-xiaomi:lastVersion'
    compile 'com.peng.library:one-push-umeng:lastVersion'
    compile 'com.peng.library:one-push-getui:lastVersion'
    compile 'com.peng.library:one-push-meizu:lastVersion'
    compile 'com.peng.library:one-push-jpush:lastVersion'

}

3. 继承BaseOnePushReceiver重写里面的方法,并在AndroidManifest.xml中注册

<receiver android:name="com.peng.openpush.TestPushReceiver">
            <intent-filter>
                <action android:name="com.peng.one.push.ACTION_RECEIVE_NOTIFICATION" />
                <action android:name="com.peng.one.push.ACTION_RECEIVE_NOTIFICATION_CLICK" />
                <action android:name="com.peng.one.push.ACTION_RECEIVE_MESSAGE" />
                <action android:name="com.peng.one.push.ACTION_RECEIVE_COMMAND_RESULT" />

                <category android:name="${applicationId}" />
            </intent-filter>
</receiver>

4. 在AndroidManifest.xml的application标签下,添加第三方推送实现类

    <!--如果引入了one-push-xiaomi库-->
    <meta-data
        android:name="OnePush_XiaoMi_101"
        android:value="com.peng.one.push.xiaomi.XiaomiPushClient"/>


    <!--如果引入了one-push-huawei类库-->
<!--        <meta-data
            android:name="OnePush_HuaWei_102"
            android:value="com.peng.one.push.huawei.HuaweiPushClient"/>-->

    <!--如果引入了one-push-meizu库-->
    <meta-data
        android:name="OnePush_MeiZu_103"
        android:value="com.peng.one.push.meizu.MeizuPushClient"/>

    <!--如果引入了one-push-umeng类库-->
    <meta-data
        android:name="OnePush_UMENG_104"
        android:value="com.peng.one.push.umeng.UMengPushClient"/>

    <!--如果引入了one-push-getui库-->
    <meta-data
        android:name="OnePush_GeTui_105"
        android:value="com.peng.one.push.getui.GeTuiPushClient"/>

    <!--如果引入了one-push-库-->
    <meta-data
        android:name="OnePush_JPush_106"
        android:value="com.peng.one.push.jpush.JPushClient"/>

    <!--如果引入了one-push-huawei-hms库-->
    <meta-data
        android:name="OnePush_HMSPush_107"
        android:value="com.peng.one.push.huawei.hms.HMSPushClient"/>

关于标签书写规则:

  • android:name 必须是以“ OnePush ”开头,并且以"_"进行分割(OnePush_平台名称_平台标识码),在初始化OnePush 的时候,根据标识码和当前手机系统,动态的使用不同平台消息推送。
  • android:value 这个是继承IPushClient实现类,全类名路径。

5. 添加第三方AppKey和AppSecret

如果使用了one-push-xiaomi,那么需要在AndroidManifest.xml添加小米的AppKey和AppSecret(注意下面的“\ ”必须加上,否则获取到的是float而不是String,就会导致id和key获取不到正确的数据)

    <!--友盟推送静态注册-->
    <meta-data
        android:name="UMENG_APPKEY"
        android:value="59c87440734be47b6700001b"/>

    <meta-data
        android:name="UMENG_MESSAGE_SECRET"
        android:value="b856987f2ca836a784698e150d36ff2a"/>

    <!--小米推送静态注册-->
    <meta-data
        android:name="MI_PUSH_APP_ID"
        android:value="\ 2882303761517577233"/>

    <meta-data
        android:name="MI_PUSH_APP_KEY"
        android:value="\ 5701757717233"/>

    <!--个推推送静态注册-->
    <meta-data
        android:name="PUSH_APPID"
        android:value="edX56uUoQ7ASr4ru4c3rVA"/>
    <meta-data
        android:name="PUSH_APPKEY"
        android:value="Crl1UEA5Fd8tooEDmS5aA3"/>
    <meta-data
        android:name="PUSH_APPSECRET"
        android:value="D9hcD0r6Ec5ANGSLY92XP3"/>

    <!--魅族推送静态注册-->
    <meta-data
        android:name="MEIZU_PUSH_APP_ID"
        android:value="111338"/>

    <meta-data
        android:name="MEIZU_PUSH_APP_KEY"
        android:value="db1659369a85459abe5384814123ab5a"/>

    <!--极光推送静态注册-->
    <meta-data
        android:name="JPUSH_CHANNEL"
        android:value="developer"/>
    <meta-data
        android:name="JPUSH_APPKEY"
        android:value="41bb9f84d2158a7be9de3b47"/>

    <!--华为HMS推送静态注册-->
    <meta-data
        android:name="com.huawei.hms.client.appid"
        android:value="100099491"/>

 <!--华为老版本推送不需要静态注册,在app上不需要配置appkey和secret,需要在华为开发者平台,申请华为推送,并配置包名和证书指纹-->

6. 初始化OnePush

//初始化的时候,回调该方法,可以根据platformCode和当前系统的类型,进行注册
//返回true,则使用该平台的推送,否者就不使用
//只在主进程中注册(注意:umeng推送,除了在主进程中注册,还需要在channel中注册)
        if (BuildConfig.APPLICATION_ID.equals(currentProcessName) || BuildConfig.APPLICATION_ID.concat(":channel").equals(currentProcessName)) {
            OnePush.init(this, ((platformCode, platformName) -> {
                //platformCode和platformName就是在<meta/>标签中,对应的"平台标识码"和平台名称
                if (RomUtils.isMiuiRom()) {
                    return platformCode == 101;
                } else if (RomUtils.isHuaweiRom()) {
                    return platformCode == 102;
                } else if (RomUtils.isFlymeRom()) {
                    return platformCode == 105;
                }else {
                    return platformCode == 104;
                }
            }));
            OnePush.register();
}

7. 后台推送动作说明:

  • 注册友盟推送除了在主进程中,还需要在channel进程中进行注册,具体操作见DEMO(UMeng官方推送就是这样要求的)
  • 友盟推送:后台配置后续动作,为"自定义行为"。
  • 小米推送:后台配置点击后续动作,为"由应用客户端自定义"。
  • 魅族推送:后台配置点击动作,为"应用客户端自定义"
  • 个推推送:后台配置后续动作为打开应用,如果你发送的通知,为了保证你点击通知栏能收到在NotificationClick的回调,每一个通知必须都带有one-push规定格式的透传消息,如果你只发送透传,那就不必按照下面的格式。
个推通知中透传消息json:
    {
        "onePush":true,
         "title":"通知标题",
         "content":"通知内容",
         "extraMsg":"额外信息",
         "keyValue":{
            "key1":"value1",
            "key2":"value2",
            "key3":"value3"
           }
      }

  • 华为推送和华为HMS服务:后台配置后续行为,为"自定义动作",具体内容,可由OnePushService包:com.peng.one.push.service.huawei.intent.HWPushIntent生成,如果后台不是java开发的,参照HWPushIntent重新写。

8. 集成 友盟推送 的童鞋注意啦

  • OnePush拓展的友盟推送是版本v3.1.1a
  • 关于utdid重复引入的问题,可以通过下面的方案解决
//如果utdid和你工程项目里面发生冲突了,请修改成这个依赖
 compile ('com.peng.library:one-push-umeng:lastVersion' ){
        exclude group: 'com.peng.library',module:'one-push-umeng-utdid4all'
    }
  • 关于友盟推送so文件处理,OnePush拓展的友盟推送,默认将所有的so文件引入了,这样就导致友盟推送aar文件大小达到2.25M左右,所以下面提供一个裁剪so文件的方法 第一步:在工程根目录的gradle.properties文件中,添加 android.useDeprecatedNdk=true 第二步:在项目(app)的build.gradle节点defaultConfig下添加
 ndk {
            // 设置支持的SO库
            abiFilters 'armeabi'//,'armeabi-v7a', 'x86', 'x86_64', 'arm64-v8a','mips','mips64'
        }

根据自己工程的需要,配置不同的so编译,然后Rebuild Project。

  • 最后啰嗦几句,其实只要添加armeabi,就可以了,armeabi在每个平台都是可以用的,俗称万能油。只是在其他CPU平台上,使用armeabi,效率不是很高而已,其实微信也是只使用了armeabi,只不过它为了提高效率,他将v7a也放在了armeabi里面,最后根据具体安装的手机CPU,动态加载而已。

9. 集成 华为推送 的童鞋注意啦

  • BaseOnePushReceiver中的onReceiveNotification()方法,在使用的华为推送的时候,该方法不会被调用,因为华为推送没有提供这样的支持。
  • BaseOnePushReceiver中的onReceiveNotificationClick()方法,在使用华为推送的时候,虽然华为支持,但是如果app被华为一键清理掉后,收到通知,那么点击通知是不会调用华为推送的onEvent()方法,那么如果我们这里转发,onReceiveNotificationClick()是不会收到的。
  • 为了解决华为推送,在手机上被清理掉后,onReceiveNotificationClick()不被调用的情况,OnePush在华为推送上,使用跳转到指定Activity的推送通知,那么服务端必须提供一个Intent序列化的uri,OnePush提供的Java服务端消息推送示例中,已经提供了服务端序列化Intent的uri的实现(详见:com.peng.one.push.service.huawei.intent.HWPushIntent)。

10. 关于将来拓展其他平台消息推送说明

  • 个人感觉,除了厂商的推送,其他的第三方推送只需要集成一个就可以了,假如你想使用OnePush,但是目前OnePush拓展的消息推送平台,没有你目前使用的怎么办呢,可以参照OnePush拓展详细说明,进行集成。
  • 如果你已经拓展其他平台的消息推送,并且测试通过,可以将代码Push过来,我检查过后,合并进来,这样可以方便大家。

11. 拓展其他平台说明

关于添加其他消息推送SDK具体操作(如果你不满足OnePush提供的小米、华为推送,可根据下面步骤,将其他厂商提供的推送,添加到OnePush里面)

  • 创建XXXClient 实现IPushClient接口,并且重写对应的方法,initContext(Context),会在初始化的使用进行调用,可以在这里进行获取第三方推送注册需要的ID,KEY或者其他操作,第三方推送ID、KEY,建议在AndroidManifest.xml中的Application标签下添加,然后在initContext(Context)中进行获取。

  • 创建和重写三方消息推送的Receiver或者IntentService(一般第三方会让你继承他的receiver,这里指的就是他),重写三方推送的的接收透传消息和通知的方法,调用OneRepeater的transmitXXX方法,将通知、透传消息、通知点击事件、以及其他事件,转发到OnePush。

  • 记得在OnePush注册的时候,进行消息推送平台的选择。

  • 具体操作方法:详见one-push-xiaomi

12. 代码混淆

-dontoptimize
-dontpreverify
-dontwarn com.taobao.**
-dontwarn anet.channel.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn org.apache.thrift.**
-dontwarn com.xiaomi.**
-dontwarn com.huawei.**
-dontwarn com.peng.one.push.**
-dontwarn com.igexin.**
-dontwarn cn.jpush.**
-dontwarn cn.jiguang.**
-keepattributes *Annotation*

-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }
-keep class cn.jiguang.** { *; }
-keep class com.taobao.** {*;}
-keep class org.android.** {*;}
-keep class anet.channel.** {*;}
-keep class com.umeng.** {*;}
-keep class com.xiaomi.** {*;}
-keep class com.huawei.** {*;}
-keep class com.hianalytics.android.** {*;}
-keep class com.meizu.cloud.**{*;}
-keep class org.apache.thrift.** {*;}
-keep class com.igexin.** { *; }
-keep class org.json.** { *; }
-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}

-keep public class **.R$*{
   public static final int *;
}

#(可选)避免Log打印输出
-assumenosideeffects class android.util.Log {
   public static *** v(...);
   public static *** d(...);
   public static *** i(...);
   public static *** w(...);
 }

 # OnePush的混淆
-keep class * extends com.peng.one.push.core.IPushClient{*

三、相关api介绍

OnePush详细api
方法名称 描述及解释
init(Context , OnOnePushRegisterListener) 初始化OnePush,建议在Application中onCreate()方法
register() 注册消息推送
unregister() 取消注册消息推送
bindAlias(String) 绑定别名
unBindAlias(String) 取消绑定别名
addTag(String) 添加标签
deleteTag(String) 删除标签
getPushPlatFormCode() 获取推送平台code(AndroidManifest.xml中注册)
getPushPlatFormName() 获取推送平台name(AndroidManifest.xml中注册)
setDebug(boolean) 设置是否为debug模式

OneRepeater详细api
方法名称 描述及解释
transmitCommandResult(Context,int,int,String,String,String) 转发操作反馈(具体type在OnePush.TYPE_XXX)
transmitMessage(Context,String,String,Map<String,String>) 转发透传消息
transmitNotification(Context,int,String,String,Sting,Map<String,String>) 转发通知
transmitNotificationClick(Context,int,String,String,Sting,Map<String,String>) 转发通知点击事件

License

   Copyright 2017 pengyuantao

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

传送门

一步步走来的消息推送 安卓统一推送标准 已取得阶段性成果 实验室开展基于安卓操作系统统一推送工作的相关Q&A 更新日志

感谢

Youzh 提供one-push-huawei-hms拓展

onepush's People

Contributors

androidaccountpyt avatar nileopen avatar pengyuantao avatar youmu178 avatar zhuanglee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

onepush's Issues

友盟推送相关

作者大大实在给力,才提出了友盟推送的需求,就给出了支持。先谢谢了
简单阅读代码之后,冒昧提几个建议

  1. 现在友盟提供带透传和不带透传的两个版本,不知道作者用的是哪一个呢~
  2. utdid4all-1.1.5.3_proguard.jar 这个jar包在一些集成了淘宝SDK的项目中,可能会造成包冲突的问题
  3. SDK中直接下载的so文件是不全的,需要适配更多平台的话,还需要额外下载。
    不知道能不能通过什么办法能让开发者自己适配呢

点击删除标签崩溃

进入demo首页,不管是否点击设置标签,点击删除标签,程序崩溃。
log:
11-23 19:18:27.875 27452-27452/? D/dalvikvm: Late-enabling CheckJNI
11-23 19:18:27.925 27452-27452/com.peng.one.push1 D/ActivityThread: handleBindApplication:com.peng.one.push1
11-23 19:18:27.925 27452-27452/com.peng.one.push1 D/ActivityThread: setTargetHeapUtilization:0.75
11-23 19:18:27.925 27452-27452/com.peng.one.push1 D/ActivityThread: setTargetHeapMinFree:4194304
11-23 19:18:27.925 27452-27452/com.peng.one.push1 D/ActivityThread: setTargetHeapConcurrentStart:2097152
11-23 19:18:27.985 27452-27452/com.peng.one.push1 I/PushApplication: Register-> code: 105 name: GeTui result: false
11-23 19:18:27.995 27452-27452/com.peng.one.push1 I/PushApplication: Register-> code: 104 name: UMENG result: false
11-23 19:18:28.015 27452-27452/com.peng.one.push1 I/PushApplication: Register-> code: 106 name: JPush result: false
11-23 19:18:28.025 27452-27452/com.peng.one.push1 I/PushApplication: Register-> code: 101 name: XiaoMi result: false
11-23 19:18:28.035 27452-27452/com.peng.one.push1 I/PushApplication: Register-> code: 103 name: MeiZu result: false
11-23 19:18:28.055 27452-27452/com.peng.one.push1 I/PushApplication: Register-> code: 107 name: HMSPush result: true
11-23 19:18:28.055 27452-27452/com.peng.one.push1 I/OneLog: current register platform is OnePush_HMSPush_107
11-23 19:18:28.055 27452-27452/com.peng.one.push1 I/OneLog: HMSPush--register()
11-23 19:18:28.055 27452-27452/com.peng.one.push1 I/AndroidRuntime: timezone is Asia/Shanghai
11-23 19:18:28.125 27452-27452/com.peng.one.push1 I/PushApplication: onCreate: isFlymeRom:false
11-23 19:18:28.125 27452-27452/com.peng.one.push1 V/HwPolicyFactory: : success to get AllImpl object and return....
11-23 19:18:28.135 27452-27452/com.peng.one.push1 V/HwWidgetFactory: : successes to get AllImpl object and return....
11-23 19:18:28.135 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.view.Window$Callback.onProvideKeyboardShortcuts, referenced from method android.support.v7.view.WindowCallbackWrapper.onProvideKeyboardShortcuts
11-23 19:18:28.135 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve interface method 17451: Landroid/view/Window$Callback;.onProvideKeyboardShortcuts (Ljava/util/List;Landroid/view/Menu;I)V
11-23 19:18:28.135 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002
11-23 19:18:28.135 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;)
11-23 19:18:28.135 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.view.WindowCallbackWrapper.onSearchRequested
11-23 19:18:28.135 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve interface method 17453: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z
11-23 19:18:28.135 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002
11-23 19:18:28.135 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.view.WindowCallbackWrapper.onWindowStartingActionMode
11-23 19:18:28.135 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve interface method 17457: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
11-23 19:18:28.135 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002
11-23 19:18:28.145 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.widget.TintTypedArray.getChangingConfigurations
11-23 19:18:28.145 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve virtual method 692: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
11-23 19:18:28.145 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
11-23 19:18:28.145 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.widget.TintTypedArray.getType
11-23 19:18:28.145 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve virtual method 714: Landroid/content/res/TypedArray;.getType (I)I
11-23 19:18:28.145 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x6e at 0x0008
11-23 19:18:28.165 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.widget.FrameLayout.startActionModeForChild, referenced from method android.support.v7.widget.ActionBarContainer.startActionModeForChild
11-23 19:18:28.165 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve virtual method 17946: Landroid/widget/FrameLayout;.startActionModeForChild (Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
11-23 19:18:28.165 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x6f at 0x0002
11-23 19:18:28.175 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.content.Context.getColorStateList, referenced from method android.support.v7.content.res.AppCompatResources.getColorStateList
11-23 19:18:28.175 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve virtual method 421: Landroid/content/Context;.getColorStateList (I)Landroid/content/res/ColorStateList;
11-23 19:18:28.175 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x6e at 0x0006
11-23 19:18:28.185 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawable
11-23 19:18:28.185 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve virtual method 655: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
11-23 19:18:28.185 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
11-23 19:18:28.185 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawableForDensity
11-23 19:18:28.185 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve virtual method 657: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
11-23 19:18:28.185 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
11-23 19:18:28.195 27452-27452/com.peng.one.push1 E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering
11-23 19:18:28.195 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve instanceof 182 (Landroid/graphics/drawable/RippleDrawable;) in Landroid/support/v7/widget/AppCompatImageHelper;
11-23 19:18:28.195 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x20 at 0x000c
11-23 19:18:28.255 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.support.v13.app.FragmentCompat.requestPermissions, referenced from method permissions.dispatcher.PermissionUtils.requestPermissions
11-23 19:18:28.255 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve static method 2628: Landroid/support/v13/app/FragmentCompat;.requestPermissions (Landroid/app/Fragment;[Ljava/lang/String;I)V
11-23 19:18:28.255 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x71 at 0x0000
11-23 19:18:28.255 27452-27452/com.peng.one.push1 I/dalvikvm: Could not find method android.support.v13.app.FragmentCompat.shouldShowRequestPermissionRationale, referenced from method permissions.dispatcher.PermissionUtils.shouldShowRequestPermissionRationale
11-23 19:18:28.255 27452-27452/com.peng.one.push1 W/dalvikvm: VFY: unable to resolve static method 2629: Landroid/support/v13/app/FragmentCompat;.shouldShowRequestPermissionRationale (Landroid/app/Fragment;Ljava/lang/String;)Z
11-23 19:18:28.255 27452-27452/com.peng.one.push1 D/dalvikvm: VFY: replacing opcode 0x71 at 0x0007
11-23 19:18:28.275 27452-27452/com.peng.one.push1 I/OneLog: token null
11-23 19:18:28.315 27452-27452/com.peng.one.push1 I/Adreno-EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: ()
OpenGL ES Shader Compiler Version: E031.24.02.07
Build Date: 01/15/15 Thu
Local Branch:
Remote Branch:
Local Patches:
Reconstruct Branch:
11-23 19:18:28.325 27452-27480/com.peng.one.push1 D/MSimTelephonyManager: mapDualCardSubID, input subscription = 0
11-23 19:18:28.325 27452-27480/com.peng.one.push1 D/MSimTelephonyManager: getDeviceId, subscription=0
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: PartialUpdate status: Disabled
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: Left Align: 0
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: Width Align: 0
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: Top Align: 0
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: Height Align: 0
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: Min ROI Width: 0
11-23 19:18:28.335 27452-27452/com.peng.one.push1 I/qdutils: Min ROI Height: 0
11-23 19:18:28.345 27452-27452/com.peng.one.push1 D/OpenGLRenderer: Enabling debug mode 0
11-23 19:18:28.425 27452-27452/com.peng.one.push1 I/OneLog: HMS connect success!
11-23 19:18:28.465 27452-27452/com.peng.one.push1 I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@42585630 time:218327094
11-23 19:18:28.465 27452-27452/com.peng.one.push1 I/OneLog: token com.huawei.hms.support.api.entity.push.TokenResp@428c4c20
11-23 19:18:28.485 27452-27500/com.peng.one.push1 I/OneLog: onToken() called with: context = [android.app.ReceiverRestrictedContext@428d4ba0], token = [0A000005566726A0300000898500CN01], bundle = [Bundle[{receiveType=1, deviceToken=0A000005566726A0300000898500CN01, device_token=[B@428d4d48, pushMsg=null, belongId=1}]]
11-23 19:18:28.495 27452-27452/com.peng.one.push1 I/TestPushReceiver: onCommandResult: OnePushCommand{type=TYPE_REGISTER, resultCode=200, token='0A000005566726A0300000898500CN01', extraMsg='null', error='null'}
11-23 19:18:28.495 27452-27452/com.peng.one.push1 I/OneLog: com.peng.one.push.ACTION_RECEIVE_COMMAND_RESULT--OnePushCommand{type=TYPE_REGISTER, resultCode=200, token='0A000005566726A0300000898500CN01', extraMsg='null', error='null'}
11-23 19:18:36.305 27452-27452/com.peng.one.push1 V/AudioManager: playSoundEffect effectType: 0
11-23 19:18:36.305 27452-27452/com.peng.one.push1 V/AudioManager: querySoundEffectsEnabled...
11-23 19:18:36.315 27452-27452/com.peng.one.push1 I/OneLog: HMSPush--deleteTag(test)
11-23 19:18:36.315 27452-27452/com.peng.one.push1 D/AndroidRuntime: Shutting down VM
11-23 19:18:36.315 27452-27452/com.peng.one.push1 W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41639e18)
11-23 19:18:36.325 27452-27452/com.peng.one.push1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.peng.one.push1, PID: 27452
com.huawei.hms.support.api.push.PushException: delete tags failed
at com.huawei.hms.support.api.push.a.a(PushTagManager.java:123)
at com.huawei.hms.support.api.push.HuaweiPushApiImp.deleteTags(HuaweiPushApiImp.java:173)
at com.peng.one.push.huawei.hms.HMSPushClient.deleteTag(HMSPushClient.java:129)
at com.peng.one.push.core.OnePushContext.deleteTag(OnePushContext.java:177)
at com.peng.one.push.OnePush.deleteTag(OnePush.java:69)
at com.peng.one.push1.MainActivity.onClick(MainActivity.java:110)
at android.view.View.performClick(View.java:4457)
at android.view.View$PerformClick.run(View.java:18491)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5336)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
at dalvik.system.NativeStart.main(Native Method)
Caused by: com.huawei.hms.support.api.push.PushException: no tag need to delete
at com.huawei.hms.support.api.push.a.a(PushTagManager.java:117)
at com.huawei.hms.support.api.push.HuaweiPushApiImp.deleteTags(HuaweiPushApiImp.java:173) 
at com.peng.one.push.huawei.hms.HMSPushClient.deleteTag(HMSPushClient.java:129) 
at com.peng.one.push.core.OnePushContext.deleteTag(OnePushContext.java:177) 
at com.peng.one.push.OnePush.deleteTag(OnePush.java:69) 
at com.peng.one.push1.MainActivity.onClick(MainActivity.java:110) 
at android.view.View.performClick(View.java:4457) 
at android.view.View$PerformClick.run(View.java:18491) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5336) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 
at dalvik.system.NativeStart.main(Native Method) 
11-23 19:18:37.855 27452-27452/com.peng.one.push1 I/Process: Sending signal. PID: 27452 SIG: 9

华为推送返回token为null 具体为 {statusCode: 907135003, statusMessage: null, pendingIntent: null, }

  HuaweiPush.HuaweiPushApi.getToken(huaweiApiClient)
        .setResultCallback(new ResultCallback<TokenResult>() {
          @Override
          public void onResult(TokenResult tokenResult) {
            OneLog.i("token " + tokenResult.getTokenRes());
            if (tokenResult.getTokenRes() != null && !TextUtils.isEmpty(
                tokenResult.getTokenRes().getToken())) {
              OneRepeater.transmitCommandResult(HMSPushClient.this.context, OnePush.TYPE_REGISTER,
                  OnePush.RESULT_OK, tokenResult.getTokenRes().getToken(), null, null);
            }
          }
        });

{statusCode: 907135003, statusMessage: null, pendingIntent: null, }
文档
通用错误码截图

系统判断

会根据不同的手机系统判断初始化不同的SDK么?比如说华为系统只初始化HMS SDK,小米系统只初始化MIPush

Android Studio3.0报错

Error:com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Android-project\AndroidStudioProjects\XXX\Lib_Common\build\intermediates\intermediate-jars\debug\classes.jar
Error:com.android.builder.dexing.DexArchiveBuilderException: Error while dexing com/XXX/common/base/BaseApplication.class
Error:com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Android-project\AndroidStudioProjects\XXX\Lib_Common\build\intermediates\intermediate-jars\debug\classes.jar
Error:com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
Error:Execution failed for task ':Module_App:transformClassesWithDexBuilderForDebug'.
com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Android-project\AndroidStudioProjects\XXX\Lib_Common\build\intermediates\intermediate-jars\debug\classes.jar

消息通知

  1. “消息通知” 怎么修改图标,我是使用的是jpush
  2. “消息通知” 的代码是封装在哪里

能否添加ReactNative的实现?

现在用ReactNative的场景较多,且大多都是前端开发,对移动端开发不太懂,若能集成ReactNative,可以方便这方面的同学使用

友盟是可以获取通知的信息的

public class OnePushMessageHandler extends UmengMessageHandler {

@Override
public void dealWithCustomMessage(Context context, UMessage uMessage) {
    OneRepeater.transmitMessage(context, uMessage.custom, null, uMessage.extra);
}

}
这里面重写
@OverRide
public Notification getNotification(Context context, UMessage uMessage)
这个方法是可以获取通知的信息的,望博主加上

Android 8.0 不能用静态广播

看了源码,收到推送会发送广播,但测试时发现并没有回调自己的实现。后来想起8.0静态广播的限制。可能要采取动态注册的方式。

推送的问题

你好大神:
当我退出程序的时候无法接收到消息,请问我该怎么做,才能让退出app后还能接收到推送的通知;
可以指点一下吗

判断型号有误

我使用小米5c,最终注册为友盟推送。大概看了下,在OnePushContext.init()方法里面,遍历时,map中的顺序为华为,友盟,小米,走到友盟后就跳出了循环

android 8.0上出现问题

2018-04-02 16:34:10.304 1188-1271/? W/BroadcastQueue: Background execution not allowed: receiving Intent { act=com.peng.one.push.ACTION_RECEIVE_COMMAND_RESULT cat=[com.eblog] flg=0x2010 (has extras) } to com.eblog/.lib.utils.push.OnePushReceiver

希望能针对这个做个if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)的适配

使用手机是:华为mate9
华为系统版本是:MHA-AL00 8.0.0.354(C00) [EMUI 8.0.0]

gradle build fail

Error:Unable to load class 'org.gradle.api.internal.component.Usage'. Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) <a href="syncProject">Re-download dependencies and sync project (requires network)</a></li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem. <a href="stopGradleDaemons">Stop Gradle build processes (requires restart)</a></li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

华为getToken方法调用时机问题

华为推送技术人员联系我们app,说我们app推送失败率很高,原因是没有判断是否连接成功,就调用了getToken,register方法中应该修改如下:

        @Override
	public void register() {
		if (!huaweiApiClient.isConnected()) {
			huaweiApiClient.connect();
		} else {
			getToken();
		}
	}

.onTagOperatorResult(JPushTagOrAliasReceiver.java:30)

出现了这个问题怎么办
Attempt to invoke interface method 'java.util.Iterator java.util.Set.iterator()' on a null object reference
com.peng.one.push.jpush.JPushTagOrAliasReceiver.onTagOperatorResult(JPushTagOrAliasReceiver.java:30)

华为推送问题

服务端报错
rsp = (String)client.call("openpush.openapi.query_app_tags", new HashMap<>(), String.class);
这行代码报错如下
nsp.support.common.NSPException: 3 service not found !
at nsp.support.common.AbsNSPClient.request(AbsNSPClient.java:291)
at nsp.support.common.AbsNSPClient.request(AbsNSPClient.java:144)
at nsp.NSPClient.callService(NSPClient.java:171)
at nsp.support.common.AbsNSPClient.call(AbsNSPClient.java:309)
at com.peng.one.push.service.huawei.HuaweiService.getAllTags(HuaweiService.java:297)
at com.peng.one.push.service.huawei.HuaweiService.setPushTypeAndTarget(HuaweiService.java:263)
at com.peng.one.push.service.huawei.HuaweiService.sendNotification(HuaweiService.java:77)
at com.peng.one.push.service.Main.sendNotification(Main.java:102)
at com.peng.one.push.service.Main.main(Main.java:74)
我查了一下openpush.openapi.query_app_tags是存在华为13年文档里的 而最新文档找不到这个 是不是过期了还是其他原因导致的错误 nspclient是正常的之前有方法能连接上

小米机型注册失败

在 onCommandResult的回调中发现小米注册失败,总是提示我错误的applicationId:

onCommandResult:OnePushCommand{type=TYPE_REGISTER, resultCode=200, token='null', extraMsg='null', error='Invalid application id: xxxxxxxx'}

再三检查后发现id是正常的。
(直接单独接小米push sdk 该id能正常推送消息!)

友盟推送还有个问题

友盟推送有一个需要统计设备是否在线的操作

在所有的Activity 的onCreate 方法或在应用的BaseActivity的onCreate方法中添加:
PushAgent.getInstance(context).onAppStart();

详情见 http://dev.umeng.com/push/android/integration#3_2_6

再提一个建议,我现在都是在注册成功后将token缓存起来。
我们OnePush是否可以直接实现这个接口,注册后缓存token,当缓存失效后。可以去服务器获取并返回~

能否添加ReactNative的支持?

现在用ReactNative的场景较多,且大多都是前端开发,对移动端开发不太懂,若能集成ReactNative,可以方便这方面的同学使用

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.