由于谷歌服務(wù)中國無法使用,android推送一直是一個大問題猴蹂,低版本的android通過極光推送等,可以通過喚醒的方式從而達到消息送達的目的,但是隨著版本的升級姐扮。極光推送在APP被殺死之后無法被喚醒,從而無法接受到推送的消息(極光推送有集成系統(tǒng)級推送方案但是收費衣吠,騰訊信鴿茶敏、友盟現(xiàn)在免費集成了系統(tǒng)通道)。下面主要是說華為推送的集成缚俏。
華為推送地址
首先咱們需要進行開發(fā)者注冊惊搏,并且認證、獲取SHA256證書指紋這些步驟就不說了忧换。說集成的具體步驟(android studio集成方式)恬惯。
第一步 下載HMS SDK Agent套件 套件下載地址(如果地址不可用的話請直接在上面華為推送地址里面自行查找) ,下載完成后進行解壓亚茬,里面有“readme.txt”有各個文件的說明酪耳,我們需要運行“GetHMSAgent_cn.bat”這個文件,然后根據(jù)提示輸入包名刹缝、appid,如果只集成推送的話只輸入這兩個幾個碗暗,cpid 直接點擊回車即可,然后根據(jù)提示選擇是否為游戲梢夯,然后輸出一個文件夾言疗,“copysrc”這個文件夾,我們需要把“AndroidManifest.xml” 里面的內(nèi)容復(fù)制到自己項目“AppManifestConfig.xml”中颂砸,然后“java”中的復(fù)制到自己項目中噪奄,路徑形式和文件中保持一致 如下圖所示。
在allprojects->repositories 里面配置HMS SDK的maven倉勤篮。
repositories {
jcenter()
maven {url 'http://developer.huawei.com/repo/'}
}
}
第三步 打開工程app下的build.gradle文件,如下圖色罚。
配置依賴文件 (這里配置的版本號是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" />
<!-- 必須, 用于接收通知欄消息點擊事件 此事件不需要開發(fā)者處理保屯,只需注冊就可以-->
<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時表示成功,其他錯誤碼參考華為推送錯誤碼
當(dāng)上面rst為0時 涤垫,“MyPushReceiver”中會接受到華為分配的token姑尺,我們可以拿著這個token在華為控制臺來進行推送測試。
寫在最后蝠猬,由于華為推送沒有向極光推送那樣的設(shè)置別名的方法切蟋,所以我們需要把華為分配的token記錄到自己的庫中,推送時根據(jù)用戶取出相應(yīng)token榆芦,并且我還沒有找到華為的推送記錄在哪里柄粹,所以最好做一下消息同送回執(zhí)喘鸟。
寫在最后
數(shù)據(jù)庫記錄token的字段一定要設(shè)置足夠長,由于我是榮耀手機并且官方文檔中token實例和我手機生成的token一模一樣驻右,我以為所有華為(包括榮耀)手機生成token長度一樣什黑,所以我數(shù)據(jù)庫設(shè)計長度為50,萬萬沒想到華為有的手機(emui9.1不知道和這個有沒有關(guān)系)生成的token長度特別長堪夭,導(dǎo)致數(shù)據(jù)庫存儲失敗愕把,所以無法進行推送。切記這個坑I:藁怼!爬迟!