記在為Xamarin.Android項(xiàng)目接入Huawei HMS的檢測(cè)更新接口時(shí)遇到的坑(二)

緊接上文
我們先來(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ì)你有所幫助。

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刃宵,一起剝皮案震驚了整個(gè)濱河市衡瓶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牲证,老刑警劉巖哮针,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異从隆,居然都是意外死亡诚撵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門键闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人澈驼,你說(shuō)我怎么就攤上這事辛燥。” “怎么了缝其?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵挎塌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我内边,道長(zhǎng)榴都,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任漠其,我火速辦了婚禮嘴高,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘和屎。我一直安慰自己拴驮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布柴信。 她就那樣靜靜地躺著套啤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪随常。 梳的紋絲不亂的頭發(fā)上潜沦,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天萄涯,我揣著相機(jī)與錄音,去河邊找鬼唆鸡。 笑死窃判,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喇闸。 我是一名探鬼主播袄琳,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼燃乍!你這毒婦竟也來(lái)了唆樊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刻蟹,失蹤者是張志新(化名)和其女友劉穎逗旁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舆瘪,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡片效,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了英古。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淀衣。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖召调,靈堂內(nèi)的尸體忽然破棺而出膨桥,到底是詐尸還是另有隱情,我是刑警寧澤唠叛,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布只嚣,位于F島的核電站,受9級(jí)特大地震影響艺沼,放射性物質(zhì)發(fā)生泄漏册舞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一障般、第九天 我趴在偏房一處隱蔽的房頂上張望调鲸。 院中可真熱鬧,春花似錦剩拢、人聲如沸线得。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贯钩。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間角雷,已是汗流浹背祸穷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勺三,地道東北人雷滚。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吗坚,于是被迫代替她去往敵國(guó)和親祈远。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容