Android使用Build Variants構建不同包名的app,shareSdk如何配置以及遇到的問題

應公司業務需求,用同一代碼構建不同包名的app,這個時候想到了Build Varants,一頓操作之後發現,項目中關於第三方登錄和分享用的是shareSdk,而且是gradle方式引入的。引入文檔要求在build.gradle下面加上下面的代碼

MobSDK {
    appKey "申請Mob的appkey"
    appSecret "申請Mob的AppSecret"
    ShareSDK {} 
}

裏面填上各平臺的key和secret。那這個時候怎麼做到根據不同的包名配置對應的參數呢?

開始嘗試將sharesdk裏面的配置內容,單獨建一個文件,放在對應的源集下,如下圖在這裏插入圖片描述
然後在productFlavors裏引用,如下

app1 {
    apply from:'../app/src/app1/mobsdk.gradle'
    applicationId "com.xxx.xxx"
    versionCode rootProject.ext.versionCode
    versionName rootProject.ext.versionName
    ......
}

app2 {
    apply from:'../app/src/app2/mobsdk.gradle'
    applicationId "com.xxx.xxx"
    versionCode 107
    versionName "1.0.7"
   ......
}

經過測試發現,以上方式存在問題,並不能真正的讀取到對應的mobsdk.gradle文件裏的參數。微信登錄的時候會提示:包名不對,請檢查包名是否與開放平臺上填寫的一致。

仔細覈對微信開放平臺和應用包名,簽名,都是一致的,後來通過分析apk查看AndroidManifest文件,發現app2的mobkey以及mobsecret還是app1的配置,這樣就推翻了上面的解決方案。在productFlavors裏單獨利用apply from xxxx 引入文件並不能解決問題。後來在shareSdk官方文檔裏發現下面這段話:
在這裏插入圖片描述
有三種方式添加各平臺的參數信息。最初我是按照默認的官方集成方式選擇的是第三種,第三種不能動態配置各平臺屬性。

嘗試第一種方式,在mob後臺對應的應用下配置微信等appid,但是存在一個問題,首次安裝app,點擊微信登錄會失敗,後面再次點擊就好了,和mob技術溝通過後,是因爲程序啓動沒有正常初始化
後來嘗試在gradle裏將MobSDK的appid和appSecret寫死,是可以的。看來第一種方式也不能滿足我的需求。

嘗試第二種方式,現在build.gradle裏面將MobSdk配置加上,如下代碼:

MobSDK {
    ShareSDK {
        loopshare true
        devInfo {
            Wechat {
                enable true
            }
            WechatMoments {
                enable true
            }
            QQ {
                enable true
            }
        }
    }
}

注意,這段代碼必須要加上,不然編譯的時候不能引入相關的sdk。此時我們在build.gradle裏沒有配置任何key或者secret。那麼各平臺的屬性在哪裏配置呢?我們利用第二種方式在MobSDK.init()後配置相關參數。

/**
     * 初始化Mob
     */
    private void initMob() {
        // 這裏選擇代碼配置各平臺屬性,做成動態控制
        MobSDK.init(getApplication(),
                Utils.getStringFromConfig(R.string.mob_key),
                Utils.getStringFromConfig(R.string.mob_secret));

        // 微信屬性配置
        HashMap<String, Object> wetchatMap = new HashMap<>();
        wetchatMap.put("AppId", Utils.getStringFromConfig(R.string.wechat_appid));
        wetchatMap.put("AppSecret", Utils.getStringFromConfig(R.string.wechat_secret));
        wetchatMap.put("Enable", true);
        ShareSDK.setPlatformDevInfo(Wechat.NAME, wetchatMap);

        // 微信朋友圈屬性配置
        HashMap<String, Object> wetchatMomMap = new HashMap<>();
        wetchatMomMap.put("AppId", Utils.getStringFromConfig(R.string.wechat_moments_appid));
        wetchatMomMap.put("AppSecret", Utils.getStringFromConfig(R.string.wechat_moments_secret));
        wetchatMomMap.put("Enable", true);
        ShareSDK.setPlatformDevInfo(WechatMoments.NAME, wetchatMomMap);

        // QQ屬性配置
        HashMap<String, Object> qqMap = new HashMap<>();
        qqMap.put("AppId", Utils.getStringFromConfig(R.string.qq_appid));
        qqMap.put("AppKey", Utils.getStringFromConfig(R.string.qq_key));
        qqMap.put("ShareByAppClient", true);
        qqMap.put("Enable", true);
        ShareSDK.setPlatformDevInfo(QQ.NAME, qqMap);
    }

這樣,編譯運行不同的包名App測試,沒有出現之前的問題了。問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章