友盟ionic多渠道自動簽名app

這幾天公司的運營部門要求添加流量統計功能,集成了友盟的插件,中間遇到不少的問題,在這裏說明記錄一下,爲遇到相同問題的朋友們減小麻煩javascript

問題1、插件的使用直接將友盟sdk系在放置到項目根目錄下plugins文件夾下,並進行配置,主要須要配置plugins下的兩個文件html

1.android.jsonjava

  在dependent_plugins下添加android

  

"Umeng": {
    "PACKAGE_NAME": "你的appid"
}    

2.fetch.jsonjson

  在其末尾添加以下代碼app

  

    "Umeng": {
        "source": {
            "type": "local",
            "path": "umeng"
        },
        "is_top_level": true,
        "variables": {}
    }

問題2、多渠道自動生成且自動簽名重命名,參考文檔http://www.jianshu.com/p/7236ceca2630ionic

cordova默認使用的是gradle進行打包的,多渠道分發的須要手動生成不少文件,比較麻煩,如今介紹批量生成修改渠道且簽名份額被指方法,fetch

1.須要生成簽名,詳細步驟請看 http://www.cnblogs.com/happen-/p/5991794.htmlgradle

2.須要先在項目根目錄下運行ionic build android --releaseui

3.修改platform/android下的文件

(1)AndroidManifest.xml

在application節點下找到<meta-data android:name="UMENG_CHANNEL" android:value="你設置的值" />

改成<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_ID}" />

(2)新建release-signing.properties

並添加內容

keyAlias = ***//證書別名
keyPassword = ***//密碼可與證書密碼同樣
storeFile = tianji.keystore//證書路徑
storePassword = tianji//證書密碼

(3)新建文件proguard-rules.pro,內容可爲空,沒有文件生成文件會報錯

(4)重要部分,須要配置build.gradle

  1.找到productFlavors節點,修改成以下部分

  

    productFlavors {
     //名字是渠道的名稱 baidu { } google { } wandoujia { } xiaomi { } owen { } }

  2.找到signingConfigs節點

  修改以下

  

        signingConfigs {
            release {
                // These must be set or Gradle will complain (even if they are overridden).
                keyAlias "**"//能夠寫成**,會讀取release-signing.properties文件
                keyPassword "***" //能夠寫成**
                storeFile file('***')//須要一個名字不能是**,證書的路徑
                storePassword "***"//能夠寫成**
     } }

  3.找到buildTypes節點,

  替換以下

  

        buildTypes {
            release {
                zipAlignEnabled true
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.release
            }
        }

  4.在android節點內部的最後部分添加以下代碼

  

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // 重命名產出的apk文件
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                File outputDirectory = new File(outputFile.parent);
                def fileName
                if (variant.buildType.name == "release") {
                    fileName = "${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "${defaultConfig.versionCode}_}_debug.apk"
                }
                output.outputFile = new File(outputDirectory, fileName)
            }

            // 刪除unaligned apk
            if (output.zipAlign != null) {
                output.zipAlign.doLast {
                    output.zipAlign.inputFile.delete()
                }
            }
        }
    }

  而後在platform/android下依次運行命令

  gradlew clean

  gradlew assembleRelease

 

 

  補充說明:通過幾天的實驗,肯定以上方法存在問題,下邊是緣由以及解決方法,

  緣由:官方給的插件須要本身初始化,

  初始化方法:在run》$ionicPlatform.ready內部添加MobclickAgent.init('你的appid','渠道');

  固然這裏不能這麼寫,由於上邊的多渠道分發只是更改xml內部信息,可是不能更改js代碼

  只須要該一下插件內部src>android>UMPlugin.java

  在頭部添加

  

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;

  在execute方法內部的init改成一下代碼,這段代碼的主要做用是初始化插件,可是appid和渠道是從配置文件內部讀取

  

        if (action.equals("init")) {
            try{
                ApplicationInfo appInfo = mContext.getPackageManager()
                        .getApplicationInfo(mContext.getPackageName(),
                                PackageManager.GET_META_DATA);
                String appKey=appInfo.metaData.getString("UMENG_APPKEY");
                String channelId=appInfo.metaData.getString("UMENG_CHANNEL");                
                MobclickAgent.startWithConfigure(new UMAnalyticsConfig(mContext, appKey, channelId));
                MobclickAgent.setScenarioType(mContext, EScenarioType.E_UM_NORMAL);
                MobclickAgent.onResume(mContext);
            }catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            // String appKey = args.getString(0);
            // String channelId = args.getString(1);
            return true;
        }    

  而後在將調用初始化方法內部的兩個參數刪掉便可

  

MobclickAgent.init();
相關文章
相關標籤/搜索