实现离线消息推送的过程如下:
Flyme 为深度定制 Android 系统,对于第三方 App 自启动权限管理很严格,默认情况下第三方 App 都不会在系统的自启动白名单内,App 在后台时容易被系统 kill,因此推荐在魅族设备上集成魅族推送,魅族推送是 Flyme 的系统级服务,推送到达率较高。目前,即时通信 IM 仅支持魅族推送的通知栏消息。
注意:
- 此指引文档是直接参考魅族官方文档所写,若魅族推送有变动,请以魅族推送官网文档为准。
- 此指引是根据 Flyme 推送接入指南所写,仅针对 Flyme 系统,并非魅族统一推送平台(各个厂家的整合)。
- 如果不需要对魅族设备做专门的离线推送适配,可以忽略此章节。
说明:认证过程大约需要3天左右,请务必提前阅读魅族推送服务启用指南,以免影响您的接入进度。
应用包名
、App ID
、App Secret
**信息。
说明:如果您原来已有证书只需变更信息,可以单击【Android平台推送设置】区域的【编辑】进行修改更新。
ID
**。
说明:
- 即时通信 IM 默认推送的通知标题为
a new message
。- 阅读此小节前,请确保您已经正常集成并使用即时通信 IM SDK。
- 您可以在我们的 demo 里找到魅族推送的实现示例,请注意:魅族推送版本更新时有可能会有功能调整,若您发现本节内容存在差异,烦请您及时查阅 魅族推送官网文档,并将文档信息差异反馈给我们,我们会及时跟进修改。
访问 魅族推送运营平台 下载魅族 Flyme 推送 SDK aar 包或者使用 jcenter 集成。
dependencies {
// MEIZU push sdk
compile 'com.meizu.flyme.internet:push-internal:3.6.+@aar'
}
添加魅族推送必须的权限:
<!-- ********魅族推送权限设置 start******** -->
<!-- 兼容 flyme5.0 以下版本,魅族内部集成 pushSDK 必填,不然无法收到消息-->
<uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE"></uses-permission>
<permission
android:name="com.tencent.qcloud.tim.tuikit.push.permission.MESSAGE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.tencent.qcloud.tim.tuikit.push.permission.MESSAGE"></uses-permission>
<!-- 兼容 flyme3.0 配置权限-->
<uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
<permission
android:name="com.tencent.qcloud.tim.tuikit.permission.C2D_MESSAGE"
android:protectionLevel="signature"></permission>
<uses-permission android:name="com.tencent.qcloud.tim.tuikit.permission.C2D_MESSAGE"/>
<!-- ********魅族推送权限设置 end******** -->
<!--这里的 com.tencent.qcloud.tim.tuikit 改成您的 App 的包名-->
为了接收消息,您需要自定义一个继承自MzPushMessageReceiver
类的 BroadcastReceiver,并实现其中的onRegisterStatus
方法,然后将此 receiver 注册到 AndroidManifest.xml 中。
以下为 Demo 中的示例代码:
public class MEIZUPushReceiver extends MzPushMessageReceiver {
private static final String TAG = "MEIZUPushReceiver";
@Override
public void onRegisterStatus(Context context, RegisterStatus registerStatus) {
QLog.i(TAG, "onRegisterStatus token = " + registerStatus.getPushId());
ThirdPushTokenMgr.getInstance().setThirdPushToken(registerStatus.getPushId());
ThirdPushTokenMgr.getInstance().setPushTokenToTIM();
}
}
将自定义的 BroadcastReceiver 注册到 AndroidManifest.xml:
<!--这里的 com.tencent.qcloud.tim.demo.thirdpush.MEIZUPushReceiver 修改成您 App 中的完整类名-->
<!-- ********魅族推送设置 start******** -->
<receiver android:name="com.tencent.qcloud.tim.demo.thirdpush.MEIZUPushReceiver">
<intent-filter>
<!-- 接收 push 消息 -->
<action android:name="com.meizu.flyme.push.intent.MESSAGE" />
<!-- 接收 register 消息 -->
<action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
<!-- 接收 unregister 消息-->
<action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK"/>
<!-- 兼容低版本 Flyme3 推送服务配置 -->
<action android:name="com.meizu.c2dm.intent.REGISTRATION" />
<action android:name="com.meizu.c2dm.intent.RECEIVE" />
<category android:name="com.tencent.qcloud.tim.demo.thirdpush"></category>
</intent-filter>
</receiver>
<!-- ********魅族推送设置 end******** -->
如果您选择启用魅族离线推送,需要向魅族服务器注册推送服务,通过调用PushManager.register
来对魅族推送服务进行初始化。PushManager.register
可在任意地方调用,为了提高注册成功率,魅族官方建议在 Application 的onCreate
中调用。
注册成功后,您将在 步骤3.3 自定义的 BroadcastReceiver 的onRegisterStatus
中收到注册结果。其中registerStatus.getPushId()
为当前设备上当前 App 的唯一标识,请记录PushId
信息。
以下为 Demo 中的示例代码:
public class DemoApplication extends Application {
private static PojoApplication instance;
@Override
public void onCreate() {
super.onCreate();
// 判断是否是在主线程
if (SessionWrapper.isMainProcess(getApplicationContext())) {
/**
* TUIKit 的初始化函数
*
* @param context 应用的上下文,一般为对应应用的 ApplicationContext
* @param sdkAppID 您在腾讯云注册应用时分配的 SDKAppID
* @param configs TUIKit 的相关配置项,一般使用默认即可,需特殊配置参考 API 文档
*/
long current = System.currentTimeMillis();
TUIKit.init(this, Constants.SDKAPPID, BaseUIKitConfigs.getDefaultConfigs());
System.out.println(">>>>>>>>>>>>>>>>>>"+(System.currentTimeMillis()-current));
// 添加自定初始化配置
customConfig();
System.out.println(">>>>>>>>>>>>>>>>>>"+(System.currentTimeMillis()-current));
if(IMFunc.isBrandXiaoMi()){
// 小米离线推送
MiPushClient.registerPush(this, Constants.XM_PUSH_APPID, Constants.XM_PUSH_APPKEY);
}
if(IMFunc.isBrandHuawei()){
// 华为离线推送
HMSAgent.init(this);
}
if(MzSystemUtils.isBrandMeizu(this)){
// 魅族离线推送
PushManager.register(this, Constants.MZ_PUSH_APPID, Constants.MZ_PUSH_APPKEY);
}
if(IMFunc.isBrandVivo()){
// vivo 离线推送
PushClient.getInstance(getApplicationContext()).initialize();
}
}
instance = this;
}
}
若您需要通过魅族推送进行即时通信 IM 消息的推送通知,必须在用户登录成功后通过TIMManager
中的setOfflinePushToken
方法将您托管到即时通信 IM 控制台生成的 证书 ID 及魅族推送服务端生成的 PushId 上报到即时通信 IM 服务端。
注意:正确上报 PushId 与证书 ID 后,即时通信 IM 服务才能将用户与对应的设备信息绑定,从而使用魅族推送服务进行推送通知。
以下为 Demo 中的示例代码:
/**
/**
<span class="hljs-keyword">return</span> ThirdPushTokenHolder.instance;
} <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> ThirdPushTokenMgr instance = <span class="hljs-keyword">new</span> ThirdPushTokenMgr();
} <span class="hljs-keyword">this</span>.mThirdPushToken = mThirdPushToken; <span class="hljs-comment">// PushId 在此处传值,结合上文自定义 BroadcastReciever 类文档说明</span>
} <span class="hljs-keyword">if</span>(mIsTokenSet){
QLog.i(TAG, <span class="hljs-string">"setPushTokenToTIM mIsTokenSet true, ignore"</span>);
<span class="hljs-keyword">return</span>;
}
String token = ThirdPushTokenMgr.getInstance().getThirdPushToken();
<span class="hljs-keyword">if</span>(TextUtils.isEmpty(token)){
QLog.i(TAG, <span class="hljs-string">"setPushTokenToTIM third token is empty"</span>);
mIsTokenSet = <span class="hljs-keyword">false</span>;
<span class="hljs-keyword">return</span>;
}
<span class="hljs-keyword">if</span>( !mIsLogin ){
QLog.i(TAG, <span class="hljs-string">"setPushTokenToTIM not login, ignore"</span>);
<span class="hljs-keyword">return</span>;
}
TIMOfflinePushToken param = <span class="hljs-keyword">null</span>;
<span class="hljs-keyword">if</span>(IMFunc.isBrandXiaoMi()){ <span class="hljs-comment">// 判断厂商品牌,根据不同厂商选择不同的推送服务</span>
param = <span class="hljs-keyword">new</span> TIMOfflinePushToken(Constants.XM_PUSH_BUZID, token);
}<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(IMFunc.isBrandHuawei()){
param = <span class="hljs-keyword">new</span> TIMOfflinePushToken(Constants.HW_PUSH_BUZID, token);
}<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(IMFunc.isBrandMeizu()){
param = <span class="hljs-keyword">new</span> TIMOfflinePushToken(Constants.MZ_PUSH_BUZID, token);
}<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(IMFunc.isBrandOppo()){
param = <span class="hljs-keyword">new</span> TIMOfflinePushToken(Constants.OPPO_PUSH_BUZID, token);
}<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(IMFunc.isBrandVivo()){
param = <span class="hljs-keyword">new</span> TIMOfflinePushToken(Constants.VIVO_PUSH_BUZID, token);
}<span class="hljs-keyword">else</span>{
<span class="hljs-keyword">return</span>;
}
TIMManager.getInstance().setOfflinePushToken(param, <span class="hljs-keyword">new</span> TIMCallBack() {
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
Log.d(TAG, <span class="hljs-string">"setOfflinePushToken err code = "</span> + code);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSuccess</span><span class="hljs-params">()</span> </span>{
Log.d(TAG, <span class="hljs-string">"setOfflinePushToken success"</span>);
mIsTokenSet = <span class="hljs-keyword">true</span>;
}
});
}成功上报证书 ID 及 PushId 后,即时通信 IM 服务端会在该设备上的即时通信 IM 用户 logout 之前、APP 被 kill 之后,将消息通过魅族推送通知到用户端。
说明:
- 魅族推送并非100%必达。
- 魅族推送可能会有一定延时,通常与 App 被 kill 的时机有关,部分情况下与魅族推送服务有关。
- 若即时通信 IM 用户已经 logout 或被即时通信 IM 服务端主动下线(例如在其他端登录被踢等情况),则该设备上不会再收到消息推送。
您可以选择点击通知栏消息后打开应用、打开网页或打开应用内指定界面。
默认为点击通知栏消息打开应用。
您需要在 添加证书 时选择【打开网页】并输入以http://
或https://
开头的网址,例如https://www.tencentcloud.com/document/product/457
。
您需要在 添加证书 时选择【打开应用内指定界面】并输入需要打开的 Activity 的完整类名,例如com.tencent.qcloud.tim.demo.chat.ChatActivity
。
添加证书 时设置【点击通知后】为【打开应用】或【打开应用内指定界面】操作才支持透传自定义内容。
在发消息前设置每条消息的通知栏自定义内容。
Android 端示例如下:
String extContent = "ext content";
TIMMessageOfflinePushSettings settings = new TIMMessageOfflinePushSettings();
settings.setExt(extContent.getBytes());
timMessage.setOfflinePushSettings(settings);
mConversation.sendMessage(false, timMessage, callback);
点击通知栏的消息时,会触发魅族推送 SDK 的 onNotificationClicked(Context context, MzPushMessage mzPushMessage)
回调 ,自定义内容可以从 mzPushMessage
中获取。
String extContent = mzPushMessage.getSelfDefineContentString();
另外,客户端也可以在打开的 Activity
中获取自定义内容。
Bundle bundle = getIntent().getExtras();
String extContent = bundle.getString("ext");
如果您的应用使用了混淆,为了防止魅族离线推送功能异常,您需要 keep 自定义的 BroadcastReceiver,参考添加以下混淆规则:
说明:以下代码为魅族官方示例,请根据实际情况修改后再使用。
# 请将 com.tencent.qcloud.tim.demo.thirdpush.MEIZUPushReceiver 改成您 App 中定义的完整类名
-keep com.tencent.qcloud.tim.demo.thirdpush.MEIZUPushReceiver {*;}
目前魅族推送不支持自定义的提示音。
</span id="section4"></span id="click"></span id="step4"></span id="step3_3"></span id="step3"></span id="step2"></span id="step1_3">
本页内容是否解决了您的问题?