openinstall-react-native
Advanced tools
@@ -17,2 +17,3 @@ package com.openinstall.openinstallLibrary; | ||
| import com.facebook.react.modules.core.DeviceEventManagerModule; | ||
| import com.fm.openinstall.Configuration; | ||
| import com.fm.openinstall.OpenInstall; | ||
@@ -24,4 +25,14 @@ import com.fm.openinstall.listener.AppInstallAdapter; | ||
| public class OpeninstallModule extends ReactContextBaseJavaModule { | ||
| ReactContext context; | ||
| private static final String TAG = "OpenInstallModule"; | ||
| public static final String EVENT = "OpeninstallWakeupCallBack"; | ||
| private ReactContext context; | ||
| private Intent wakeupIntent = null; | ||
| private WritableMap wakeupDataHolder = null; | ||
| private boolean registerWakeup = false; | ||
| private boolean callInit = false; | ||
| private boolean initialized = false; | ||
| private Configuration configuration = null; | ||
| public OpeninstallModule(final ReactApplicationContext reactContext) { | ||
@@ -38,3 +49,3 @@ super(reactContext); | ||
| public void onNewIntent(Intent intent) { | ||
| Log.d("OpenInstallModule", "onNewIntent"); | ||
| Log.d(TAG, "onNewIntent"); | ||
| getWakeUp(intent, null); | ||
@@ -45,52 +56,105 @@ } | ||
| @Override | ||
| public String getName() { | ||
| return "OpeninstallModule"; | ||
| } | ||
| @ReactMethod | ||
| public void getWakeUp(final Callback successBack) { | ||
| Log.d("OpenInstallModule", "getWakeUp"); | ||
| Activity currentActivity = getCurrentActivity(); | ||
| if (currentActivity != null) { | ||
| Intent intent = currentActivity.getIntent(); | ||
| getWakeUp(intent, successBack); | ||
| } | ||
| public void config(boolean adEnabled, String oaid, String gaid) { | ||
| Configuration.Builder builder = new Configuration.Builder(); | ||
| builder.adEnabled(adEnabled); | ||
| builder.oaid(oaid); | ||
| builder.gaid(gaid); | ||
| Log.d(TAG, String.format("config adEnabled=%b, oaid=%s, gaid=%s", | ||
| adEnabled, oaid == null ? "NULL" : oaid, gaid == null ? "NULL" : gaid)); | ||
| configuration = builder.build(); | ||
| } | ||
| @ReactMethod | ||
| public void init() { | ||
| callInit = true; | ||
| OpenInstall.init(context, configuration); | ||
| initialized(); | ||
| } | ||
| private void getWakeUp(Intent intent, final Callback callback) { | ||
| OpenInstall.getWakeUp(intent, new AppWakeUpAdapter() { | ||
| @Override | ||
| public void onWakeUp(AppData appData) { | ||
| if (appData != null) { | ||
| Log.d("OpenInstallModule", "getWakeUp : wakeupData = " + appData.toString()); | ||
| String channel = appData.getChannel(); | ||
| String data = appData.getData(); | ||
| WritableMap params = Arguments.createMap(); | ||
| params.putString("channel", channel); | ||
| params.putString("data", data); | ||
| if (callback == null) { | ||
| private void initialized() { | ||
| initialized = true; | ||
| if (wakeupIntent != null) { | ||
| OpenInstall.getWakeUp(wakeupIntent, new AppWakeUpAdapter() { | ||
| @Override | ||
| public void onWakeUp(AppData appData) { | ||
| wakeupIntent = null; | ||
| if (appData != null) { | ||
| Log.d(TAG, "getWakeUp : wakeupData = " + appData.toString()); | ||
| String channel = appData.getChannel(); | ||
| String data = appData.getData(); | ||
| WritableMap params = Arguments.createMap(); | ||
| params.putString("channel", channel); | ||
| params.putString("data", data); | ||
| getReactApplicationContext() | ||
| .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) | ||
| .emit("OpeninstallWakeupCallBack", params); | ||
| } else { | ||
| callback.invoke(params); | ||
| .emit(EVENT, params); | ||
| } | ||
| } | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| @Override | ||
| public void initialize() { | ||
| super.initialize(); | ||
| OpenInstall.init(context); | ||
| @ReactMethod | ||
| public void getWakeUp(final Callback successBack) { | ||
| Log.d(TAG, "getWakeUp"); | ||
| registerWakeup = true; | ||
| checkInit(); | ||
| if (wakeupDataHolder != null) { | ||
| // 调用getWakeUp注册前就处理过拉起参数了(onNewIntent) | ||
| getReactApplicationContext() | ||
| .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) | ||
| .emit(EVENT, wakeupDataHolder); | ||
| wakeupDataHolder = null; | ||
| } else { | ||
| Activity currentActivity = getCurrentActivity(); | ||
| if (currentActivity != null) { | ||
| Intent intent = currentActivity.getIntent(); | ||
| getWakeUp(intent, successBack); | ||
| } | ||
| } | ||
| } | ||
| @Override | ||
| public String getName() { | ||
| return "OpeninstallModule"; | ||
| // 可能在用户调用初始化之前调用 | ||
| private void getWakeUp(Intent intent, final Callback callback) { | ||
| boolean isValid = OpenInstall.isValidIntent(intent); | ||
| if (!isValid) { // 如果不是 openinstall 拉起,忽略 | ||
| return; | ||
| } | ||
| if (initialized) { | ||
| OpenInstall.getWakeUp(intent, new AppWakeUpAdapter() { | ||
| @Override | ||
| public void onWakeUp(AppData appData) { | ||
| if (appData != null) { | ||
| Log.d(TAG, "getWakeUp : wakeupData = " + appData.toString()); | ||
| String channel = appData.getChannel(); | ||
| String data = appData.getData(); | ||
| WritableMap params = Arguments.createMap(); | ||
| params.putString("channel", channel); | ||
| params.putString("data", data); | ||
| if (registerWakeup) { | ||
| getReactApplicationContext() | ||
| .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) | ||
| .emit(EVENT, params); | ||
| } else { | ||
| wakeupDataHolder = params; | ||
| } | ||
| } | ||
| } | ||
| }); | ||
| } else { | ||
| wakeupIntent = intent; | ||
| } | ||
| } | ||
| @ReactMethod | ||
| public void getInstall(Integer time, final Callback callback) { | ||
| Log.d("OpenInstallModule", "getInstall"); | ||
| Log.d(TAG, "getInstall"); | ||
| checkInit(); | ||
| OpenInstall.getInstall(new AppInstallAdapter() { | ||
@@ -100,3 +164,3 @@ @Override | ||
| try { | ||
| Log.d("OpenInstallModule", "getInstall : data = " + appData.toString()); | ||
| Log.d(TAG, "getInstall : data = " + appData.toString()); | ||
| String channelCode = appData.getChannel(); | ||
@@ -117,3 +181,4 @@ String data = appData.getData(); | ||
| public void reportRegister() { | ||
| Log.d("OpenInstallModule", "reportRegister"); | ||
| Log.d(TAG, "reportRegister"); | ||
| checkInit(); | ||
| OpenInstall.reportRegister(); | ||
@@ -124,3 +189,4 @@ } | ||
| public void reportEffectPoint(String pointId, Integer pointValue) { | ||
| Log.d("OpenInstallModule", "reportEffectPoint"); | ||
| Log.d(TAG, "reportEffectPoint"); | ||
| checkInit(); | ||
| if (!TextUtils.isEmpty(pointId) && pointValue >= 0) { | ||
@@ -130,2 +196,9 @@ OpenInstall.reportEffectPoint(pointId, pointValue); | ||
| } | ||
| private void checkInit() { | ||
| if (!callInit) { | ||
| Log.d(TAG, "插件从1.3.0开始,提供初始化接口,如未调用初始化调用其它接口,插件内部将使用默认配置初始化"); | ||
| init(); | ||
| } | ||
| } | ||
| } |
+13
-15
@@ -62,16 +62,13 @@ ### iOS 手动集成方式 | ||
| (2)初始化sdk的代码 | ||
| AppDelegate.m 的 `didFinishLaunchingWithOptions` 方法里面添加如下代码: | ||
| ``` | ||
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||
| { | ||
| //初始化openinstall sdk | ||
| [OpenInstallSDK initWithDelegate:[RCTOpenInstall allocWithZone:nil]]; | ||
| (2)初始化sdk的代码 | ||
| **为配合隐私政策合规方案,即App首次安装需要用户手动同意后,才可初始化SDK** | ||
| **插件版本1.3.0开始,初始化代码改由用户主动调用方式,在react native端入口js文件中(例如App.js文件)调用init方法** | ||
| return YES; | ||
| } | ||
| ``` | ||
| 插件版本1.3.0之前的初始化方案: | ||
| 即在AppDelegate.m 的 `didFinishLaunchingWithOptions` 方法里面添加代码([OpenInstallSDK initWithDelegate:[RCTOpenInstall allocWithZone:nil]];),如果升级1.3.0,可删除该代码 | ||
| (3)scheme相关代码 | ||
| AppDelegate.m 里面添加如下代码: | ||
| AppDelegate.m 里面添加如下代码: | ||
| **插件版本1.3.0开始,[OpenInstallSDK handLinkURL:url]方法改为[RCTOpenInstall handLinkURL:url],由插件内部完成后续工作** | ||
| ``` | ||
@@ -81,3 +78,3 @@ //iOS9以上,会优先走这个方法 | ||
| //openURL1 | ||
| [OpenInstallSDK handLinkURL:url]; | ||
| [RCTOpenInstall handLinkURL:url]; | ||
| return YES; | ||
@@ -88,3 +85,3 @@ } | ||
| //openURL2 | ||
| [OpenInstallSDK handLinkURL:url]; | ||
| [RCTOpenInstall handLinkURL:url]; | ||
| return YES; | ||
@@ -95,7 +92,8 @@ } | ||
| (4)universal link相关代码 | ||
| AppDelegate.m 里面添加如下代码: | ||
| AppDelegate.m 里面添加如下代码: | ||
| **插件版本1.3.0开始,[OpenInstallSDK continueUserActivity:userActivity]方法改为[RCTOpenInstall continueUserActivity:userActivity],由插件内部完成后续工作** | ||
| ``` | ||
| - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{ | ||
| //univeral link | ||
| [OpenInstallSDK continueUserActivity:userActivity]; | ||
| [RCTOpenInstall continueUserActivity:userActivity]; | ||
| return YES; | ||
@@ -102,0 +100,0 @@ } |
+19
-0
@@ -14,3 +14,22 @@ import { | ||
| static config(adEnabled, oaid, gaid){ | ||
| if(Platform.OS === 'android'){ | ||
| OpeninstallModule.config(adEnabled, oaid, gaid) | ||
| }else{ | ||
| // ignore, platform unsupport | ||
| } | ||
| } | ||
| /** | ||
| * 初始化 | ||
| */ | ||
| static init(options){ | ||
| if(Platform.OS == 'android'){ | ||
| OpeninstallModule.init() | ||
| }else{ | ||
| OpeninstallModule.initSDK(options) | ||
| } | ||
| } | ||
| /** | ||
| * 获取安装动态参数 | ||
@@ -17,0 +36,0 @@ * @param {Int} s 超时时长,一般为10~15s 如果只是在后台默默统计或使用参数,可以设置更长时间 |
@@ -20,2 +20,3 @@ // | ||
| //#define OpenInstallWakeUpCallBackNotification @"OpenInstallWakeUpCallBackNotification" | ||
@@ -26,2 +27,6 @@ | ||
| + (id<OpenInstallDelegate> _Nonnull)allocWithZone:(NSZone *_Nullable)zone; | ||
| + (void)handLinkURL:(NSURL *)url; | ||
| + (void)continueUserActivity:(NSUserActivity *)userActivity; | ||
| @end |
@@ -34,3 +34,6 @@ // | ||
| @property (nonatomic, strong)NSDictionary *wakeUpParams; | ||
| @property (nonatomic, assign)BOOL notFirstLoad; | ||
| @property (nonatomic, assign)BOOL wakeupStat; | ||
| @property (nonatomic, assign)BOOL initStat; | ||
| @property (nonatomic, strong)NSURL *handleURL; | ||
| @property (nonatomic, strong)NSUserActivity *userActivity; | ||
| @end | ||
@@ -44,4 +47,4 @@ | ||
| static RCTOpenInstall *sharedInstance = nil; | ||
| + (id)allocWithZone:(NSZone *)zone { | ||
| static RCTOpenInstall *sharedInstance = nil; | ||
| static dispatch_once_t onceToken; | ||
@@ -55,5 +58,23 @@ dispatch_once(&onceToken, ^{ | ||
| + (void)initOpenInstall:(NSDictionary *)params{ | ||
| [RCTOpenInstall allocWithZone:nil]; | ||
| if (!sharedInstance.initStat) { | ||
| sharedInstance.initStat = YES; | ||
| NSString *adid = @""; | ||
| if (params[@"adid"]) { | ||
| adid = params[@"adid"]; | ||
| } | ||
| [OpenInstallSDK initWithDelegate:sharedInstance advertisingId:adid]; | ||
| [RCTOpenInstall check]; | ||
| } | ||
| } | ||
| RCT_EXPORT_METHOD(initSDK:(NSDictionary *)params) | ||
| { | ||
| [RCTOpenInstall initOpenInstall:params]; | ||
| } | ||
| RCT_EXPORT_METHOD(getInstall:(int)s completion:(RCTResponseSenderBlock)callback) | ||
| { | ||
| [RCTOpenInstall initOpenInstall:@{}]; | ||
| NSTimeInterval time = 10.0f; | ||
@@ -79,3 +100,4 @@ if (s>0) { | ||
| if (self.bridge) { | ||
| [self.bridge.eventDispatcher sendAppEventWithName:OpeninstallWakeupCallBack body:nil]; | ||
| // [self.bridge.eventDispatcher sendAppEventWithName:OpeninstallWakeupCallBack body:nil]; | ||
| [self.bridge enqueueJSCall:@"RCTDeviceEventEmitter" method:@"emit" args:@[OpeninstallWakeupCallBack] completion:NULL]; | ||
| } | ||
@@ -86,3 +108,4 @@ return; | ||
| if (self.bridge) { | ||
| [self.bridge.eventDispatcher sendAppEventWithName:OpeninstallWakeupCallBack body:params]; | ||
| // [self.bridge.eventDispatcher sendAppEventWithName:OpeninstallWakeupCallBack body:params]; | ||
| [self.bridge enqueueJSCall:@"RCTDeviceEventEmitter" method:@"emit" args:@[OpeninstallWakeupCallBack,params] completion:NULL]; | ||
| }else{ | ||
@@ -97,3 +120,4 @@ @synchronized(self){ | ||
| { | ||
| if (!self.notFirstLoad) { | ||
| [RCTOpenInstall allocWithZone:nil]; | ||
| if (!self.wakeupStat) { | ||
| if (self.wakeUpParams.count != 0) { | ||
@@ -105,3 +129,3 @@ NSArray *params = @[self.wakeUpParams]; | ||
| } | ||
| self.notFirstLoad = YES; | ||
| self.wakeupStat = YES; | ||
| } | ||
@@ -112,2 +136,3 @@ } | ||
| { | ||
| [RCTOpenInstall initOpenInstall:@{}]; | ||
| [OpenInstallSDK reportRegister]; | ||
@@ -118,2 +143,3 @@ } | ||
| { | ||
| [RCTOpenInstall initOpenInstall:@{}]; | ||
| [[OpenInstallSDK defaultManager] reportEffectPoint:effectID effectValue:effectValue]; | ||
@@ -123,2 +149,37 @@ } | ||
| + (void)handLinkURL:(NSURL *)url{ | ||
| [RCTOpenInstall wakeupParamStored:url]; | ||
| } | ||
| + (void)continueUserActivity:(NSUserActivity *)userActivity{ | ||
| [RCTOpenInstall wakeupParamStored:userActivity]; | ||
| } | ||
| + (void)wakeupParamStored:(id)handle{ | ||
| [RCTOpenInstall allocWithZone:nil]; | ||
| if (sharedInstance.initStat) { | ||
| if ([handle isKindOfClass:[NSURL class]]) { | ||
| [OpenInstallSDK handLinkURL:(NSURL *)handle]; | ||
| }else{ | ||
| [OpenInstallSDK continueUserActivity:(NSUserActivity *)handle]; | ||
| } | ||
| }else{ | ||
| if ([handle isKindOfClass:[NSURL class]]) { | ||
| sharedInstance.handleURL = (NSURL *)handle; | ||
| }else{ | ||
| sharedInstance.userActivity = (NSUserActivity *)handle; | ||
| } | ||
| } | ||
| } | ||
| + (void)check{ | ||
| if (sharedInstance.handleURL) { | ||
| [OpenInstallSDK handLinkURL:sharedInstance.handleURL]; | ||
| sharedInstance.handleURL = nil; | ||
| } | ||
| if (sharedInstance.userActivity) { | ||
| [OpenInstallSDK continueUserActivity:sharedInstance.userActivity]; | ||
| sharedInstance.userActivity = nil; | ||
| } | ||
| } | ||
| @end |
+33
-18
@@ -50,10 +50,10 @@ | ||
| var hasCoded = rf.match(/OpenInstallSDK initWithDelegate/); | ||
| if(hasCoded == null){ | ||
| rf = rf.replace(matchFinishLaunching[0], matchFinishLaunching[0] + "\n\t" | ||
| + "[OpenInstallSDK initWithDelegate:[RCTOpenInstall allocWithZone:nil]];"); | ||
| if(hasCoded != null){ | ||
| rf = rf.replace("[OpenInstallSDK initWithDelegate:[RCTOpenInstall allocWithZone:nil]];","\n"); | ||
| console.log(path + "\n插件版本1.3.0开始,初始化方法将由用户主动调用的方式来进行,请参考最新文档\n"); | ||
| //rf = rf.replace(matchFinishLaunching[0], matchFinishLaunching[0] + "\n\t" | ||
| //+ "[OpenInstallSDK initWithDelegate:[RCTOpenInstall allocWithZone:nil]];"); | ||
| } | ||
| }else{ | ||
| console.log("没有匹配到 didFinishLaunchingWithOptions"); | ||
| err = true; | ||
| } | ||
| var matchOpenURL1 = rf.match(/\n.*openURL.*options.*\n?\{/); | ||
@@ -66,8 +66,14 @@ if(matchOpenURL1 == null){ | ||
| }else{ | ||
| var hasCoded = rf.match(/openURL1\n.*OpenInstallSDK handLinkURL/); | ||
| var hasCodedTrash = rf.match(/OpenInstallSDK handLinkURL/); | ||
| if(hasCodedTrash != null){ | ||
| rf = rf.replace("[OpenInstallSDK handLinkURL:url];","\n"); | ||
| console.log(path + "\n插件版本1.3.0开始,新方法[RCTOpenInstall handLinkURL:]将替代原先的[OpenInstallSDK handLinkURL:]方法\n"); | ||
| } | ||
| var hasCoded = rf.match(/RCTOpenInstall handLinkURL/); | ||
| if(hasCoded == null){ | ||
| rf = rf.replace(matchOpenURL1[0], matchOpenURL1[0] | ||
| + "\n\t\/\/openURL1" | ||
| + "\n\t[OpenInstallSDK handLinkURL:url];"); | ||
| + "\n\t\/\/openURL1" | ||
| + "\n\t[RCTOpenInstall handLinkURL:url];"); | ||
| } | ||
| } | ||
@@ -78,11 +84,15 @@ var matchOpenURL2 = rf.match(/\n.*openURL.*sourceApplication.*\n?\{/); | ||
| + "\n\t\/\/openURL2" | ||
| + "\n\t[OpenInstallSDK handLinkURL:url];\n\treturn YES;\n}" | ||
| + "\n\t[RCTOpenInstall handLinkURL:url];\n\treturn YES;\n}" | ||
| + "\n@end"); | ||
| }else{ | ||
| var hasCoded = rf.match(/openURL2\n.*OpenInstallSDK handLinkURL/); | ||
| var hasCodedTrash = rf.match(/OpenInstallSDK handLinkURL/); | ||
| if(hasCodedTrash != null){ | ||
| rf = rf.replace("[OpenInstallSDK handLinkURL:url];","\n"); | ||
| console.log(path + "\n插件版本1.3.0开始,新方法[RCTOpenInstall handLinkURL:]将替代原先的[OpenInstallSDK handLinkURL:]方法\n"); | ||
| } | ||
| var hasCoded = rf.match(/openURL2\n.*RCTOpenInstall handLinkURL/); | ||
| if(hasCoded == null){ | ||
| rf = rf.replace(matchOpenURL2[0], matchOpenURL2[0] | ||
| + "\n\t\/\/openURL2" | ||
| + "\n\t[OpenInstallSDK handLinkURL:url];"); | ||
| rf = rf.replace(matchOpenURL2[0], matchOpenURL2[0] + "\n\t\/\/openURL2" + "\n\t[RCTOpenInstall handLinkURL:url];"); | ||
| } | ||
| } | ||
@@ -93,11 +103,16 @@ | ||
| rf = rf.replace("@end","- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{" | ||
| + "\n\t[OpenInstallSDK continueUserActivity:userActivity];" | ||
| + "\n\t[RCTOpenInstall continueUserActivity:userActivity];" | ||
| + "\n\treturn YES;\n}" | ||
| + "\n@end"); | ||
| }else{ | ||
| var hasCoded = rf.match(/OpenInstallSDK continueUserActivity/); | ||
| var hasCodedTrash = rf.match(/OpenInstallSDK continueUserActivity/); | ||
| if(hasCodedTrash != null){ | ||
| rf = rf.replace("[OpenInstallSDK continueUserActivity:userActivity];","\n"); | ||
| console.log(path +"\n插件版本1.3.0开始,新方法[RCTOpenInstall continueUserActivity:]将替代原先的[OpenInstallSDK continueUserActivity:]方法\n"); | ||
| } | ||
| var hasCoded = rf.match(/RCTOpenInstall continueUserActivity/); | ||
| if(hasCoded == null){ | ||
| rf = rf.replace(matchContinueUserActivity[0], matchContinueUserActivity[0] + "\n\t" | ||
| + "[OpenInstallSDK continueUserActivity:userActivity];"); | ||
| rf = rf.replace(matchContinueUserActivity[0], matchContinueUserActivity[0] + "\n\t" + "[RCTOpenInstall continueUserActivity:userActivity];"); | ||
| } | ||
| } | ||
@@ -104,0 +119,0 @@ |
+1
-1
| { | ||
| "name": "openinstall-react-native", | ||
| "version": "1.2.7", | ||
| "version": "1.3.0", | ||
| "description": "openinstall sdk plugin for react-native", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
+76
-14
| # Openinstall React Native Plugin | ||
| openinstall-react-native 是openinstall官方开发的 React Native 插件,使用该插件可以方便快速地集成openinstall相关功能。 | ||
| **针对使用了 渠道统计 功能中的 广告渠道 效果监测功能的集成,需要参考 [补充文档](#ad)** | ||
| **从1.3.0开始,插件将不再自动初始化,需要用户手动调用初始化接口** | ||
| # 一、使用 npm 安装插件 | ||
@@ -64,14 +67,21 @@ | ||
| ## 三、使用指南 | ||
| ### 1. 快速下载 | ||
| 如果只需要快速下载功能,无需其它功能(携带参数安装、渠道统计、一键拉起),完成sdk初始化即可(自动集成方式或手动集成方式) | ||
| ### 1. 初始化 | ||
| ### 2. 一键拉起 | ||
| #### 导入插件 | ||
| 请react native端入口js文件中(例如App.js文件)导入: | ||
| ``` | ||
| 请在 react native 端入口 js 文件中(例如 `App.js` 文件)导入: | ||
| ``` js | ||
| import OpeninstallModule from 'openinstall-react-native' | ||
| ``` | ||
| #### 获取拉起参数 | ||
| 通常在 `componentDidMount` 中监听 | ||
| 确保用户同意《隐私政策》之后,再初始化 openinstall。参考 [应用合规指南](https://www.openinstall.io/doc/rules.html) | ||
| ``` js | ||
| OpeninstallModule.init() | ||
| ``` | ||
| **iOS用户使用插件1.3.0之前的版本升级到新版本,需要参考新的手动集成文档修改** | ||
| ### 2. 快速下载 | ||
| 如果只需要快速下载功能,无需其它功能(携带参数安装、渠道统计、一键拉起),完成sdk初始化即可(自动集成方式或手动集成方式) | ||
| ### 3. 一键跳转 | ||
| 通常在 `componentDidMount` 中注册唤醒回调监听 | ||
| ``` js | ||
| componentDidMount() { | ||
@@ -83,3 +93,3 @@ //该方法用于监听app通过univeral link或scheme拉起后获取唤醒参数 | ||
| } | ||
| Alert.alert('拉起回调',JSON.stringify(map)) | ||
| Alert.alert('唤醒参数', JSON.stringify(map)) | ||
| } | ||
@@ -96,3 +106,3 @@ OpeninstallModule.addWakeUpListener(this.receiveWakeupListener) | ||
| ### 3. 携带参数安装(高级版功能) | ||
| ### 4. 携带参数安装(高级版功能) | ||
| 在需要获取安装参数的位置,导入插件: | ||
@@ -103,3 +113,3 @@ ``` | ||
| 调用如下方法,可重复获取(理论上可在任意位置获取安装参数): | ||
| ``` | ||
| ``` js | ||
| OpeninstallModule.getInstall(10, map => { | ||
@@ -109,3 +119,3 @@ if (map) { | ||
| } | ||
| Alert.alert('安装回调',JSON.stringify(map)) | ||
| Alert.alert('安装参数', JSON.stringify(map)) | ||
| }) | ||
@@ -117,3 +127,3 @@ ``` | ||
| ### 4. 渠道统计(高级版功能) | ||
| ### 5. 渠道统计(高级版功能) | ||
| SDK 会自动完成访问量、点击量、安装量、活跃量、留存率等统计工作。 | ||
@@ -134,2 +144,54 @@ | ||
| - 代码集成完毕后,需要导出安装包上传openinstall后台,openinstall会自动完成所有的应用配置工作。 | ||
| - 上传完成后即可开始在线模拟测试,体验完整的App安装/拉起流程;待测试无误后,再完善下载配置信息。 | ||
| - 上传完成后即可开始在线模拟测试,体验完整的App安装/拉起流程;待测试无误后,再完善下载配置信息。 | ||
| <a id="ad"></a> | ||
| ## 广告平台接入补充文档 | ||
| **Android 平台** | ||
| (1)针对广告平台接入,新增配置接口,在调用 init 之前调用。参考 [广告平台对接Android集成指引](https://www.openinstall.io/doc/ad_android.html) | ||
| ``` js | ||
| /** | ||
| * adEnabled 为 true 表示 openinstall 需要获取广告追踪相关参数,默认为 false | ||
| * oaid 为 null 时,表示交由 openinstall 获取 oaid, 默认为 null | ||
| * gaid 为 null 时,表示交由 openinstall 获取 gaid, 默认为 null | ||
| */ | ||
| OpeninstallModule.config(true, "通过移动安全联盟获取到的 oaid", "通过 google api 获取到的 advertisingId"); | ||
| ``` | ||
| 例如: 开发者自己获取到了 oaid,但是需要 openinstall 获取 gaid,则调用代码为 | ||
| ``` js | ||
| // f32a09dc-3312-d43e-6583-62fac13f33ae 是通过移动安全联盟获取到的 oaid | ||
| OpeninstallModule.config(true, "f32a09dc-3312-d43e-6583-62fac13f33ae", null); | ||
| ``` | ||
| (2)为了精准地匹配到渠道,需要获取设备唯一标识码(IMEI),因此需要做额外的权限申请 | ||
| 在 `AndroidMainfest.xml` 配置文件中添加需要申请的权限 `<uses-permission android:name="android.permission.READ_PHONE_STATE"/>` | ||
| (3)申请权限并初始化 | ||
| 导入包 | ||
| ``` js | ||
| import { PermissionsAndroid } from 'react-native' | ||
| ``` | ||
| 在 `App.js` 的 `componentDidMount` 方法中初始化,并且在初始化之前申请权限 | ||
| ``` js | ||
| this.receiveWakeupListener = map => { | ||
| Alert.alert('唤醒参数', JSON.stringify(map)) | ||
| } | ||
| var permission = PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE; | ||
| PermissionsAndroid.request(permission) | ||
| .then(granted => { | ||
| if (granted === PermissionsAndroid.RESULTS.GRANTED){ | ||
| //权限获取成功 | ||
| }else{ | ||
| //权限获取失败 | ||
| } | ||
| OpeninstallModule.config(true, null, null); | ||
| OpeninstallModule.init(); | ||
| OpeninstallModule.addWakeUpListener(this.receiveWakeupListener) | ||
| }) | ||
| ``` | ||
| **iOS 平台** | ||
| 使用第三方插件获取iOS idfa 并传给 openinstall 插件进行初始化 | ||
| ``` js | ||
| var options = {adid: "通过第三方插件获取的 iOS idfa"} | ||
| OpeninstallModule.init(options); | ||
| ``` |
3352652
0.3%584
20.16%190
48.44%