惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
Jina AI
Jina AI
C
Check Point Blog
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Last Week in AI
Last Week in AI
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
WordPress大学
WordPress大学
博客园 - 聂微东
月光博客
月光博客
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
还在用邀请码邀请注册吗?落后咯!!!我家APP自带邀请码的 - ...
2019-07-19 · via 少数派

本文转自:https://juejin.im/post/59fffa5bf265da4312804d1d

前言

来来来,假设有这样一个场景,我邀请某人去下载注册一个app,这样他能获得奖励,我也可以获得奖励,那怎么匹配邀请人与被邀请人呢?

那你肯定要说了,这还不简单,邀请码啊,每个用户有自己唯一的邀请码,被邀请方下载注册后填写对应的邀请码,这不就好了吗?

然而...不麻烦吗???

如果哥哥我的app自己带有邀请码,那得多方便啊!!

推荐下载app的流程一般是:

我们可以看到,这里有一个很重要的中转站→浏览器。那我们是不是可以从这里做文章呢!

如果我们可以在浏览器打开的时候,把邀请码作为参数传递过去,那不就天下太平一见生财了嘛!嘿嘿,这里推荐下一篇:Android 通过浏览器打开手机app

但是这种的话,并不能保证用户一定可以拿到链接传递的参数!毕竟这种是要在已经安装了App的情况下,才可以拿到参数,所以这种是不可取的。

所以,这里该推出我们的主角了:OpenInstall

集成

集成jar

配置AndroidMainfest

权限配置

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.INTERNET"/>

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的前提是:

  1. 手机安装有app
  2. 该app至少被打开过一次
  3. 与网络是否切换无关

测试列表:

  • 三星:
    代表机型:三星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 的后台托管中(保证后续更新稳定),也可以直接托管到应用宝等平台,这样在鹅厂旗下的浏览器会提供支持(微信内置浏览器)