本文转自:https://juejin.im/post/59fffa5bf265da4312804d1d;作者:Mr_凌宇
前言
来来来,假设有这样一个场景,我邀请某人去下载注册一个app,这样他能获得奖励,我也可以获得奖励,那怎么匹配邀请人与被邀请人呢?
那你肯定要说了,这还不简单,邀请码啊,每个用户有自己唯一的邀请码,被邀请方下载注册后填写对应的邀请码,这不就好了吗?
然而...不麻烦吗???
如果哥哥我的app自己带有邀请码,那得多方便啊!!
推荐下载app的流程一般是:
我们可以看到,这里有一个很重要的中转站→浏览器。那我们是不是可以从这里做文章呢!
如果我们可以在浏览器打开的时候,把邀请码作为参数传递过去,那不就天下太平一见生财了嘛!嘿嘿,这里推荐下一篇:Android 通过浏览器打开手机app
但是这种的话,并不能保证用户一定可以拿到链接传递的参数!毕竟这种是要在已经安装了App的情况下,才可以拿到参数,所以这种是不可取的。
所以,这里该推出我们的主角了:OpenInstall
集成
集成jar
配置AndroidMainfest
权限配置
App_key配置
android:name="com.openinstall.APP_KEY"
android:value="ipriom"/>
配置获取参数的Activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustPan|stateHidden">
注意事项
假设你的默认启动页是MainActivity,那么最好不要把2个 混搭在一起
配置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的后台托管中(保证后续更新稳定),也可以直接托管到应用宝等平台,这样在鹅厂旗下的浏览器会提供支持(微信内置浏览器)