功能概述
Xinstall是一款可以提升App推广能力和数据统计的第三方SDK。集成xinstall SDK无需手动填写邀请码,自动建立社交关系携带参数安装下载App,,该SDK能在App推广过程中实现上下级关系绑定,从而达到无需手动填写邀请码即可自动识别邀请来源等功能,获取精准的统计数据。最终提高App安装率和转化率。
XInstall 业务功能
-
传递智能参数
可以为APP的每一个安装自定义不同的初始化参数,安装后打开APP通过Xinstall精准识别,自动追踪安装来源,支持小程序、二维码、网页、短信、海报等与APP参数互传。从而实现免填邀请码安装、场景还原等功能,为数据统计做准备。 -
渠道数据统计
渠道通支持线上线下App渠道推广统计,广告效果统计,地推扫码统计等场景,渠道通可查看实时报表、实时排重,第一时间洞察渠道状况,助您灵活调整计划 -
X闪装
全程接管App安装流程,兼容各种社交平台与浏览器,大幅提升安装概率告别点击右上角,首次安装启动,直达指定场景页面减少用户操作步骤,优化用户下载安装体验,提升App推广渠道流量转化率 -
Universal Link
解决微信登录Universal Link校验不通过,无法直达APP场景页面,一分钟完成苹果Universal Link配置,最简单的配置流程
Android集成SDK
1、下载并导入 SDK
- 从下载中心下载 Android 最新版本 SDK
- 从下载的文件中,将 aar 文件拷贝到项目的libs文件夹中,并使用 gradle 导入
implementation files('libs/xinstall_vX.X.X.aar')
2、 初始化SDK
在 AndroidManifest.xml
中添加权限声明:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
在 AndroidManifest.xml
的application
标签内设置 AppKey
:
<meta-data android:name="com.xinstall.APP_KEY" android:value="XINSTALL_APPKEY"/>
备注: 将XINSTALL_APPKEY替换成 xinstall 为应用分配的appkeyApp 启动时,调用 XInstall.init(context) 方法完成 sdk 初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (isMainProcess()) {
// 初始化
XInstall.init(this);
// 启用log
XInstall.setDebug(true)
}
}
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;
}
}
示例代码 在自定义 Application
中初始化为例
备注: 当应用存在多个进程时,确保只在主进程进行初始化在 AndroidManifest.xml 中的 application 标签中添加 android:name=“.MyApplication" 指定自定义的Application类,以便程序启动的时候初始化自定义Application类,而不是系统默认的Application类
<application
android:name=".MyApplication"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
</application>
二、一键拉起
1、在AndroidManifest.xml
的拉起页面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="XINSTALL_SCHEME"/>
</intent-filter>
</activity>
如果拉起页面和启动页是同一Activity,则AndroidManifest.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="XINSTALL_SCHEME"/>
</intent-filter>
</activity>
备注:将 XINSTALL_SCHEME配置成 xninstall 为应用分配的scheme: xi40zr7uc
2、在拉起页面中如下调用相关代码,获取 web 端传过来的动态参数
class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取唤醒参数
XInstall.getWakeUpParam(getIntent(), wakeUpAdapter);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 此处要调用,否则App在后台运行时,会无法截获
XInstall.getWakeUpParam(getIntent(), wakeUpAdapter);
}
XWakeUpAdapter wakeUpAdapter = new XWakeUpAdapter() {
@Override
public void onWakeUp(XAppData XAppData) {
//获取渠道数据
String channelCode = XAppData.getChannelCode();
//获取数据
Map<String, String> data = XAppData.getExtraData();
//通过链接后面携带的参数或者通过webSdk初始化传入的data值。
String uo = data.get("uo");
//webSdk初始,在buttonId里面定义的按钮点击携带数据
String co = data.get("co");
//获取时间戳
String timeSpan = XAppData.getTimeSpan();
}
};
@Override
protected void onDestroy() {
super.onDestroy();
wakeUpAdapter = null;
}
}
三、携带安装参数
在 APP 需要安装参数时(由 web 网页中传递过来的,如邀请码、游戏房间号等动态参数),调用 XInstall.getInstall方法,在回调中获取参数(可重复获取):
XInstall.getInstallParam(new XInstallAdapter() {
@Override
public void onInstall(XAppData XAppData) {
//获取渠道数据
String channelCode = XAppData.getChannelCode();
//获取数据
Map<String, String> data = XAppData.getExtraData();
//通过链接后面携带的参数或者通过webSdk初始化传入的data值。
String uo = data.get("uo");
//webSdk初始,在buttonId里面定义的按钮点击携带数据
String co = data.get("co");
//获取时间戳
String timeSpan = XAppData.getTimeSpan();
}
});
四、渠道统计
SDK 会自动完成访问量、点击量、安装量、活跃量、留存率等统计工作。
如需统计每个渠道的注册量(对评估渠道质量很重要),可根据自身的业务规则,在确保用户完成 app 注册的情况下调用以下接口:
//用户注册成功后调用
XInstall.reportRegister();
iOS集成SDK
XInstall的核心价值在于,帮助iOS开发者通过Xinstall提供的sdk,精确的获取app每一次安装的分享(或推广)来源。
1、下载SDK并导入
下载ios最新版本SDK,解压SDK压缩包,将文件夹添加到工程中(导 入请选中Copy items if needed
2、初始化SDK
在AppDelegate中,增加头文件的引用:
//swift开发时,请使用桥接方式引入
#import "XInstallSDK.h"
增加遵守的协议:
@interface AppDelegate ()<XInstallDelegate>
在Info.plist文件中配置appKey键值对,如下:
<key>com.xinstall.APP_KEY</key>
<string>40zr7uc</string>
在application: didFinishLaunchingWithOptions:
方法中调用initWithDelegate
方法来初始化SDK,如下代码所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[XInstallSDK initWithDelegate:self];
return YES;
}
3、一键拉起
Xinstall 通过universal link(iOS≥9 ),在app已安装的情况下,从各种浏览器(包括微信、QQ、新浪微博、钉钉等主流社交软件的内置浏览器)拉起app并传递动态参数,避免重复安装。
首先,我们需要到苹果开发者网站,为当前的App ID开启关联域名(Associated Domains)服务:
为刚才开发关联域名功能的AppID创建新的(或更新现有的)描述文件,下载并导入到XCode中(通过xcode自动生成的描述文件,可跳过这一步):
在XCode中配置Xinstall为当前应用生成的关联域名(Associated Domains): applinks:40zr7uc.xinstall.top
在AppDelegate中添加通用链接(Universal Link)回调方法,委托给XinstallSDK来处理
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
//判断是否通过XInstall Universal Link 唤起App
if ([XinstallSDK continueUserActivity:userActivity]){//如果使用了Universal link ,此方法必写
return YES;
}
//其他第三方回调;
return YES;
}
如果有SceneDelegate, 则调用的方法需要放SceneDelegate
//SceneDelegate
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions API_AVAILABLE(ios(13.0)) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
// 走scene 如果是universal Link 冷启动不会调SceneDelegate 的 - (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity 方法
if (connectionOptions.userActivities.count > 0 ){
[connectionOptions.userActivities enumerateObjectsUsingBlock:^(NSUserActivity * _Nonnull obj, BOOL * _Nonnull stop) {
if ([XinstallSDK continueUserActivity:obj]) {
*stop = YES;
}
}];
}
}
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
NSLog(@"userActivity : %@",userActivity.webpageURL.description);
if (![XinstallSDK continueUserActivity:userActivity]) {
//其他第三方回调
}
}
在AppDeletegate中遵守协议,添加一键拉起的回调,获取来自H5页面的动态参数,根据参数值直达具体页
/通过Xinstall获取已经安装App被唤醒时的参数(如果是通过渠道页面唤醒App时,会返回渠道编号)
- (void)xinstall_getWakeUpParams:(nullable XInstallData *)appData {
if (appData.data) { //(动态唤醒参数)
//e.g.如免填邀请码建立邀请关系、自动加好友、自动进入某个群组或房间等
}
if (appData.channelCode) { //(通过渠道链接或二维码唤醒会返回渠道编号)
//e.g.可自己统计渠道相关数据等
}
if (appData.timeSpan > 20 ) {
//e.g. 超过20s不处理
}
NSLog(@"XinstallSDK:\n动态参数:%@;\n渠道编号:%@",appData.data,appData.channelCode);
}
4、携带安装参数
在·AppDeletegate·中遵守协议,添加安装参数的回调,获取来自H5页面的动态参数,根据参数值直达具体页:
//安装App后,通过XinstallSDK获取到传递的参数(如果是通过渠道页面安装App时,会返回渠道编号)
- (void)xinstall_getInstallParams:(nullable XInstallData *)appData {
if (appData.data) { //(动态传递参数)
//e.g.如免填邀请码建立邀请关系、自动加好友、自动进入某个群组或房间等安装事件
}
if (appData.channelCode) {//(通过渠道链接或二维码安装会返回渠道编号)
//e.g.可自己统计渠道相关数据等
}
if (appData.timeSpan > 20 ) {
//e.g. 超过20s不处理
}
NSLog(@"XinstallSDK:\n动态参数:%@;\n渠道编号:%@",appData.data,appData.channelCode);
}
而非安装后第一次启动可以通过XinstallSDK 单例的属性installData获取到
[XinstallSDK defaultManager].installData
如若installData为nill 则安装不来自于渠道
5、渠道统计
SDK初始化时会自动完成访问量、点击量、安装量、活跃量、留存率等统计工作。
注册量统计 如需统计每个渠道的注册量(对评估渠道质量很重要),可根据自身的业务规则,在确保用户完成app注册的情况下调用相关api
//用户注册成功后调用
[XinstallSDK reportRegister];
WEB集成SDK
Xinstall提供完整的javascript api
,方便web开发者实现完全自主的设计。
<!-- 以下为xinstall集成代码,建议在html文档中尽量靠前放置,加快初始化过程 -->
<!-- 强烈建议直接引用下面的cdn加速链接,可以得到最及时的更新,我们将持续跟踪各种主流浏览器的变化,提供最好的服务;不推荐将此js文件下载到自己的服务器-->
<script type="text/javascript" charset="UTF-8" src="//cdn.xinstall.com/xinstall.js"></script>
<script type="text/javascript">
//xinstall初始化,xinstall初始化时将与xinstall服务器交互,应尽可能早的调用
/*web页面向app传递的json数据(json string/js Object),应用被拉起或是首次安装时,通过相应的ios api可以获取此数据*/
var data = XInstall.parseUrlParams(); //xinstall.js中提供的工具函数,解析url中的所有查询参数
new XInstall({
/*appKey必选参数,xinstall平台为每个应用分配的appKey*/
appKey : "40zr7uc",
/*可选项,微信中打开自定义遮罩层*/
//mask:function(){
// return "<div style='background:rgba(0,0,0,.5);position:fixed;left:0;top:0;filter:alpha(opacity=50);width:100%;height:100%;z-index:9999;'><div style='text-align:right; margin-top:1%; margin-right:5%;'><img style='width:70%; margin:0 auto;' src='https://cdn.xinstall.com/image/no_safari.png'/></div></div>"
//},
/*可选项,按钮携带特殊参数安装,idName(按钮的id值),params(当前按钮点击携带的传入值,传入类型强制为Array[Object])*/
//buttonId: [
// { idName: 'downOne', params: {dataA: 'downOne', da: '1'} },
// { idName: 'downTwo', params: {dataB: 'downTwo', d: 'abc', c: 'cba'} },
// { idName: 'downThree' }
// ],
/*xinstall初始化完成的回调函数,可选*/
onready : function() {
var m = this,
button = document.getElementById("downloadButton");
button.style.visibility = "visible";
/*用户点击某个按钮时(假定按钮id为downloadButton),安装app*/
button.onclick = function() {
m.wakeupOrInstall();
}
}
}, data);
</script>
集成完成后导出development/adhoc/enterprise类型的ipa包上传,生成在线测试链接
渠道管理
新建渠道
可以使用自己的落地页来管理渠道,如果没有自己的落地页,可以只用Xinstall系统默认的页面
渠道报表
可以看到ios和Android的安装、注册以及活跃设备数