緊接上文
我們先來(lái)看第一個(gè)問(wèn)題函筋,為什么會(huì)找不到ApkUpgradeInfo類?
根據(jù)華為官方文檔葵第,ApkUpgradeInfo類應(yīng)該屬于Huawei.Hms.update依賴庫(kù)。
但是,這里我確實(shí)添加了對(duì)Huawei.Hms.update的引用措嵌。
為了確認(rèn)ApkUpgradeInfo類是否屬于Huawei.Hms.update庫(kù),我通過(guò)在華為開(kāi)源到GitHub上的源代碼項(xiàng)目找出Huawei.Hms.update的aar文件芦缰,并掏出了反編譯查看工具-Java Decompiler(JD-GUI)企巢。
利用JD-GUI,我在Huawei.Hms.update的aar文件中找到ApkUpgradeInfo類:
既然ApkUpgradeInfo類確實(shí)存在于Huawei.Hms.update庫(kù)中饺藤,我也確實(shí)引用了Huawei.Hms.update庫(kù)包斑,那為什么在Xamarin.Android里還是看不見(jiàn)ApkUpgradeInfo類呢流礁?看來(lái)應(yīng)該是在生成綁定的過(guò)程中出了什么問(wèn)題。
我們查看一下微軟官方對(duì)綁定中可能導(dǎo)致類型丟失的解釋
再看一眼ApkUpgradeInfo類的反編譯結(jié)果罗丰,發(fā)現(xiàn)其繼承自一個(gè)被混淆的類型b神帅,符合微軟官方文檔中提到的最后一種情形:
看一下這個(gè)b類的情況:
所以,難道華為官方提供的Huawei.Hms.update庫(kù)沒(méi)有針對(duì)這個(gè)情況進(jìn)行處理萌抵?為了驗(yàn)證這一點(diǎn)找御,我自行創(chuàng)建了一個(gè)Huawei.Hms.update的綁定庫(kù):
并根據(jù)微軟官方文檔,在這個(gè)綁定庫(kù)的Metadata.xml文件中添加如下代碼:
<attr path="/api/package[@name='com.huawei.updatesdk.a.b.c.c']/class[@name='b']" name="obfuscated">false</attr>
引用這個(gè)新的綁定庫(kù)之后绍填,找不到ApkUpgradeInfo類的提示消失了霎桅。看來(lái)華為官方確實(shí)沒(méi)有對(duì)此情況進(jìn)行處理讨永,回頭我就到Github上給他們了提交一個(gè)補(bǔ)丁滔驶,所以可能當(dāng)你看到本文時(shí),問(wèn)題已經(jīng)修復(fù)了卿闹。鑒于我沒(méi)有時(shí)間等官方發(fā)布新版本揭糕,現(xiàn)在我需要用自己的綁定庫(kù)替代官方的綁定庫(kù),因此要令自己的綁定庫(kù)與官方的綁定庫(kù)一致锻霎,才能與其它的官方的綁定庫(kù)保持兼容著角。
查看nuget上Huawei.Hms.update的情況:
可知Huawei.Hms.update對(duì)另外三個(gè)庫(kù)有依賴,因此這里需要把它們添加到我自己創(chuàng)建的綁定庫(kù)的引用中:
此外還是關(guān)注版本的問(wèn)題旋恼,這在下載aar文件的時(shí)候就要注意吏口。
下面,我們來(lái)看看提示找不到IAppUpdateClient下的CheckAppUpdate和ShowUpdateDialog方法的問(wèn)題冰更。
先查看一下IAppUpdateClient在綁定庫(kù)中的代碼:
這里還是使用JD-GUI查看appservice的aar文件产徊,找到與IAppUpdateClient對(duì)的接口類AppUpdateClient:
可以看到,在綁定過(guò)程中IAppUpdateClient丟失checkAppUpdate和showUpdateDialog方法冬殃。其中checkAppUpdate方法使用了CheckUpdateCallBack接口囚痴,而showUpdateDialog方法使用了ApkUpgradeInfo類型。而這兩個(gè)類型都自來(lái)于Huawei.Hms.update庫(kù)审葬,符合微軟官方文檔提供的第一種情形深滚。解決辦法是在appservice綁定庫(kù)工程中添加對(duì)Huawei.Hms.update綁定庫(kù)的引用。
重新編譯后涣觉,找不到IAppUpdateClient下的CheckAppUpdate和ShowUpdateDialog方法的提示消失痴荐。
最后處理一下主工程中檢測(cè)接口所依賴的其它綁定庫(kù)的引用。
至此官册,檢測(cè)接口的接入完成生兆,文章最后給出改寫成Xamarin.Android形式的代碼供大家參考:
public void checkUpdate() {
IAppUpdateClient client = JosApps.GetAppUpdateClient(this);
client.CheckAppUpdate(this, new HuaweiCheckUpdateCallBack(this));
}
using System;
using Android.Content;
using Android.Util;
using Com.Huawei.Hms.Jos;
using Com.Huawei.Updatesdk.Service.Appmgr.Bean;
using Com.Huawei.Updatesdk.Service.Otaupdate;
namespace MyNameSpace {
public class HuaweiCheckUpdateCallBack : Java.Lang.Object, ICheckUpdateCallBack {
private WeakReference<Context> mContextWeakReference;
private const string TAG = "HuaweiCheckUpdateCallBack";
public HuaweiCheckUpdateCallBack(Context context) {
mContextWeakReference = new WeakReference<Context>(context);
}
public void OnUpdateInfo(Intent intent) {
if (intent != null) {
// 更新?tīng)顟B(tài)信息
int status = intent.GetIntExtra(UpdateKey.Status, -99);
Log.Info(TAG, "check update status is:" + status);
// 返回錯(cuò)誤碼
int rtnCode = intent.GetIntExtra(UpdateKey.FailCode, -99);
// 返回失敗信息
String rtnMessage = intent.GetStringExtra(UpdateKey.FailReason);
// 強(qiáng)制更新應(yīng)用時(shí),彈出對(duì)話框后用戶是否點(diǎn)擊“退出應(yīng)用”按鈕
bool isExit = intent.GetBooleanExtra(UpdateKey.MustUpdate, false);
Log.Info(TAG, "rtnCode = " + rtnCode + "rtnMessage = " + rtnMessage);
var info = intent.GetSerializableExtra(UpdateKey.Info);
// 如果info屬于ApkUpgradeInfo類型膝宁,則拉起更新彈框
if (info is ApkUpgradeInfo) {
Context context;
if (!mContextWeakReference.TryGetTarget(out context)) return;
if (context != null) {
// showUpdateDialog接口中最后一個(gè)字段傳入不同取值會(huì)帶來(lái)不同的用戶體驗(yàn)鸦难,具體請(qǐng)參考本文檔的場(chǎng)景描述根吁,此處以false為例
JosApps.GetAppUpdateClient(context).ShowUpdateDialog(context, (ApkUpgradeInfo)info, false);
}
Log.Info(TAG, "check update success and there is a new update");
}
Log.Info(TAG, "check update isExit=" + isExit);
if (isExit) {
// 是強(qiáng)制更新應(yīng)用,用戶在彈出的升級(jí)提示框中選擇了“退出應(yīng)用”合蔽,處理邏輯由您自行控制击敌,這里只是個(gè)例子
//不強(qiáng)制更新,故什么也不做
}
}
}
public void OnMarketInstallInfo(Intent p0) {
}
public void OnMarketStoreError(int p0) {
}
public void OnUpdateStoreError(int p0) {
}
}
}
接入過(guò)程中的其它細(xì)節(jié)請(qǐng)參考華為官方文檔拴事。
感謝閱讀沃斤,希望本文能對(duì)你有所幫助。