1. 产品介绍

Shareinstall是APP推广的黑科技,具有智能传参、个性安装、多维数据统计等产品功能,可适用于多种应用场景,例如:免填邀请码绑定邀请关系、免打包跨平台渠道推广、APP一键拉起、地推数据高效统计、渠道来源精准统计、移动广告效果追踪、用户社交分享统计等。同时shareinstall拥有大规模服务器集群、大规模商业数据基础、通过了大批量合作商数据实测,将为您提供以一个精准、有效、安全的服务环境。

1.1 特色服务

(1)智能传递参数

用户安装、下载、打开、拉起应用等行为均可通过点击H5页面产生的链接进行自定义参数的智能传递,通过shareinstall后台大数据算法的精准识别匹配来源邀请行为,绑定邀请、好友关系。亦可根据参数直达应用指定场景,如聊天室、游戏室、商品详情页面等。

(2)快速分享安装

用户通过点击H5页面分享的链接即可实现快速安装功能。省略了中间步骤,减少了因步骤繁多而引起的用户流失,并可通过scheme结合universal link技术实现一键唤醒app功能,安装后可直达指定页面。兼容国内外主流社交平台,智能快速的同时更提升了用户体验。

(3)多维数据统计

多元化的数据统计功能包含新增、活跃、启动等多重指标,直达用户行为分析。支持添加多重渠道,能够精准的核算销售地推业绩、掌握用户传播价值、辨识最佳的推广渠道、监测和衡量广告投放效果,为精细化运营决策提供数据支持。

1.2应用场景

(1)免邀请码绑定邀请关系

传统的手动填码增加了用户的操作步骤并且无法避免填写错误的问题,一旦用户因繁琐的操作体验放弃填写邀请码将导致大幅度的用户流失,使拉新转化率都处于一个较低的水平。 而shareinstall在APP安装前通过分享链接自动获取和传递参数,安装后则通过shareinstall后台大数据的算法精准识别,匹配来源邀请行为,绑定邀请、好友关系。在整个过程中无需用户手动操作,大大提升了用户体验的幸福感。同时通过精准高效的关系匹配自动建立用户关系的操作行为使活动效率大大提升,技术人员也无需在进行新系统的开发,在成本上也较为低廉。

(2)免打包跨平台渠道推广

传统的做法是对不同渠道进行分包发布,每个渠道都需要开发人员手动打一个具有唯一标识的渠道安装包,当渠道较多时会导致工作强度增加、工作效率降低、错误率增加等弊端情况。 而shareinstall用渠道链接代替渠道安装包,在提高效率的同时更加智能精准。同时shareinstall支持APP推广渠道链接动态生成,是游戏发行、联运CPS利器。

(3)APP应用一键拉起

APP一键拉起功能适用于多种应用场景,例如:一键加入游戏房间、快速链接商品页面、直接加入好友聊天、一键领取优惠券等等。以分享“某音”视频为例,当好友刷“某音时”看到了有价值的视频想与你分享并发送你一个链接,你可以直接通过点击链接进行指定视频界面,无需退出查找房间ID再次进入。简言之基本原理如下: A点击邀请按钮产生分享链接给B,shareinstall在大环境下追踪来源(例如:来自A的邀请),B通过链接打开APP直达所需场景。

(4)地推数据高效统计

用户可通过shareinstall管理台自定义渠道链接,实现地推人员人手一码,高效缓解用户拒绝填写邀请码的情况,同时有效的避免了数据造假、地推人员抱怨等情况。从开发角度来说,使用shareinstall可以有效的避免渠道分包统计,减轻技术人员工作量,为企业节约成本。

(5)移动广告效果追踪

在当下互联网时代广告投放是较为高效的推广方式,然而广告投放的渠道日益增多,用户无法辨别有效渠道,这也导致高成本低效率的现象出现。Shareinstall通过网页集成JS SDK,将生成的链接进行动态拼接并将拼接后的链接与CPS渠道参数进行对应,然后通过客户端集成shareinstall ios和Android sdk获取网页携带渠道参数并传递给APP服务端,服务器获取渠道参数后进行统计。这种方式能够精确追踪安装渠道来源、一键排重直击异常渠道并且支持独立报表加密分享。

(6)用户社交分享统计

社交分享是内容分发的有效途径,在用户社交分享的过程中可以体验产品的增值服务,有效的实现拉新促活,更加精准的获取到目标用户。Shareinstall主要通过网页集成shareinstall js sdk,通过集成的js sdk 写入识别用户身份的唯一ID,然后通过网页集成shareinstall js sdk,通过集成的js sdk 写入识别用户身份的唯一ID,APP服务端接收来自客户端的用户ID,进而实现用户间关系的绑定,同时还可通过shareinstall后台对统计数据进行查看。

(7)渠道来源精准统计

渠道来源统计是大部分用户的痛点,主要体现在:渠道拓展受限、海量渠道统计复杂、打包分包流程繁琐等方面。而shareinstall将为您提供一个安全稳定的环境,让您能够自定义渠道信息并进行批量管理,免打包、分包,有效的区分渠道来源,更能为您提供详细的渠道报表、有效的监控渠道数据,辨识最佳的推广渠道。

1.3业务原理

2.接入流程

2.1创建账号,创建应用,获取AppKey

(1)登录shareinstall管理台,完善资料,使用邮箱/手机号码进行注册登录。

(2)登录管理台后,在应用管理页面点击“创建应用”并填写您的应用名称即可完成应用创建。

(3点击“详细”按钮进入后台界面,可在左侧导航栏获取AppKey,亦可在“应用信息”中查看AppKey及更多详细应用信息。

注意:为了避免个人离职造成应用交接不方便的问题,建议开发者使用企业邮箱或者公共邮箱进行注册。

2.2下载并集成SDK,API

可通过shareinstall官网SDK下载页面或“shareinstall管理台-应用集成”模块中下载SDK并进行集成(可根据您的需求选择Android集成/ios集成/web集成),集成后根据提示上传apk/ipa包,最后进行应用配置,需确保AppKey配置准确。

注:apk/ipa包一定要上传!

2.3根据开发文档接入APP、H5

根据开发文档集成shareinstall相应功能,将shareinstall提供的文件,配置至包和js代码之中。

2.4相应功能测试

使用shareinstall控制台提供的在线测试功能,或者自行完成功能测试。如遇到问题可以咨询我方,我方提供前期接入的技术支持服务。

3.注册并开始

注册和登录账号

首次登录Shareinstall需使用邮箱和手机号进行注册。 (友情提示:如果非个人开发者,建议使用公司邮箱) 点击首页右上角“进入管理台”按钮进入shareinstall的控制台。若未注册,则需以邮箱为用户名佐以手机号码验证进行注册;若已有账号,则可直接通过注册时的邮箱或手机号码进行登录。 注:Shareinstall登录采用邮箱或手机号加密码的形式进行登录。

创建应用

登录到shareinstall管理台后则可进行应用创建,每个应用对应着一个APPKEY即对应着一个付费的账号。应用创建后可在详情页中修改应用图标、应用名称等信息。此外,首次创建将会获得为期一周的免费使用时间,用于深入了解Shareinstall产品和测试。平台数据模块对ios和安卓有区分,建议ios、安卓使用同一个APPKEY。

4.指标说明

新增用户:第一次启动的用户,以设备作为判断标准
启动用户: 打开应用视为视为启动,完全退出或者后台运行超过30s后再次进入应用,视为新的启动
时段累计日活:启动过的应用的用户,启动过一次就视为活跃用户,包含新用户和老用户。这里指的时截止至各个整点时刻的当日活跃用户
累计用户:截止至目前所有启动过应用的独立用户数
活跃用户:启动过应用的用户,启动一次即视为活跃,包含新用户和老用户。
APP访问量:H5链接引导唤醒app的用户数量,已去重处理
APP安装量:H5链接引导用户下载的app的用户数量,已去重处理
APP注册量:注册成功的时调用[ShareInstallSDK reportRegister] 方法计入统计

5.快速集成文档

5.1安卓集成

1、导入SDK

SDK优先提供aar包,如需jar包,请联系客服 把下载的ShareInstallSdk.zip文件解压,将ShareInstall_x.x.x.aar文件拷贝到项目的libs文件夹中,并在当前项目下的build.gradle文件中导入(注:不是项目的根目录build.gradle文件)

dependencies {
    compile(name: 'ShareInstall_1.2.0', ext:  'aar')
}
(注:导入aar前需检查当前项目下的build.gradle文件中(不是项目的根目录build.gradle文件),android标签下是否已经加入以下代码,否则会报错)
repositories {
    flatDir {
        dirs 'libs'
    }
}

2、基础配置

在AndroidMainfest.xml中添加权限声明。

<!-- 连接互联网Internet权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许应用程序联网,以便向我们的服务器端发送数据。 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在AndroidMainfest.xml中的application标签中添加分配给你应用的Appkey
<meta-data    
    android:name="com.shareinstall.APP_KEY"
    android:value="shareinstall为当前应用分配的appkey"/>
在自定义Application中调用ShareInstall.getInstance().init(context)方法完成SDK初始化,初始化前先判断当前进程是否是应用的主进程。
public class MyApp extends  Application {

    @Override
    public void onCreate() {
        super.onCreate();
        if (isMainProcess()) {
            ShareInstall.getInstance().init(getApplicationContext());
        }
    }

   /**
    * 判断当前进程是否是应用的主进程
    *
    * @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;
    }
}
如需统计每个渠道的注册量(对评估渠道质量很重要),可根据自身的业务规则,在确保用户完成 app 注册的情况下调用以下方法: 注意该方法要在ShareInstall.getInstance().init (context)方法之后调用,否则会抛异常。
// 用户注册成功后调用注册接口
ShareInstall.getInstance().reportRegister();
在AndroidMainfest.xml中的application标签中添加android:name=".MyApplication"指定自定义的Application类,以便程序启动的时候初始化自定义Application类,而不是系统默认的Application类。
<application
        android:name=".MyApplication"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
</application>

3、一键跳转

在AndroidMainfest的唤醒页面activity标签中添加intent-filter(一般为MainActivity),配置scheme,用于浏览器中拉起。

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    <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="shareinstall为当前应用分配的scheme" />
    </intent-filter>
</activity>
注:如果唤醒页面和启动页是同一Activity,则AndroidMaifest.xml的配置如下。
<activity
        android:name=".MainActivity"
        android:launchMode="singleTask">
    <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="shareinstall为当前应用分配的scheme"/>
    </intent-filter>
</activity>
个性化安装和一键唤醒都调用同一个方法ShareInstall.getInstance().getInfo()获取相关信息,第一个参数为Intent(注:Intent可传null,但在配置了scheme唤醒的页面必须传,否则拿不到传递过来的参数),第二个参数为信息回调监听

4、个性化安装

在APP需要个性化安装参数时(由web网页中传递过来的,如邀请码、游戏房间号等 自定义参数),调用以下方法,在回调中获取参数(该方法可重复调用)。

// 注意:SDK调用getInfo方法获取参数是异步操作,请确保在onGetInfoFinish回调中拿到参数后才去处理自己的业务逻辑

ShareInstall.getInstance().getInfo(getIntent(), new AppGetInfoListener() {
    @Override
    public void onGetInfoFinish(String info) {
     // 客户端获取到的参数是json字符串格式
    Log.d("ShareInstall", "info = " + info);
     try {
            JSONObject object = new JSONObject(info);
             // 通过该方法拿到设置的渠道值,剩余值为自定义的其他参数
            String channel = object.optString("channel");
                Log.d("ShareInstall", "channel = " + channel);
            } catch (JSONException e) {
                e.printStackTrace();
            }
    }
});

5、在配置了ShareInstall scheme的拉起页面中调用下面相关代码,获取从网页H5页面传过来的动态参数

public class WakeUpActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wake_up);
        // 获取唤醒参数
        ShareInstall.getInstance().getInfo(getIntent(), listener);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // 此处要调用,否则app在后台运行时,会无法截获
        ShareInstall.getInstance().getInfo(intent, listener);
    }
    // 注意:SDK调用getInfo方法获取参数是异步操作,请确保在onGetInfoFinish回调中拿到参数后才去处理自己的业务逻辑
    private AppGetInfoListener listener = new AppGetInfoListener() {
        @Override
        public void onGetInfoFinish(String info) {
            // 客户端获取到的参数是json字符串格式
            Log.d("ShareInstall", "info = " + info);
            try {
                    JSONObject object = new JSONObject(info);
                     // 通过该方法拿到设置的渠道值,剩余值为自定义的其他参数
                    String channel = object.optString("channel");
                    Log.d("ShareInstall", "channel = " + channel);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
    };

5.2 IOS集成

1、产品原理

精确的App安装来源与携带参数安装 :shareInstall的核心价值在于,帮助Android/iOS开发者通过shareInstall提供的sdk,精确的获取app每一次安装的分享(或推广)来源。原理如下:开发者在分享的h5页面上集成 shareInstall web sdk,发布分享链接时在url上动态的拼接任意的自定义参数(如推广渠道号,邀请码等等);当某一终端访问该h5页面时,shareinstall web sdk将同时确定该设备的个性化信息和采集自定义参数,上传至shareInstall服务器, 待用户通过该h5页面安装app后首次打开时(如当前设备已安装该app,将直接拉起该app并传递参数),使用shareInstall Android/iOS sdk从shareInstall服务器再取回暂存的自定义参数。

一键拉起功能:shareInstall通过标准的scheme、universal link 等技术,在app已安装的情况下,从各种浏览器(包括微信、QQ、新浪微博、钉钉等主流社交软件的内置浏览器)拉起app并传递自定义参数,避免重复安装,如没安装则调至appStore或应用宝下载app,下载完毕唤起app的相应页面。

2、iOS SDK集成

1、初始化

1.1 获取shareinstall 的AppKey

登录shareinstall后台管理(http://www.shareinstall.com/login.html),按照步骤提示注册应用,可获得AppKey。

1.2 导入SDK

下载 iOS 最新版本 SDK,解压 SDK 压缩包,将文件夹导入工程中(导入请选中 “Copy items if needed” )

1.3 初始化SDK

在AppDelegate中,增加头文件的引用:

#import “ShareInstallSDK.h”
//swift开发时,请使用桥接方式引入

                                            //在-(BOOL)application:
                                                didFinishLaunchingWithOptions:
                                                方法中调用setAppKey方法来初始化SDK,如下代码所示:
                                            - (BOOL)application:(UIApplication *)application
                                            didFinishLaunchingWithOptions:(NSDictionary
                                            *)launchOptions {
                                            [ShareInstallSDK setAppKey:@"shareinstall为当前应用分配的appkey"
                                            withDelegate:self
                                            WithOptions:launchOptions];
                                            return YES;
                                            }
                                    
注:AppKey需填写自己的AppKey,请到ShareInstall官网后台查看自己应用的AppKey。

3、个性化安装

3.1 如果只需要快速下载功能,无需其它功能(携带参数安装、渠道统计、一键拉起),完成初始化即可。

3.2 当应用安装后首次打开时,iOS sdk会收到网页端通过js sdk传来的自定义动态参数,精确的获取app每一次安装的分享(或推广)来源。比如通过在分享链接url中附带app邀请人的用户id,就可达到免填邀请码的效果;url中可拼接自定义的参数。在AppDelegate中,添加获取安装参数的回调方法,代码如下所示:
#pragma mark ShareInstallDelegate
//通过ShareInstall获取自定义参数,数据为空时也会调用此方法
- (void)getInstallParamsFromSmartInstall:(id) params withError: (NSError *) error{
NSLog(@"安装参数params=%@",params);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"直接点击App进来的" message: params delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    //弹出提示框(便于调试,调试完成后删除此代码)
    [alert show];
}

3.3 用户也可在具体的业务场景需要参数的位置主动调用下面的方法获取参数。(根据业务场景来调用该api方法),调用getInstallCallBackBlock方法,获取自定义参数(可重复调用)。不要自行保存动态参数。

    [[ShareInstallSDKgetInitializeInstance] getInstallCallBackBlock:^(NSString*jsonStr){
      if(jsonStr){ //动态安装参数
             //拿到参数,处理客户自己的逻辑
    }
}];

注:客户可根据具体的业务场景,需要参数的位置调用该方法(在业务场景时,网络一般都是通畅的)。例如可选择在用户注册成功后调用该方法获取参数。原因是iOS首次安装、首次启动的app,会询问用户获取网络权限,用户允许后SDK才能正常联网去获取参数。如果调用过早,可能导致网络权限还未允许就被调用,导致参数无法及时拿到,误以为参数不存在。

4、一键拉起

4.1 ShareInstall通过标准的scheme、universal link等技术,在app安装的情况下,从各种浏览器(微信、QQ、新浪微博、钉钉等主流社交软件的内置浏览器)唤醒 app 并传递自定义参数,避免重复安装。

4.2 配置App的URL Scheme(适用于ios各个系统版本)

4.2.1 iOS系统中App之间是相互隔离的,通过URL Scheme,App之间可以相互调用,并且可以传递参数。
选中Target-Info-URL Types,配置URL Scheme。

注:identifier 要一定配置为 com.ShareInstall,URL Schemes从shareInstall获取()。

在Safari中输入URL Scheme :// ,如果可以唤起App,说明URL Scheme配置成功。

4.2.2 在AppDelegate中添加 URL Scheme 回调方法,委托给ShareInstallSDK来处理
注意:当需要在shareInstall这个方法中处理第三方回调的时候(比如支付宝、微信回调等),请注意区分。

 //iOS9以下 URL Scheme
-(BOOL)application:(UIApplication *)application openURL:(NSURL
*)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

 //判断是否通过ShareInstall URL Scheme 唤起App
if ([ShareInstallSDK handLinkURL:url]) {
    return YES ;
}else{
 //其他代码
    return YES ;
}
    return YES ;
}

 //iOS9以上 URL Scheme
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
options:(nonnull NSDictionary *)options
{
 //判断是否通过ShareInstall URL Scheme 唤起App

if ([ShareInstallSDK handLinkURL:url]) {
    return YES ;
}else{
 //其他代码
    return YES ;
}
    return YES ;
}

4.2.3 在AppDeletegate中遵守协议,添加一键拉起的回调,获取来自 H5 页面的动态参数,根据参数值直达具体页。

- (void)getWakeUpParamsFromSmartInstall: (id) params withError: (NSError *) error{
    NSLog(@"唤醒参数params=%@",params);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL shceme 进来的" message: params delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
     //弹出提示框(便于调试,调试完成后删除此代码)
    [alert show];
}

4.3 配置Universal link(通用链接),只适用于ios9.0以上。

4.3.1 Universal link是ios9的一个新特性,通过Universal link实现一键直达。如果使用URL Scheme的话,需要先打开Safari,用户体验变得很差。如果未安装app,还会出现下面错误的对话框:

所以为了用户更好的体验,我们强烈推荐配置Universal link。

4.3.2 配置developer.apple.com的相关信息
登录 https://developer.apple.com,选择Certificate, Identifiers & Profiles,选择相应的AppID,开启Associated Domains服务。

4.3.3 配置Xcode

在Xcode中配置ShareInstall为当前应用生成的关联域名:Associated Domains 开关打开,添加Domains:

在AppDelegate中添加通用链接(Universal Link)回调方法,委托给 ShareinstallSDK 来处理。

    //Universal Links 通用链接
    - (BOOL)application:(UIApplication *)application
    continueUserActivity:(NSUserActivity
    *)userActivity restorationHandler:(void (^)(NSArray *
    _Nullable))restorationHandler
    {
    //判断是否通过ShareInstall Universal Links 唤起App
    if ([ShareInstallSDK continueUserActivity:userActivity]) {
        return YES ;
    }else{
    //其他代码
        return YES ;
    }
    }

在AppDeletegate中遵守协议,添加一键拉起的回调,获取来自 H5 页面的动态参数,根据参数值直达具体页。

- (void)getWakeUpParamsFromSmartInstall: (id) params withError: (NSError *) error{
    NSLog(@"唤醒参数params=%@",params);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL shceme 进来的" message: params delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
     //弹出提示框(便于调试,调试完成后删除此代码)
    [alert show];
}

5、注册量统计

使用Shareinstall控制中心提供的渠道统计时,在App用户注册完成后调用,可以统计渠道注册量。 必须在注册成功的时调用方法,否则可能导致注册统计不准。

[ShareInstallSDK reportRegister];

5.3 WEB集成

shareinstall提供完整的javascript api,方便Web开发者实现完全自主的设计

集成步骤:

1、推广页中引用jshareinstall.min.js文件

特别提示:请直接使用此链接,不要将此链接下载到您项目中,否则,在更新数据接口或API的时候可能会导致链接失效。

<script type="text/javascript" src="//www.shareinstall.com.cn/js/page/jshareinstall.min.js?v=53701ed729"></script>

2、在HTML页面中增加一个或者多个打开app的元素标签

一般开发者会使用CSS样式重置这个链接的外观,使其看起来像一个按钮,建议使用“打开APP”、“在APP中购买”、“在APP中阅读”等对用户有实际引导意义的文案,请尽量避免使用“下载APP”,在以往的用户使用习惯中我们发现使用“下载APP”的链接对比使用“打开APP”的链接的点击率会低。

  < a href='javascript:void(0);'  id='downloadButton'></a>

3、在H5页面中动态传参

在集成页面的地址后面以key=value的形式进行拼接参数进行传参。如果参数过长,建议使用在url后面传id,在页面中通过id值来获取参数,并把参数加入初始化Shareinstall的data对象中,可以URL更加优雅简洁。

4、参数说明

<script type="text/javascript">
    //shareinstall初始化,初始化时将与shareinstall服务器交互,应尽可能早的调用
    /*web页面向app传递的json数据(json string/js Object),应用被拉起或是首次安装时,通过相应的android/ios api可以获取此数据*/
    var data = ShareInstall.parseUrlParams();//shareinstall.js中提供的工具函数,解析url中的所有查询参数
    new ShareInstall({
        appKey : 'shareinstall为当前应用分配的appkey',
         //可选项,微信中打开自定义遮罩层
         //shadow : function(){
         //  return "<div id='shareinstall_shadow' style='position:fixed;left:0;top:0;background:rgba(0,255,0,0.5);filter:alpha(opacity=50);width:100%;height:100%;z-index:10000;'></div>"
         // },
         /*可选参数,是否优先考虑下载app,以牺牲唤醒为代价*/
         //preferInstall:true,
         /*可选参数,是否优先考虑拉起app,以牺牲下载体验为代价*/
         //preferWakeup:true,
         /*可选参数,微信中直接跳下载*/
         //weChatdownload:true,
        onready : function() {
            //shareinstall已成功回调
            var m = this, button = document.getElementById("downloadButton");
            button.style.visibility = "visible";

            /*用户点击某个按钮时(假定按钮id为downloadButton),安装app*/
            button.onclick = function() {
                m.wakeupOrInstall();
            }
        }
    }, data);
</script>

6、常见问题

6.1 IOS常见问题

(1)通用链接在iOS 11.2+ 中,偶尔会出现失效,无法唤醒拉起app,为什么?
这是因为苹果iOS 11.2+ 出现的系统bug导致的(偶然发生的),解决方法“删除app,重启设备,重新安装app”,苹果目前还没有完全解决这个问题,我们将持续跟进。
(2)微信中为什么不能唤醒,通用链接(Universal Links)被禁用了?
微信在6.6.1版本后,禁止了Universal Links的使用,将提示右上角打开Safari来拉起app,其它app和浏览器不受影响。
(3)什么情况safari浏览器出现“打不开该网页,因为网页无效”?
这是因为safari在通过scheme执行跳转时,如果app不存在,系统就会出现这样的提示。
(4)重签名的安装包,如果无法正常使用通用链接来唤醒怎么办?
重签包是无法正常使用通用链接来唤醒app的,重签包需要配置scheme来唤醒app。
(5)iOS 无法获取自定义参数?
首先检查是否按照官方文档正常集成相关的代码; 是否将集成好的ipa包上传到官网平台; 检查是否是覆盖安装或者隔天安装,需卸载app安装且h5传参是有时效性的。
(6)iOS 下载包时,appstore地址和集成下载地址哪个地址优先级最高?
不填写任何地址就会下载上传到平台的包,填写appstore地址就会跳转appstore去下载,填写集成下载地址,就跳转这个地址下载包,优先级最高。
(7)为什么会提示当前iOS平台的集成工作尚未完成,请登录Shareinstall官网查看详情?
检查是否已经上传IPA包到我们平台,且已经上传10分钟(上传10分钟后生效)。 检查h5落地页是否拼接了自定义参数。
(8)为什么上传了ipa包,提示不能安装或者此时无法安装?
如果打的ipa包是非企业包,需要开发把设备的UDID加入到苹果开发者中心,重新生成证书的描述文件,上传更新ipa包。

6.2 安卓常见问题

(1)为什么无法导入SDK?
请先明确你使用的是什么开发工具,官方提供的aar是给Android Studio客户使用的,如果是Eclipse客户,请联系客服发你jar版本,不要自己按照网上说法把aar自行解压取出jar。
(2)为什么拿不到自定义参数?
*请确保客户端和web端是否都已按照文档正确集成;
*请确保appkey是否在有效期内,比如过了体验期或付费时间已到;
*手机必须先打开过集成了web sdk的H5页面,然后再去启动app,另外参数具有2h时效性,超过2h后才去启动app也会拿不到参数。
*请使用真机测试,模拟器和真机有区别,有些功能可能无法正常使用、手机一些参数获取不到等等。
(3)为什么无法唤醒?
*请确保客户端是否在AndroidManifest.xml中配置了平台自动分配的scheme属性;
*请确保web端是否已按照文档正确集成;
*微信内部屏蔽了scheme,请在浏览器中打开链接或集成应用宝地址;
*有些浏览器上开启代理抓包后也会出现无法唤醒的情况,所以请关闭代理尝试。
(4)为什么打开网页会提示当前Android平台的集成工作尚未完成,请登录shareinstall官网查看详情?
*检查是否已经上传了apk文件到ShareInstall官网;
*上传apk文件后是否10分钟以后再测试(上传成功需要10分钟生效时间);
*检查H5链接地址是否拼接了自定义参数。
(5)Android集成下载地址是否要必须填写?
不是必须填写,如果不填写就会走你上传到我们平台的包,这样子的话那你每次发新包都得在我们平台更新,不然用户下的还是之前老的包,如果你填写了地址(可以为应用宝地址或你自己内部服务器地址),那就优先走你的地址,你只要保证你的地址是最新包就行了。
(6)更换域名或ip地址等等会导致appkey失效吗?
不会,只要appkey在有效期内就能正常使用, 但是更换包名后需要注意下: 更换了包名那你需要重新在我们平台上传新的包,打个比方,你现在的包名是A,如果你把你现在的包名以后换成了B,那么B肯定首先是不能使用的,你要把B重新上传到我们平台进行替换,这样子的话B可以正常使用了,但是原来那些还装着A包名的就不能使用了。

6.3 WEB常见问题

(1)自定义参数该怎么传递?
自定参数一般是落地页的地址后面以key=value的形式传递,如果参数过长,建议通过一个唯一标志获取参数,在页面中直接写入。
(2)为什么没有获取到自己的参数?
没有获取到参数有很多原因,WEB端的话请确认appkey是否和应用的appkkey一致。是否正常调用了wakeupOrInstall方法。
(3)为什么有些浏览器不能唤醒?
微信内置浏览器以及部分小众浏览器禁用了scheme链接的唤醒方式。
(4)集成和测试时,web端需要注意哪些问题?
*app端测试无误后,可以在自己的下载网页(或者分享页)里面集成我们的web文档,来实现和在线测试二维码一样的传递参数功能;
*集成时需要注意,触发下载时必须调用我们的下载api。不能自己额外写其他的下载代码来引导,还有下载api要用按钮触发执行(不能自动执行或者伪点击触发),否则影响参数的获取和精度。