由于谷歌服务中国无法使用,android推送一直是一个大问题,低版本的android通过极光推送等,可以通过唤醒的方式从而达到消息送达的目的,但是随着版本的升级。极光推送在APP被杀死之后无法被唤醒,从而无法接受到推送的消息(极光推送有集成系统级推送方案但是收费,腾讯信鸽、友盟现在免费集成了系统通道)。下面主要是说华为推送的集成。
华为推送地址
首先咱们需要进行开发者注册,并且认证、获取SHA256证书指纹这些步骤就不说了。说集成的具体步骤(android studio集成方式)。
第一步 下载HMS SDK Agent套件 套件下载地址(如果地址不可用的话请直接在上面华为推送地址里面自行查找) ,下载完成后进行解压,里面有“readme.txt”有各个文件的说明,我们需要运行“GetHMSAgent_cn.bat”这个文件,然后根据提示输入包名、appid,如果只集成推送的话只输入这两个几个,cpid 直接点击回车即可,然后根据提示选择是否为游戏,然后输出一个文件夹,“copysrc”这个文件夹,我们需要把“AndroidManifest.xml” 里面的内容复制到自己项目“AppManifestConfig.xml”中,然后“java”中的复制到自己项目中,路径形式和文件中保持一致 如下图所示。
在allprojects->repositories 里面配置HMS SDK的maven仓。
repositories {
jcenter()
maven {url 'http://developer.huawei.com/repo/'}
}
}
第三步 打开工程app下的build.gradle文件,如下图。
工程builde.gradle.png
配置依赖文件 (这里配置的版本号是2.6.3.301)
dependencies {
implementation 'com.huawei.android.hms:push:2.6.3.301'
}
第四步 以上配置完资源,我们需要新建一个“PushReceiver” 并且继承“PushReceiver” 具体路径“com.huawei.hms.support.api.push.PushReceiver” 中简单方法如下
public class MyPushReceiver extends PushReceiver {
@Override
public void onToken(Context context, String token) {
super.onToken(context, token);
Log.e("====token======>>>", "" + token);
}
@Override
public boolean onPushMsg(Context context, byte[] msgBytes, Bundle extras) {
return super.onPushMsg(context, msgBytes, extras);
}
@Override
public void onPushState(Context context, boolean pushState) {
super.onPushState(context, pushState);
}
}
然后还需新建“MyApplication” 继承“Application”并且对华为推送进行初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
HMSAgent.init(this);
}
}
然后在“AndroidManifest.xml”配置application的name属性
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
然后在“AndroidManifest.xml”替换下面receiver的name 为刚才新建的“MyPushReceiver”
<receiver
android:name=".MyPushReceiver"
android:permission="com.im.oa.myapplication.permission.PROCESS_PUSH_MSG">
<intent-filter>
<!-- 必须,用于接收token -->
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<!-- 必须, 用于接收透传消息 -->
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
<action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY" />
</intent-filter>
</receiver>
第五步 在启动页请求一下华为推送
HMSAgent.connect(this, new ConnectHandler() {
@Override
public void onConnect(int rst) {
Log.e("====connect======>>>", "" + rst);
}
});
HMSAgent.Push.getToken(new GetTokenHandler() {
@Override
public void onResult(int rst) {
Log.e("====getToken=====>>>", "" + rst);
}
});
其中rst为0时表示成功,其他错误码参考华为推送错误码
当上面rst为0时 ,“MyPushReceiver”中会接受到华为分配的token,我们可以拿着这个token在华为控制台来进行推送测试。
写在最后,由于华为推送没有向极光推送那样的设置别名的方法,所以我们需要把华为分配的token记录到自己的库中,推送时根据用户取出相应token,并且我还没有找到华为的推送记录在哪里,所以最好做一下消息同送回执。
写在最后
数据库记录token的字段一定要设置足够长,由于我是荣耀手机并且官方文档中token实例和我手机生成的token一模一样,我以为所有华为(包括荣耀)手机生成token长度一样,所以我数据库设计长度为50,万万没想到华为有的手机(emui9.1不知道和这个有没有关系)生成的token长度特别长,导致数据库存储失败,所以无法进行推送。切记这个坑!!!!
网友评论