🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

openinstall-react-native

Package Overview
Dependencies
Maintainers
3
Versions
49
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

openinstall-react-native - npm Package Compare versions

Comparing version
1.2.7
to
1.3.0
+112
-39
android/src/main/j...eninstallLibrary/OpeninstallModule.java

@@ -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();
}
}
}

@@ -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 @@ }

@@ -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

@@ -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 @@

{
"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);
```