本文转自:https://juejin.im/post/59fffa5bf265da4312804d1d;作者:Mr_凌宇
前言
来来来,假设有这样一个场景,我邀请某人去下载注册一个app,这样他能获得奖励,我也可以获得奖励,那怎么匹配邀请人与被邀请人呢?
那你肯定要说了,这还不简单,邀请码啊,每个用户有自己唯一的邀请码,被邀请方下载注册后填写对应的邀请码,这不就好了吗?
然而...不麻烦吗???
如果哥哥我的app自己带有邀请码,那得多方便啊!!
推荐下载app的流程一般是:
![](https://img.haomeiwen.com/i17155076/70941348f7f71caf.jpg)
我们可以看到,这里有一个很重要的中转站→浏览器。那我们是不是可以从这里做文章呢!
如果我们可以在浏览器打开的时候,把邀请码作为参数传递过去,那不就天下太平一见生财了嘛!嘿嘿,这里推荐下一篇:Android 通过浏览器打开手机app
但是这种的话,并不能保证用户一定可以拿到链接传递的参数!毕竟这种是要在已经安装了App的情况下,才可以拿到参数,所以这种是不可取的。
所以,这里该推出我们的主角了:OpenInstall
集成
集成jar
![](https://img.haomeiwen.com/i17155076/27f4cf55624c9001.jpg)
配置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>
注意事项
![](https://img.haomeiwen.com/i17155076/70264c31a7af1e0b.jpg)
假设你的默认启动页是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请求参数。
在浏览器输入以上地址:
![](https://img.haomeiwen.com/i17155076/a481fc2b97b4082c.jpg)
回车运行
![](https://img.haomeiwen.com/i17155076/f446e27e3ddb4997.jpg)
如果是首次运行(即你手机上没有安装此app),那会进入下载页面:
![](https://img.haomeiwen.com/i17155076/a1a24426bf69a779.png)
安装后点击运行,这里我们可以获取到传递到的参数
![](https://img.haomeiwen.com/i17155076/150597b180cc8835.png)
这个时候可以修改?testKey=11111111&testKey2=3333333333333333333333参数列表,app也可以获取得到修改后的参数列表。如:修改为?testKey=keyValue后,拉起的页面为:
![](https://img.haomeiwen.com/i17155076/bf2d6737f8790e33.png)
这里是不是已经可以看出端倪了呢!
一个方法是获取安装的时候传递的参数,这个只是一次性的,只会获取一次
另一个方法是获取唤醒的时候传递的参数的,这个方法是可以无数次使用的,且参数是随时可以变化的。
到了这里,其实已经满足了我们的需求了!
![](https://img.haomeiwen.com/i17155076/05f47d3750ae637f.png)
测试
我们比较关心的是兼容问题,这边博主也花了一点时间去做测试:
测试:
1、UC浏览器,QQ浏览器等较主流的浏览器,是否可以拉起。
2、拉起的前提下,是否可以获取得到参数,以及参数是否正确。
前提:
能通过网页拉起APP的前提是:
1、手机安装有app
2、该app至少被打开过一次
3、与网络是否切换无关
测试列表:
三星:
浏览器测试通过
QQ浏览器测试通过
360浏览器测试通过
UC浏览器测试通过
小米:
浏览器测试通过
360浏览器测试通过
UC浏览器测试通过
QQ浏览器测试通过
华为:
浏览器测试通过
QQ浏览器测试通过
360浏览器测试通过
UC浏览器测试通过
VIVO:
浏览器测试通过
QQ浏览器测试通过
360浏览器测试通过
UC浏览器测试通过
HTC:
浏览器测试通过
QQ浏览器测试通过
360浏览器测试通过
UC浏览器测试通过
OPPO:
浏览器测试通过
QQ浏览器测试通过
360浏览器测试通过
UC浏览器测试通过
测试总结:
1.url我可以随便拼装
2.UC,QQ,原生都可以拉起应用
3.每次更新app都需要重新上传一个app到你们那里
4.加固混淆不影响该功能
总结:
1.基本满足了我们的需求
2.我们每次更新版本需要提交到openInstall的后台托管中(保证后续更新稳定),也可以直接托管到应用宝等平台,这样在鹅厂旗下的浏览器会提供支持(微信内置浏览器)
网友评论