最近由于公司有需求需要集成OPPO平臺的推送菱鸥,所以在此處寫下自己的心路歷程铆帽,以便后來的人可以避免遇到跟筆者一樣的坑胞枕。以下如果有錯誤的地方希望大家指出,謝謝各位看官娩嚼。
OPPO開放平臺:https://open.oppomobile.com/
首先介紹一下OPPO推送平臺:
OPPO Push是OPPO公司向開發(fā)者提供的消息推送服務(wù)蘑险,通過服務(wù)端端與OS端建立的一條穩(wěn)定、可靠的長連接通道待锈,向OPPO手機系統(tǒng)(ColorOS)上的APP應(yīng)用客戶端實時推送消息的服務(wù)漠其。在最新ColorOS系統(tǒng)上,會直接使用系統(tǒng)長連接通道竿音,所有app會和系統(tǒng)共享一個長連接
通過消息推送服務(wù)和屎,可有效的提升開發(fā)者應(yīng)用的活躍和留存,改善產(chǎn)品體驗春瞬。
1)支持平臺
目前支持 ColorOS3.1及以上的系統(tǒng)的oppo的機型柴信,一加5/5t及以上機型,realme所有機型宽气。
2)通知消息類型
OPPO推送暫時只支持通知欄消息的推送随常。消息下發(fā)到OS系統(tǒng)模塊并由系統(tǒng)通知模塊展示,在用戶點擊通知前萄涯,不啟動應(yīng)用绪氛。整個過程環(huán)保省電。
2.1.主要功能
1)保持與服務(wù)器的長連接涝影,以便消息能夠即時推送到達(dá)客戶端枣察;
2)接收通知與自定義消息,并向開發(fā)者App 傳遞相關(guān)信息燃逻。
2.2.主要特點
1)客戶端維持連接占用資源少序目、耗電低
2)SDK集成方便,接口功能齊全
3)服務(wù)器大容量伯襟、穩(wěn)定
2.3.資源說明
4)AndroidManifest.xml:客戶端嵌入SDK參考的配置文件猿涨;
5)Libs:OPush SDK 開發(fā)包;
6)OpushDemo:是一個完整的Android 項目姆怪,通過這個演示了OPush SDK的基本用法叛赚,可以用來做代碼參考。
7)目前只支持通知欄消息稽揭,透傳消息暫不支持
2.4.版本說明
目前SDK只支持Android 4.0或以上版本的手機系統(tǒng)俺附。
OPPO推送數(shù)量限制如下圖
公信和私信的區(qū)別詳細(xì)的請查看:https://open.oppomobile.com/wiki/doc#id=10614
下面的集成教程主要分為兩個部分:
第一部分主要是申請賬號和申請appKey;(注意坑淀衣,已標(biāo)注)
第二部分主要是代碼上的實現(xiàn);
第一部分介紹:
如果要集成推送的話召调,首先需要注冊一個賬號膨桥,這里我就不多說蛮浑,只需要注意記住一點,我們需要選擇主體類型為企業(yè)(當(dāng)為主體為個人的時候不能創(chuàng)建App)點擊即可填寫相關(guān)信息只嚣。
主體類型為個人的賬戶會在后續(xù)接入推送時遇到以下場景
而主體類型為企業(yè)則如下沮稚,可以愉快的進(jìn)行下去
這個時候點擊創(chuàng)建應(yīng)用,第一個選擇框我個人選擇的是普通應(yīng)用册舞,后面兩個編輯框就不用我多說了蕴掏,appname和applicationId 直接提交就好了
=====================坑來了=====================
看到下面這個證明你的app包名沒有被注冊過撩银,但是不要以為這樣就可以直接用appkey和appsecret,這個時候坑來了鞠呈,我們需要點擊一下“推送服務(wù)”赤套,如下
然后可以看到下面這樣一個頁面入录,上面寫得很清楚剔难,這個時候需要“申請開通”一下苇羡,審核時間差不多一天(如果少了這一步感局,會出現(xiàn)這樣一個錯誤:INVALID_APP_KEY = 14; // Invalid App Key扫茅,即:無效的AppKey參數(shù))
申請成功之后于微,這里會出現(xiàn)如下字樣:點擊就可以直接進(jìn)入消息推送平臺
如何使用消息推送平臺逗嫡,官方提供了詳細(xì)的文檔,其實使用起來也很簡單株依,
沒使用過的可以點擊這個鏈接直接進(jìn)入
官方教程:https://open.oppomobile.com/wiki/doc#id=10198
到此為止 我們就把準(zhǔn)備工作做好了驱证,以下就開始看代碼上的實現(xiàn)
第二部分介紹:
老規(guī)矩,下載官方demo恋腕,注意這里官方demo剛開始會運行不起來抹锄,又一個包下載不下來,我懷疑是OPPO內(nèi)部的maven庫無法訪問導(dǎo)致的吗坚,這個時候我們只需要去官網(wǎng)下載一個jar包導(dǎo)入進(jìn)來就OK了,筆者這里的jar包是 mcssdk-2.0.2.jar
SDK下載地址:https://open.oppomobile.com/wiki/doc#id=10201
直接下載 OPPO PUSH 客戶端 SDK 解壓導(dǎo)入jar,然后注視掉上面報錯這行代碼即可
// compile 'com.heytap.mcssdk:mcssdk:2.0.3-SNAPSHOT' 注視掉rebuild就好了
這個時候如果你想用官方demo測試祈远,肯定是不行的,盡管demo里面提供了appkey和appsecret商源,但是這個已經(jīng)過期了车份,并且由于applicationId重名不能被重新申請,那么如果想用官方demo測試就有一個蠢辦法牡彻,修改官方demo的applicationId和appname扫沼。這里筆者就修改了官方demo,這里我就不贅述如何修改包名了庄吼,貼個修改包名的鏈接:https://www.e-learn.cn/content/qita/804868
首先在需要集成推送的module中的Manifast中加入權(quán)限申請
<uses-permission android:name="com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE"/>
<uses-permission android:name="com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE"/>
注冊服務(wù)
<service
android:name="com.heytap.mcssdk.PushService"
android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE">
<intent-filter>
<action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
</intent-filter>
</service>
<service android:name="com.heytap.mcssdk.AppPushService"
android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE">
<intent-filter>
<action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE"/>
</intent-filter>
</service>
在自己的application的onCreate()方法里面初始化
PushManager.getInstance().register(getApplicationContext(), AppParam.appKey, AppParam.appSecret, new OPPOPushCallback());//setPushCallback接口也可設(shè)置callback
PushManager.getInstance().requestNotificationPermission();//申請通知欄權(quán)限
其實OPPOPushCallback類就是集成自PushAdapter的一個類缎除,類里面主要關(guān)注onRegister()方法
@Override
public void onRegister(int code, String s) {
if (code == 0){
Log.i("bqt", "OPPO【注冊成功,推送ID】=" + s);
BaseData.PUSH_ID = s; // 即我們需要的registerID
} else {
//失敗之后的重試操作
// PushManager.getInstance().getRegister();
Log.i("bqt", "OPPO【注冊失敗总寻,msg=" + s + " 錯誤碼code : " + code);
}
}
這樣下來初步的推送就算已經(jīng)集成完成了
這里需要注意幾個地方:
1器罐,下面這行代碼在android8.0之前都是沒問題的,但是在Android8.0就存在適配問題渐行,會出現(xiàn)推送之后在8.0的機型上無法展示出通知的問題轰坊,這一點也可以從推送運營平臺的通知欄數(shù)據(jù)中看到
PushManager.getInstance().requestNotificationPermission();//申請通知欄權(quán)限
在消息推送平臺已經(jīng)提示了:
在官方問題技術(shù)問題列表中也有講到:(https://open.oppomobile.com/wiki/doc#id=10200)
那么肯定要進(jìn)行通道的適配了铸董,其實官方也給了建議:
OPPO官方對此的講解https://open.oppomobile.com/wiki/doc#id=10289
其實很簡單,適配代碼:請在初始化時一并調(diào)用
//oppo 設(shè)置通知通道 兼容Android8.0及以上機型
private static void notifyChannel(Application context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "default";
String channelName = "Default_Channel";
String channelDescription = "this is default channel!";
NotificationChannel mNotificationChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
mNotificationChannel.setDescription(channelDescription);
((NotificationManager)context.getSystemService(Activity.NOTIFICATION_SERVICE)).createNotificationChannel(mNotificationChannel);
}
}
2肴沫,推送后的數(shù)據(jù)如何獲取
這是官方給出的答案:但是在應(yīng)用沒有被啟動的時候粟害,點擊推送的消息,這個方法不會被調(diào)用颤芬,所以應(yīng)該在onCreate()里面加上相同的方法
目前筆者無法獲取到推送消息的消息標(biāo)題和消息內(nèi)容悲幅,只能獲取到拓展字段的內(nèi)容,如果有看官能獲取到站蝠,請留言汰具,謝謝
解析參數(shù)的代碼如下:
// 取參數(shù)值
if (getIntent().getExtras() != null) {
// 取參數(shù)值
Bundle bundle = getIntent().getExtras();
Set<String> set = bundle.keySet();
HashMap<String, String> hm = new HashMap<>();
if (set != null) {
for (String key : set) {
hm.put(key, bundle.getString(key));
}
}
Log.e("NPL", "hm的值是:" + hm.toString());
}
3,跳轉(zhuǎn)打開APP的方法有三種沉衣,其實官網(wǎng)都有介紹
1:Intent action 注意manifest中需要啟動的activity的action應(yīng)該與推送運營平臺保持一致
2:Activity manifest中需要啟動的activity的全類名
3:Intent Scheme URL 方式 manifest代碼:
<activity android:name="com.yitong.mbank.ly.hn.uat.component.AboutActivity"
android:screenOrientation="portrait"
android:launchMode="singleTop"
android:configChanges="orientation|screenSize"
android:exported="true"> //封裝module的時候可以加上這個
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https" /> //打開網(wǎng)頁時需要
<data android:scheme="http" /> //打開網(wǎng)頁時需要
<data
android:host="pushtest"
android:path="/message"
android:scheme="command" />
</intent-filter>
</activity>
官網(wǎng)中沒有提及要設(shè)置path郁副,之所以寫這個 主要是因為小米和華為都支持該種方式作為推送打開應(yīng)用的一種方式,所以豌习,我們這里為了跟其他平臺的兼容存谎,故添加了path
推送平臺應(yīng)為:
點擊動作 選擇 打開應(yīng)用內(nèi)頁
Intent Scheme URL 值為: command://pushtest/message?key=value&key1=value1
推送后在AboutActivity的onCreate()中:
String intentUrl = intent.toUri(Intent.URI_INTENT_SCHEME);
Log.i("test"," == " + intentUrl);
//打印出來的內(nèi)容為:
// intent://pushtest/message?key=value&key1=value1#Intent;scheme=command;launchFlags=0x30000000;package=com.yitong.mbank.ly.hn.uat;component=com.yitong.mbank.ly.hn.uat/.component.AboutActivity;end
最后解析這個打印出來的IntentUri就可以拿到對應(yīng)的參數(shù)(key=value&key1=vaule1)