前言
来来来,假设有这样一个场景,我邀请某人去下载注册一个app,这样他能获得奖励,我也可以获得奖励,那怎么匹配邀请人与被邀请人呢?
那你肯定要说了,这还不简单,邀请码啊,每个用户有自己唯一的邀请码,被邀请方下载注册后填写对应的邀请码,这不就好了吗?
然而...不麻烦吗???
如果哥哥我的app自己带有邀请码,那得多方便啊!!
推荐下载app的流程一般是:复制代码
我们可以看到,这里有一个很重要的中转站→ 浏览器。那我们是不是可以从这里做文章呢!
如果我们可以在浏览器打开的时候,把邀请码作为参数传递过去,那不就天下太平一见生财了嘛!嘿嘿,这里推荐下一篇: Android 通过浏览器打开手机app
但是这种的话,并不能保证用户一定可以拿到链接传递的参数!毕竟这种是要在已经安装了App的情况下,才可以拿到参数,所以这种是不可取的。
所以,这里该推出我们的主角了: OpenInstall
集成
- 集成jar
- 配置AndroidMainfest
权限配置
App_key配置<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>复制代码
<!--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中怎么获取数据:
- 在oncreate()中设置唤醒App时获取参数回调:
/** * 设置获取唤醒app时获取参数回调 */ private void getWakeUpInfo() { OpenInstall.getWakeUp(getIntent(), this); }复制代码
获取唤醒App时传递过来的参数
@Override public void onWakeUpFinish(AppData appData, Error error) { XLog.e(error == null ? appData.toString() : error.toString()); }复制代码
配置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的后台托管中(保证后续更新稳定),也可以直接托管到应用宝等平台,这样在鹅厂旗下的浏览器会提供支持(微信内置浏览器)