本文轉自:https://juejin.im/post/59fffa5bf265da4312804d1d;作者:Mr_淩宇
前言來來來,假設有這樣一個場景,我邀請某人去下載注冊一個app,這樣他能獲得獎勵,我也可以獲得獎勵,那怎麼匹配邀請人與被邀請人呢?
那你肯定要說了,這還不簡單,邀請碼啊,每個用戶有自己唯一的邀請碼,被邀請方下載注冊後填寫對應的邀請碼,這不就好了嗎?
然而...不麻煩嗎???
如果哥哥我的app自己帶有邀請碼,那得多方便啊!!
推薦下載app的流程一般是:
我們可以看到,這裡有一個很重要的中轉站→浏覽器。那我們是不是可以從這裡做文章呢!
如果我們可以在浏覽器打開的時候,把邀請碼作為參數傳遞過去,那不就天下太平一見生财了嘛!嘿嘿,這裡推薦下一篇:Android 通過浏覽器打開手機app
但是這種的話,并不能保證用戶一定可以拿到鍊接傳遞的參數!畢竟這種是要在已經安裝了App的情況下,才可以拿到參數,所以這種是不可取的。
所以,這裡該推出我們的主角了:OpenInstall
集成集成jar
配置AndroidMainfest
權限配置
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
App_key配置
<!--openInstall 的appKey -->
<meta-data
android:name="com.openinstall.APP_KEY"
android:value="ipriom"/>
<!--end of openInstall 的appKey -->
配置獲取參數的activity
<!--主頁面-->
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustPan|stateHidden">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="op4nd2v6"/>
</intent-filter>
</activity>
注意事項
假設你的默認啟動頁是MainActivity,那麼最好不要把2個 混搭在一起
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="op4nd2v6"/>
</intent-filter>
配置Application
在onCreate()中配置
if (isMainProcess()) {
OpenInstall.init(this);
OpenInstall.setDebug(true);
}
/**
* 判斷是否是主進程
*
* @return
*/
public boolean isMainProcess() {
int pid = android.os.Process.myPid();
ActivityManager activityManager = (ActivityManager) getSystemService
(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : activityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return getApplicationInfo().packageName.equals(appProcess.processName);
}
}
return false;
}
配置混淆文件
#忽略警告
-dontwarn com.fm.openinstall.**
#避免混淆
-keep public class com.fm.openinstall.* {*; }
獲取參數
我們看下MainActivity中怎麼獲取數據:
(1)在oncreate()中設置喚醒App時獲取參數回調:
/**
* 設置獲取喚醒app時獲取參數回調
*/
private void getWakeUpInfo() {
OpenInstall.getWakeUp(getIntent(), this);
}
(2)獲取喚醒App時傳遞過來的參數
@Override
public void onWakeUpFinish(AppData appData, Error error) {
XLog.e(error == null ? appData.toString() : error.toString());
}
(3)配置onNewIntent
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//此處要調用,否則App在後台運行時,會無法截獲
OpenInstall.getWakeUp(intent, this);
}
以上的話,其實我們可以自己實現,通過上面提供的文章,這步我們完全可以自己做到。
但是另外一個方法,目前博主也想不出來是怎麼實現的:
/**
* 獲取安裝的時候從web端傳遞過來的參數信息
*/
private void getInfo() {
OpenInstall.getInstall(new AppInstallListener() {
@Override
public void onInstallFinish(AppData appData, Error error) {
if (error == null) {
if (appData == null) {
return;
}
if (!TextUtils.isEmpty(appData.getData())) {
Toast.makeText(MainActivity.this, "從網頁喚醒app" appData.toString(), Toast.LENGTH_SHORT).show();
}
} else {
XLog.e("error--------------" error.toString());
}
}
});
}
這裡我們解釋下兩個方法的區别:
getInfo
onWakeUpFinish
上面的是首次安裝走的回掉,下面的是app已經存在,網頁直接喚醒app走的回掉,場景不同。
這裡是不是已經有點蒙了呢!看下哥們之前寫的測試文檔:
測試url地址測試:
https://app-ipriom.openinstall.io/js-test?
testKey=11111111&testKey2=3333333333333333333333
testKey=11111111&testKey2=3333333333333333333333可以随意添加,其實就是get請求參數。
- 在浏覽器輸入以上地址:
- 回車運行
- 如果是首次運行(即你手機上沒有安裝此app),那會進入下載頁面:
- 安裝後點擊運行,這裡我們可以獲取到傳遞到的參數
- 這個時候可以修改?testKey=11111111&testKey2=3333333333333333333333 參數列表,app也可以獲取得到修改後的參數列表。如:修改為?testKey=keyValue 後,拉起的頁面為:
這裡是不是已經可以看出端倪了呢!
- 一個方法是獲取安裝的時候傳遞的參數,這個隻是一次性的,隻會獲取一次
- 另一個方法是獲取喚醒的時候傳遞的參數的,這個方法是可以無數次使用的,且參數是随時可以變化的。
到了這裡,其實已經滿足了我們的需求了!
測試
我們比較關心的是兼容問題,這邊博主也花了一點時間去做測試:
測試:
- UC浏覽器,QQ浏覽器等較主流的浏覽器,是否可以拉起。
- 拉起的前提下,是否可以獲取得到參數,以及參數是否正确。
前提:
能通過網頁拉起APP的前提是:
- 手機安裝有app
- 該app至少被打開過一次
- 與網絡是否切換無關
測試列表:
三星:
- 代表機型:三星s8
- 原生浏覽器測試通過
- QQ浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
小米:
- 代表機型:小米6
- 原生浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
- QQ浏覽器測試通過
華為:
- 代表機型:華為P9 (高配全網通)
- 原生浏覽器測試通過
- QQ浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
酷派:
- 代表機型:酷派大神Note3
- 原生浏覽器測試通過
- QQ浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
VIVO:
- 代表機型:VIVOX9I
- 原生浏覽器測試通過
- QQ浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
HTC:
- 代表機型:HTCm9w
- 原生浏覽器測試通過
- QQ浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
OPPO:
- 代表機型:OPPOR9S
- 原生浏覽器測試通過
- QQ浏覽器測試通過
- 360浏覽器測試通過
- UC浏覽器測試通過
測試總結:
1.url我可以随便拼裝
2.UC,QQ,原生都可以拉起應用
3.每次更新app都需要重新上傳一個app到你們那裡
4.加固混淆不影響該功能
總結:1.基本滿足了我們的需求
2.我們每次更新版本需要提交到openInstall的後台托管中(保證後續更新穩定),也可以直接托管到應用寶等平台,這樣在鵝廠旗下的浏覽器會提供支持(微信内置浏覽器)
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!