diff --git a/README.md b/README.md index 6371421..a491ff7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ React Native的TalkingData插件 ### 首先安装npm包 ```bash -npm install react-native-talkingdata --save +npm install @cross2d/react-native-talkingdata --save ``` ### link @@ -16,6 +16,23 @@ rnpm link #### Note: rnpm requires node version 4.1 or higher +### 自动link注意 +#### Android版本需要手动修改如下配置 +``` +app/build.gradle中 +compile project(':@cross2d/react-native-talkingdata') +修改为 +compile project(':react-native-talkingdata') + +项目的 settings.gradle +include ':@cross2d/react-native-talkingdata' +project(':@cross2d/react-native-talkingdata').projectDir = new File(rootProject.projectDir, '../node_modules/@cross2d/react-native-talkingdata/android') +需要修改为 +include ':react-native-talkingdata' +project(':react-native-talkingdata').projectDir = new File(rootProject.projectDir, '../node_modules/@cross2d/react-native-talkingdata/android') +``` + + ### iOS工程配置 在工程target的`Build Phases->Link Binary with Libraries`中加入`、CoreTelephony.framework、AdSupport.framework、SystemConfiguration.framework、Security.framework、CoreMotion.framework、liz.tbd` @@ -44,11 +61,23 @@ rnpm link ``` manifestPlaceholders = [ - TD_APPID: "talkingdata的APPID",//在此修改微信APPID + TD_APPID: "talkingdata的APPID",//在此修改为你的TalkingData APPID APP_CHANNEL: "渠道号", ] ``` +在你自定义的MainApplication的getPackages()函数 return Arrays.asList 中加入 + +``` + new TalkingDataPackage(), +``` + +注意导入 talkingdata的对应包 + +``` + import cn.reactnative.modules.talkingdata.TalkingDataPackage; +``` + 在你自定义的MainActivity的onCreate()中第一行加入 ``` @@ -56,6 +85,9 @@ rnpm link ``` + + + ## 如何使用 ### 引入包 diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/android/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/android/build.gradle b/android/build.gradle index 46b75b9..55ce58f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,16 @@ apply plugin: 'com.android.library' +def safeExtGet(prop, fallback) { + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback +} + android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion safeExtGet('compileSdkVersion', 28) + buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3') defaultConfig { - minSdkVersion 16 - targetSdkVersion 23 + minSdkVersion safeExtGet('minSdkVersion', 16) + targetSdkVersion safeExtGet('targetSdkVersion', 28) versionCode 1 versionName "1.0" } @@ -19,6 +23,6 @@ android { } dependencies { - compile 'com.facebook.react:react-native:+' - compile files('libs/TalkingDataAnalytics_V2.1.37.jar') + implementation 'com.facebook.react:react-native:+' + implementation files('libs/SaaS_AppAnalytics_Android_SDK_V4.0.2.jar') } diff --git a/android/libs/SaaS_AppAnalytics_Android_SDK_V4.0.2.jar b/android/libs/SaaS_AppAnalytics_Android_SDK_V4.0.2.jar new file mode 100644 index 0000000..f0ab960 Binary files /dev/null and b/android/libs/SaaS_AppAnalytics_Android_SDK_V4.0.2.jar differ diff --git a/android/libs/TalkingDataAnalytics_V2.1.37.jar b/android/libs/TalkingDataAnalytics_V2.1.37.jar deleted file mode 100644 index 3007c5d..0000000 Binary files a/android/libs/TalkingDataAnalytics_V2.1.37.jar and /dev/null differ diff --git a/android/react-native-talkingdata.iml b/android/react-native-talkingdata.iml new file mode 100644 index 0000000..d614170 --- /dev/null +++ b/android/react-native-talkingdata.iml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/src/main/java/cn/reactnative/modules/talkingdata/TalkingDataModule.java b/android/src/main/java/cn/reactnative/modules/talkingdata/TalkingDataModule.java index dfe3bbd..8ac71b7 100644 --- a/android/src/main/java/cn/reactnative/modules/talkingdata/TalkingDataModule.java +++ b/android/src/main/java/cn/reactnative/modules/talkingdata/TalkingDataModule.java @@ -47,6 +47,7 @@ public static void register(Context context, String appID, String channelID, boo registered = true; } } + public static void registerSMS(Context context, String appID, String secretId) { TalkingDataSMS.init(context, appID, secretId); } @@ -126,7 +127,7 @@ public void onApplySucc(String s) { @Override public void onApplyFailed(int i, String s) { - promise.reject(""+i,s,null); + promise.reject(""+i,s); } }); } @@ -139,7 +140,7 @@ public void onApplySucc(String s) { @Override public void onApplyFailed(int i, String s) { - promise.reject(""+i,s,null); + promise.reject(""+i,s); } }); } @@ -155,7 +156,7 @@ public void onVerifySucc(String s) { @Override public void onVerifyFailed(int i, String s) { - promise.reject(""+i,s,null); + promise.reject(""+i,s); } }); } diff --git a/ios/RCTTalkingData/RCTTalkingData.h b/ios/RCTTalkingData/RCTTalkingData.h index 9dc1a5c..b47321c 100644 --- a/ios/RCTTalkingData/RCTTalkingData.h +++ b/ios/RCTTalkingData/RCTTalkingData.h @@ -6,7 +6,11 @@ // Copyright © 2016 erica. All rights reserved. // +#if __has_include() +#import +#else #import "RCTBridgeModule.h" +#endif @interface RCTTalkingData : NSObject diff --git a/ios/RCTTalkingData/RCTTalkingData.m b/ios/RCTTalkingData/RCTTalkingData.m index e8d37c0..1e7b600 100644 --- a/ios/RCTTalkingData/RCTTalkingData.m +++ b/ios/RCTTalkingData/RCTTalkingData.m @@ -9,7 +9,12 @@ #import "RCTTalkingData.h" #import "TalkingData.h" #import "TalkingDataSMS.h" + +#if __has_include() +#import +#else #import "RCTUtils.h" +#endif @interface RCTSMSDelegate: NSObject diff --git a/ios/TalkingDataSDK/TalkingData.h b/ios/TalkingDataSDK/TalkingData.h index 99a27f6..3fa6dab 100644 --- a/ios/TalkingDataSDK/TalkingData.h +++ b/ios/TalkingDataSDK/TalkingData.h @@ -1,13 +1,14 @@ // // TalkingData.h -// TalkingData Version 2.1.21 +// __MyProjectName__ // // Created by Biao Hou on 11-11-14. -// Copyright (c) 2011年 tendcloud. All rights reserved. +// Copyright (c) 2011年 __MyCompanyName__. All rights reserved. // #import + // 以下枚举用于WatchApp页面追踪 typedef enum { TDPageTypeGlance = 1, @@ -18,137 +19,148 @@ typedef enum { @interface TalkingData: NSObject /** - * @method setVersionWithCode:name: - * 设置应用的版本号和版本名称 - * @param versionCode 应用程序的版本号 默认获取info.plist中CFBundleShortVersionString的值 - * @param versionName 应用程序的版本名称 默认获取info.plist中CFBundleDisplayName的值 + * @method getDeviceID + * 获取SDK所使用的DeviceID + * @return DeviceID */ -+ (void)setVersionWithCode:(NSString *)versionCode name:(NSString *)versionName; ++ (NSString *)getDeviceID; /** - * @method sessionStarted:withChannelId: - * 初始化统计实例,请在application:didFinishLaunchingWithOptions:方法里调用 - * @param appKey 应用的唯一标识,统计后台注册得到 - @param channelId(可选) 渠道名,如“app store” - */ -+ (void)sessionStarted:(NSString *)appKey withChannelId:(NSString *)channelId; - -/** - * @method initWithWatch: - * 初始化WatchApp统计实例,请在每个入口类的init方法里调用 - * @param appKey 应用的唯一标识,统计后台注册得到 - */ -+ (void)initWithWatch:(NSString *)appKey; - -/** - @method getDeviceID - 获取TalkingData所使用的DeviceID - @return DeviceID + * @method setLogEnabled + * 统计日志开关(可选) + * @param enable 默认是开启状态 */ -+(NSString *)getDeviceID; ++ (void)setLogEnabled:(BOOL)enable; /** - * @method setExceptionReportEnabled - * 是否捕捉程序崩溃记录 (可选) - * @param enable 默认是 NO + * @method setExceptionReportEnabled + * 是否捕捉程序崩溃记录(可选) 如果需要记录程序崩溃日志,请将值设成YES,并且在调用sessionStarted:withChannelId:之前调用此函数 - */ + * @param enable 默认是 NO + */ + (void)setExceptionReportEnabled:(BOOL)enable; /** - * @method setSignalReportEnabled - * 是否捕捉异常信号 (可选) - * @param enable 默认是NO + * @method setSignalReportEnabled + * 是否捕捉异常信号(可选) 如果需要开启异常信号捕捉功能,请将值设成YES,并且在调用sessionStarted:withChannelId:之前调用此函数 + * @param enable 默认是NO */ + (void)setSignalReportEnabled:(BOOL)enable; /** - * @method setLatitude:longitude: + * @method setLatitude:longitude: * 设置位置信息(可选) - * @param latitude 维度 - * @param longitude 经度 + * @param latitude 维度 + * @param longitude 经度 */ + (void)setLatitude:(double)latitude longitude:(double)longitude; /** - * @method setLogEnabled - * 统计日志开关(可选) + * @method sessionStarted:withChannelId: + * 初始化统计实例,请在application:didFinishLaunchingWithOptions:方法里调用 + * @param appKey 应用的唯一标识,统计后台注册得到 + * @param channelId 渠道名,如“app store”(可选) + */ ++ (void)sessionStarted:(NSString *)appKey withChannelId:(NSString *)channelId; + +/** + * @method initWithWatch: + * 初始化WatchApp统计实例,请在每个入口类的init方法里调用 + * @param appKey 应用的唯一标识,统计后台注册得到 + */ ++ (void)initWithWatch:(NSString *)appKey; + +/** + * @method setAntiCheatingEnabled + * 是否开启反作弊功能 * @param enable 默认是开启状态 */ -+ (void)setLogEnabled:(BOOL)enable; ++ (void)setAntiCheatingEnabled:(BOOL)enabled; /** - * @method trackEvent + * @method trackEvent * 统计自定义事件(可选),如购买动作 - * @param eventId 事件名称(自定义) + * @param eventId 事件名称(自定义) */ + (void)trackEvent:(NSString *)eventId; /** - * @method trackEvent:label: - 统计带标签的自定义事件(可选),可用标签来区别同一个事件的不同应用场景 + * @method trackEvent:label: + * 统计带标签的自定义事件(可选),可用标签来区别同一个事件的不同应用场景 如购买某一特定的商品 - * - * @param eventId 事件名称(自定义) - * @param eventLabel 事件标签(自定义) + * @param eventId 事件名称(自定义) + * @param eventLabel 事件标签(自定义) */ + (void)trackEvent:(NSString *)eventId label:(NSString *)eventLabel; /** - * @method trackEvent:label:parameters - 统计带二级参数的自定义事件,单次调用的参数数量不能超过10个 - * - * @param eventId 事件名称(自定义) - * @param eventLabel 事件标签(自定义) - * @param parameters 事件参数 (key只支持NSString, value支持NSString和NSNumber) + * @method trackEvent:label:parameters + * 统计带二级参数的自定义事件,单次调用的参数数量不能超过10个 + * @param eventId 事件名称(自定义) + * @param eventLabel 事件标签(自定义) + * @param parameters 事件参数 (key只支持NSString, value支持NSString和NSNumber) */ + (void)trackEvent:(NSString *)eventId label:(NSString *)eventLabel parameters:(NSDictionary *)parameters; +/** + * @method setGlobalKV:value: + * 添加全局的字段,这里的内容会每次的自定义事都会带着,发到服务器。也就是说如果您的自定义事件中每一条都需要带同样的内容,如用户名称等,就可以添加进去 + * @param key 自定义事件的key,如果在之后,创建自定义的时候,有相同的key,则会覆盖,全局的里相同key的内容 + * @param value 这里是NSObject类型,或者是NSString 或者NSNumber类型 + */ ++ (void)setGlobalKV:(NSString *)key value:(id)value; + +/** + * @method removeGlobalKV: + * 删除全局数据 + * @param key 自定义事件的key + */ ++ (void)removeGlobalKV:(NSString *)key; /** - * @method trackPageBegin + * @method trackPageBegin * 开始跟踪某一页面(可选),记录页面打开时间 建议在viewWillAppear或者viewDidAppear方法里调用 - * @param pageName 页面名称(自定义) + * @param pageName 页面名称(自定义) */ + (void)trackPageBegin:(NSString *)pageName; /** - * @method trackPageBegin:withPageType: + * @method trackPageBegin:withPageType: * 开始跟踪WatchApp某一页面(可选),记录页面打开时间 - 建议在willActivate方法里调用 - * @param pageName 页面名称(自定义) + 建议在willActivate方法里调用 + * @param pageName 页面名称(自定义) * @param pageType 页面类型(TDPageType枚举类型) */ + (void)trackPageBegin:(NSString *)pageName withPageType:(TDPageType)pageType; /** - * @method trackPageEnd + * @method trackPageEnd * 结束某一页面的跟踪(可选),记录页面的关闭时间 此方法与trackPageBegin方法结对使用, 在iOS应用中建议在viewWillDisappear或者viewDidDisappear方法里调用 在Watch应用中建议在DidDeactivate方法里调用 - * @param pageName 页面名称,请跟trackPageBegin方法的页面名称保持一致 + * @param pageName 页面名称,请跟trackPageBegin方法的页面名称保持一致 */ + (void)trackPageEnd:(NSString *)pageName; + /** - * @method setGlobalKV:value: - * 添加全局的字段,这里的内容会每次的自定义事都会带着,发到服务器。也就是说如果您的自定义事件中每一条都需要带同样的内容,如用户名称等,就可以添加进去 - * @param key 自定义事件的key,如果在之后,创建自定义的时候,有相同的key,则会覆盖,全局的里相同key的内容 - * @param value 这里是NSObject类型,或者是NSString 或者NSNumber类型 + * @method setDeviceToken 设置DeviceToken + * @param deviceToken 从Apple获取的DeviceToken */ -+(void)setGlobalKV:(NSString*)key value:(id)value; ++ (void)setDeviceToken:(NSData *)deviceToken; /** - * @method removeGlobalKV: - * 删除全局数据 - * @param key 自定义事件的key + * @method handlePushMessage 处理来自TalkingData的Push消息 + * @param message 收到的消息 + * @return YES 来自TalkingData的消息,SDK已处理 + * NO 其他来源消息,开发者需自行处理 */ -+(void)removeGlobalKV:(NSString*)key; ++ (BOOL)handlePushMessage:(NSDictionary *)message; @end diff --git a/ios/TalkingDataSDK/libTalkingData.a b/ios/TalkingDataSDK/libTalkingData.a index d07a433..90038cf 100644 Binary files a/ios/TalkingDataSDK/libTalkingData.a and b/ios/TalkingDataSDK/libTalkingData.a differ diff --git a/package.json b/package.json index 3e169c4..b78b78f 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,15 @@ { - "name": "react-native-talkingdata", - "version": "1.0.5", - "description": "TalkingData Module", + "name": "@cross2d/react-native-talkingdata", + "version": "2.10.1", + "description": "React Native TalkingData", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "release":"npm publish --access public" }, "repository": { "type": "git", - "url": "git+https://github.com/reactnativecn/react-native-talkingdata.git" + "url": "git+https://github.com/cross2d/react-native-talkingdata.git" }, "keywords": [ "react-native", @@ -16,10 +17,10 @@ "android", "talkingdata" ], - "author": "lvbingru", + "author": "Colin3dmax", "license": "ISC", "bugs": { - "url": "https://github.com/reactnativecn/react-native-talkingdata/issues" + "url": "https://github.com/cross2d/react-native-talkingdata/issues" }, - "homepage": "https://github.com/reactnativecn/react-native-talkingdata#readme" + "homepage": "https://github.com/cross2d/react-native-talkingdata#readme" } diff --git a/react-native-talkingdata.podspec b/react-native-talkingdata.podspec new file mode 100644 index 0000000..d2a30aa --- /dev/null +++ b/react-native-talkingdata.podspec @@ -0,0 +1,41 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) + +Pod::Spec.new do |s| + s.name = 'react-native-talkingdata' + s.version = package['version'] + s.summary = package['description'] + s.license = package['license'] + + s.authors = package['author'] + s.homepage = package['homepage'] + s.platform = :ios, "9.0" + + s.source = { :git => "https://github.com/cross2d/react-native-talkingdata.git", :tag => "v#{s.version}" } + s.source_files = "ios/**/*.{h,m}" + s.libraries = "z" + s.preserve_paths = "ios/TalkingDataSDK/libTalkingData.a" + s.vendored_libraries = "ios/TalkingDataSDK/libTalkingData.a" + + s.pod_target_xcconfig = { + "FRAMEWORK_SEARCH_PATHS" => '$(inherited) $(SRCROOT)/../../node_modules/@cross2d/react-native-talkingdata/ios/TalkingDataSDK/', + "LIBRARY_SEARCH_PATHS" => '$(inherited) $(SRCROOT)/../../node_modules/@cross2d/react-native-talkingdata/ios/TalkingDataSDK/' + } + +# 问题: +# 查看详细信息:pod lib lint --verbose +# pod lib lint 验证不通过,App normal i386和App normal x86_64。不支持i386和x86_64编译,即不能在模拟器下编译。 +# 解决:添加spec.pod_target_xcconfig。 +# 参考: https://www.jianshu.com/p/88180b4d2ab7/ +# 执行命令跳过模拟器验证:pod lib lint --skip-import-validation +# s.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => '' } + + s.frameworks = [ + "AdSupport", + "CoreMotion", + "CoreTelephony", + "SystemConfiguration" + ] + s.dependency 'React' +end