diff --git a/RNSensorsAnalyticsModule.podspec b/RNSensorsAnalyticsModule.podspec index 3362868..a404083 100644 --- a/RNSensorsAnalyticsModule.podspec +++ b/RNSensorsAnalyticsModule.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "RNSensorsAnalyticsModule" - s.version = "1.1.3" + s.version = "1.1.4" s.summary = "The official React Native SDK of Sensors Analytics." s.description = <<-DESC 神策分析 RN 组件 @@ -14,7 +14,7 @@ Pod::Spec.new do |s| s.source_files = "ios/*.{h,m}" s.requires_arc = true s.dependency "React" - s.dependency "SensorsAnalyticsSDK" + s.dependency "SensorsAnalyticsSDK", "~> 1.11.15" end diff --git a/android/src/main/java/com/sensorsdata/analytics/RNSensorsAnalyticsModule.java b/android/src/main/java/com/sensorsdata/analytics/RNSensorsAnalyticsModule.java index 5827bc3..8d5d179 100755 --- a/android/src/main/java/com/sensorsdata/analytics/RNSensorsAnalyticsModule.java +++ b/android/src/main/java/com/sensorsdata/analytics/RNSensorsAnalyticsModule.java @@ -1,21 +1,39 @@ +/* + * Created by chenru on 2019/08/27. + * Copyright 2015-2020 Sensors Data Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.sensorsdata.analytics; import android.text.TextUtils; import android.util.Log; + +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableNativeMap; -import com.facebook.react.bridge.Callback; import com.sensorsdata.analytics.android.sdk.SensorsDataAPI; -import org.json.JSONObject; -import com.facebook.react.bridge.Promise; -import com.facebook.react.bridge.ReadableArray; -import java.util.HashSet; +import org.json.JSONObject; +import java.util.HashSet; /** @@ -58,17 +76,17 @@ private JSONObject convertToJSONObject(ReadableMap properties) { } JSONObject json = null; - ReadableNativeMap nativeMap =null; + ReadableNativeMap nativeMap = null; try { - nativeMap= (ReadableNativeMap) properties; + nativeMap = (ReadableNativeMap) properties; json = new JSONObject(properties.toString()).getJSONObject("NativeMap"); } catch (Exception e) { - Log.e(LOGTAG, ""+e.getMessage()); + Log.e(LOGTAG, "" + e.getMessage()); String superName = nativeMap.getClass().getSuperclass().getSimpleName(); try { json = new JSONObject(properties.toString()).getJSONObject(superName); } catch (Exception e1) { - Log.e(LOGTAG, ""+e1.getMessage()); + Log.e(LOGTAG, "" + e1.getMessage()); } } return json; @@ -87,15 +105,15 @@ private JSONObject convertToJSONObject(ReadableMap properties) { *

* 导出 track 方法给 RN 使用. * - * @param eventName 事件名称 + * @param eventName 事件名称 * @param properties 事件的具体属性 - *

- * RN 中使用示例:(记录 RN_AddToFav 事件,事件属性 "ProductID":123456,"UserLevel":"VIP") - * + *

+ * RN 中使用示例:(记录 RN_AddToFav 事件,事件属性 "ProductID":123456,"UserLevel":"VIP") + * */ @ReactMethod public void track(String eventName, ReadableMap properties) { @@ -107,19 +125,19 @@ public void track(String eventName, ReadableMap properties) { } } - /** + /** * 导出 trackTimerStart 方法给 RN 使用. *

* 初始化事件的计时器,默认计时单位为秒(计时开始). * * @param eventName 事件的名称. - *

- * RN 中使用示例:(计时器事件名称 viewTimer ) - * + *

+ * RN 中使用示例:(计时器事件名称 viewTimer ) + * */ @ReactMethod public void trackTimerStart(String eventName) { @@ -130,20 +148,20 @@ public void trackTimerStart(String eventName) { Log.e(LOGTAG, e.toString() + ""); } } - + /** * 导出 trackTimerBegin 方法给 RN 使用. *

* 初始化事件的计时器,默认计时单位为毫秒(计时开始). * * @param eventName 事件的名称. - *

- * RN 中使用示例:(计时器事件名称 viewTimer ) - * + *

+ * RN 中使用示例:(计时器事件名称 viewTimer ) + * */ @ReactMethod public void trackTimerBegin(String eventName) { @@ -161,13 +179,13 @@ public void trackTimerBegin(String eventName) { * 初始化事件的计时器,默认计时单位为毫秒(计时结束,并触发事件) * * @param eventName 事件的名称. - *

- * RN 中使用示例:(计时器事件名称 viewTimer ) - * + *

+ * RN 中使用示例:(计时器事件名称 viewTimer ) + * */ @ReactMethod public void trackTimerEnd(String eventName, ReadableMap properties) { @@ -207,11 +225,11 @@ public void clearTrackTimer() { * 导出 login 方法给 RN 使用. * * @param loginId RN 中使用示例: - * + * */ @ReactMethod public void login(String loginId) { @@ -248,15 +266,15 @@ public void logout() { *

* 用于记录首次安装激活、渠道追踪的事件. * - * @param eventName 事件名. + * @param eventName 事件名. * @param properties 事件属性. - *

- * RN 中使用示例:( 这里事件名为 AppInstall ,事件的渠道属性 "$utm_source":"渠道A","$utm_campaign":"广告A" ) - * + *

+ * RN 中使用示例:( 这里事件名为 AppInstall ,事件的渠道属性 "$utm_source":"渠道A","$utm_campaign":"广告A" ) + * */ @ReactMethod public void trackInstallation(String eventName, ReadableMap properties) { @@ -273,18 +291,18 @@ public void trackInstallation(String eventName, ReadableMap properties) { *

* 此方法用于 RN 中 Tab 切换页面的时候调用,用于记录 $AppViewScreen 事件. * - * @param url 页面的 url 记录到 $url 字段中(如果不需要此属性,可以传 null ). + * @param url 页面的 url 记录到 $url 字段中(如果不需要此属性,可以传 null ). * @param properties 页面的属性. - *

- * 注:为保证记录到的 $AppViewScreen 事件和 Auto Track 采集的一致, - * 需要传入 $title(页面的title) 、$screen_name (页面的名称,即 包名.类名)字段. - *

- * RN 中使用示例: - * + *

+ * 注:为保证记录到的 $AppViewScreen 事件和 Auto Track 采集的一致, + * 需要传入 $title(页面的title) 、$screen_name (页面的名称,即 包名.类名)字段. + *

+ * RN 中使用示例: + * */ @ReactMethod public void trackViewScreen(String url, ReadableMap properties) { @@ -300,13 +318,13 @@ public void trackViewScreen(String url, ReadableMap properties) { * 导出 profileSet 方法给 RN 使用. * * @param properties 用户属性 - *

- * RN 中使用示例:(保存用户的属性 "sex":"男") - * + *

+ * RN 中使用示例:(保存用户的属性 "sex":"男") + * */ @ReactMethod public void profileSet(ReadableMap properties) { @@ -325,13 +343,13 @@ public void profileSet(ReadableMap properties) { * 与profileSet接口不同的是,如果之前存在,则忽略,否则,新创建. * * @param properties 属性列表 - *

- * RN 中使用示例:(保存用户的属性 "sex":"男") - * + *

+ * RN 中使用示例:(保存用户的属性 "sex":"男") + * */ @ReactMethod public void profileSetOnce(ReadableMap properties) { @@ -351,14 +369,14 @@ public void profileSetOnce(ReadableMap properties) { * 未设置,则添加属性并设置默认值为0. * * @param property 属性名称 - * @param value 属性的值,值的类型只允许为 Number . - *

- * RN 中使用示例: - * + * @param value 属性的值,值的类型只允许为 Number . + *

+ * RN 中使用示例: + * */ @ReactMethod public void profileIncrement(String property, Double value) { @@ -370,20 +388,20 @@ public void profileIncrement(String property, Double value) { } } - /** + /** * 导出 profileAppend 方法给 RN 使用. *

* 给一个列表类型的 Profile 增加一个元素. * * @param property 属性名称. - * @param strList 新增的元素. - *

- * RN 中使用示例: - * + * @param strList 新增的元素. + *

+ * RN 中使用示例: + * */ @ReactMethod public void profileAppend(String property, ReadableArray strList) { @@ -405,13 +423,13 @@ public void profileAppend(String property, ReadableArray strList) { * 删除用户的一个 Profile. * * @param property 属性名称. - *

- * RN 中使用示例: - * + *

+ * RN 中使用示例: + * */ @ReactMethod public void profileUnset(String property) { @@ -480,19 +498,19 @@ public void getDistinctId(Callback successCallback, Callback errorCallback) { errorCallback.invoke(e.getMessage()); } } - + /** * 导出 getDistinctIdPromise 方法给 RN 使用. *

* Promise 方式,获取 distinctId *

* RN 中使用示例: - * async getDistinctIdPromise() { - * var distinctId = await RNSensorsAnalyticsModule.getDistinctIdPromise() - * }; + * async getDistinctIdPromise() { + * var distinctId = await RNSensorsAnalyticsModule.getDistinctIdPromise() + * }; */ @ReactMethod - public void getDistinctIdPromise(Promise promise){ + public void getDistinctIdPromise(Promise promise) { try { String mLoginId = SensorsDataAPI.sharedInstance().getLoginId(); if (!TextUtils.isEmpty(mLoginId)) { @@ -503,7 +521,7 @@ public void getDistinctIdPromise(Promise promise){ } catch (Exception e) { e.printStackTrace(); Log.e(LOGTAG, e.toString() + ""); - promise.reject("getDistinctId fail",e); + promise.reject("getDistinctId fail", e); } } @@ -513,32 +531,32 @@ public void getDistinctIdPromise(Promise promise){ * Promise 方式 getAnonymousId 获取匿名 ID. *

* RN 中使用示例: - * async getAnonymousIdPromise() { - * var anonymousId = await RNSensorsAnalyticsModule.getAnonymousIdPromise() - * }; + * async getAnonymousIdPromise() { + * var anonymousId = await RNSensorsAnalyticsModule.getAnonymousIdPromise() + * }; */ @ReactMethod - public void getAnonymousIdPromise(Promise promise){ + public void getAnonymousIdPromise(Promise promise) { try { promise.resolve(SensorsDataAPI.sharedInstance().getAnonymousId()); } catch (Exception e) { e.printStackTrace(); Log.e(LOGTAG, e.toString() + ""); - promise.reject("getDistinctId fail",e); + promise.reject("getDistinctId fail", e); } } - + /** * 导出 registerSuperProperties 方法给 RN 使用. * * @param properties 要设置的公共属性 - *

- * RN 中使用示例:(设置公共属性 "Platform":"Android") - * + *

+ * RN 中使用示例:(设置公共属性 "Platform":"Android") + * */ @ReactMethod public void registerSuperProperties(ReadableMap properties) { @@ -554,13 +572,13 @@ public void registerSuperProperties(ReadableMap properties) { * 导出 unregisterSuperProperty 方法给 RN 使用. * * @param property 要删除的公共属性属性 - *

- * RN 中使用示例:(删除公共属性 "Platform") - * + *

+ * RN 中使用示例:(删除公共属性 "Platform") + * */ @ReactMethod public void unregisterSuperProperty(String property) { @@ -574,14 +592,13 @@ public void unregisterSuperProperty(String property) { /** * 导出 clearSuperProperties 方法给 RN 使用. - * - *

- * RN 中使用示例:(删除所有已设置的公共属性) - * + *

+ * RN 中使用示例:(删除所有已设置的公共属性) + * */ @ReactMethod public void clearSuperProperties() { @@ -595,14 +612,13 @@ public void clearSuperProperties() { /** * 导出 flush 方法给 RN 使用. - * - *

- * RN 中使用示例:(强制发送数据到服务端) - * + *

+ * RN 中使用示例:(强制发送数据到服务端) + * */ @ReactMethod public void flush() { @@ -616,14 +632,13 @@ public void flush() { /** * 导出 deleteAll 方法给 RN 使用. - * - *

- * RN 中使用示例:(删除本地数据库的所有数据!!!请谨慎使用) - * + *

+ * RN 中使用示例:(删除本地数据库的所有数据!!!请谨慎使用) + * */ @ReactMethod public void deleteAll() { @@ -634,4 +649,43 @@ public void deleteAll() { Log.e(LOGTAG, e.toString() + ""); } } + + /** + * 导出 trackChannelEvent 方法给 RN 使用. + * + * @param eventName 事件名称 + * @param properties 事件的具体属性 RN 中使用示例:(记录 RN_AddToFav 事件,事件属性 + * "ProductID":123456,"UserLevel":"VIP") + * + */ + @ReactMethod + public void trackChannelEvent(String eventName, ReadableMap properties) { + try { + SensorsDataAPI.sharedInstance().trackChannelEvent(eventName, convertToJSONObject(properties)); + } catch (Exception e) { + e.printStackTrace(); + Log.e(LOGTAG, e.toString() + ""); + } + } + + /** + * 导出 identify 方法给 RN 使用. + *

+ * RN 中使用示例: + * + */ + @ReactMethod + public void identify(String distinctId) { + try { + SensorsDataAPI.sharedInstance().identify(distinctId); + } catch (Exception e) { + e.printStackTrace(); + Log.e(LOGTAG, e.toString() + ""); + } + } + } diff --git a/ios/RNSensorsAnalyticsModule.m b/ios/RNSensorsAnalyticsModule.m index b4b813d..60326eb 100644 --- a/ios/RNSensorsAnalyticsModule.m +++ b/ios/RNSensorsAnalyticsModule.m @@ -57,7 +57,7 @@ @implementation RNSensorsAnalyticsModule */ RCT_EXPORT_METHOD(trackTimerBegin:(NSString *)event){ @try { - [[SensorsAnalyticsSDK sharedInstance] trackTimerBegin:event]; + [[SensorsAnalyticsSDK sharedInstance] trackTimerStart:event]; } @catch (NSException *exception) { NSLog(@"[RNSensorsAnalytics] error:%@",exception); } @@ -667,5 +667,56 @@ @implementation RNSensorsAnalyticsModule } } -@end +/** + * 导出 identify 方法给 RN 使用. + * + * @param anonymousId 当前用户的 anonymousId + * + * RN 中使用示例:(在初始化 SDK 之后立即调用,替换神策分析默认分配的 *匿名 ID*) + * +*/ +RCT_EXPORT_METHOD(identify:(NSString *)anonymousId) { + @try { + [[SensorsAnalyticsSDK sharedInstance] identify:anonymousId]; + } @catch (NSException *exception) { + NSLog(@"[RNSensorsAnalytics] error:%@",exception); + } +} + +/** + * 导出 trackChannelEvent:properties 方法给 RN 使用. + * 需要 iOS SensorsAnalytics SDK 升级至 v1.11.15 及以上版本 + * + * @param event 事件名称 + * @param propertyDict 事件的具体属性 + * + * RN 中使用示例:(调用 track 接口并附加渠道信息) + * + * +*/ +RCT_EXPORT_METHOD(trackChannelEvent:(NSString *)event properties:(nullable NSDictionary *)propertyDict) { + @try { + SEL sel = NSSelectorFromString(@"trackChannelEvent:properties:"); + SensorsAnalyticsSDK *sdk = [SensorsAnalyticsSDK sharedInstance]; + if (![sdk respondsToSelector:sel]) { + NSLog(@"[RNSensorsAnalytics] error: trackChannelEvent:properties: 方法只在 iOS SensorsAnalytics SDK v1.11.15 及以上版本存在,请升级 SDK 版本至最新后再使用该功能!!!"); + return; + } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [sdk performSelector:sel withObject:event withObject:propertyDict]; +#pragma clang diagnostic pop + } @catch (NSException *exception) { + NSLog(@"[RNSensorsAnalytics] error:%@",exception); + } +} +@end diff --git a/package.json b/package.json index 077937d..db801e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sensors.data/react-native-sensors-analytics", - "version": "1.1.3", + "version": "1.1.4", "private": false, "description": "神策分析 RN 组件", "main": "index.js",