UMengIOSModule.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. //
  2. // UMengIOSModule.m
  3. // UMengIOSModule
  4. //
  5. // Created by breeze deng on 2018/1/23.
  6. // Copyright © 2018年 BA. All rights reserved.
  7. //
  8. #import "UMengIOSModule.h"
  9. #import <UMPush/UMessage.h>
  10. #import <UMAnalytics/MobClick.h>
  11. #import <UMAnalytics/MobClickGameAnalytics.h>
  12. #import <UMAnalytics/DplusMobClick.h>
  13. #import <React/RCTConvert.h>
  14. #import <React/RCTEventDispatcher.h>
  15. #import "RNUMConfigure.h"
  16. #import <React/RCTRootView.h>
  17. #define kDidReceiveRemoteNotification @"UMengPushClickListener"
  18. static NSString *_deviceToken = nil;
  19. @interface UMengIOSModule()
  20. @property (nonatomic, assign) BOOL isAppear;
  21. @property (nonatomic, strong) NSMutableArray *userInfos;
  22. @property (nonatomic, strong) RCTEventDispatcher *eventDispatcher;
  23. @end
  24. @implementation UMengIOSModule
  25. + (instancetype)sharedInstance
  26. {
  27. static UMengIOSModule *sharedInstance = nil;
  28. static dispatch_once_t onceToken = 0;
  29. dispatch_once(&onceToken,^{
  30. if (sharedInstance == nil)
  31. {
  32. sharedInstance = [[UMengIOSModule alloc] init];
  33. }
  34. });
  35. return sharedInstance;
  36. }
  37. RCT_EXPORT_MODULE();
  38. - (void)initWithAppKey:(NSString *)appKey channel:(NSString *)channel launchOptions:(NSDictionary *)launchOptions {
  39. self.userInfos = [NSMutableArray array];
  40. [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(contentViewDidAppear) name:RCTContentDidAppearNotification object: nil];
  41. #ifdef DEBUG
  42. [UMConfigure setLogEnabled:YES];
  43. #endif
  44. [RNUMConfigure initWithAppkey: appKey channel: channel];
  45. [MobClick setScenarioType:E_UM_NORMAL];
  46. // Push组件基本功能配置
  47. UMessageRegisterEntity *entity = [[UMessageRegisterEntity alloc] init];
  48. //type是对推送的几个参数的选择,可以选择一个或者多个。默认是三个全部打开,即:声音,弹窗,角标等
  49. entity.types = UMessageAuthorizationOptionBadge|UMessageAuthorizationOptionAlert|UMessageAuthorizationOptionSound;
  50. [UMessage registerForRemoteNotificationsWithLaunchOptions:launchOptions Entity:entity completionHandler:^(BOOL granted, NSError * _Nullable error) {}];
  51. }
  52. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo eventDispatcher:(RCTEventDispatcher *)eventDispatcher {
  53. UIApplicationState state = [application applicationState];
  54. self.eventDispatcher = eventDispatcher;
  55. // 小于iOS 10前台收到通知时,不进行处理
  56. if(!(state == UIApplicationStateActive && [[[UIDevice currentDevice] systemVersion] floatValue] < 10)) {
  57. //关闭友盟自带的弹出框
  58. [UMessage setAutoAlert:NO];
  59. [UMessage didReceiveRemoteNotification:userInfo];
  60. if (self.isAppear) {
  61. [self eventDispatcher: eventDispatcher sendBridgeWithName:kDidReceiveRemoteNotification userInfo:userInfo];
  62. } else {
  63. [self.userInfos addObject: userInfo];
  64. }
  65. }
  66. }
  67. - (void)contentViewDidAppear {
  68. self.isAppear = YES;
  69. for (NSDictionary *userInfo in self.userInfos) {
  70. [self eventDispatcher: self.eventDispatcher sendBridgeWithName: kDidReceiveRemoteNotification userInfo: userInfo];
  71. }
  72. [self.userInfos removeAllObjects];
  73. }
  74. - (void)eventDispatcher:(RCTEventDispatcher *)eventDispatcher sendBridgeWithName:(NSString *)name userInfo:(NSDictionary *)userInfo {
  75. [eventDispatcher sendDeviceEventWithName:name body:userInfo];
  76. }
  77. // /**未知错误*/
  78. // kUMessageErrorUnknown = 0,
  79. // /**响应出错*/
  80. // kUMessageErrorResponseErr = 1,
  81. // /**操作失败*/
  82. // kUMessageErrorOperateErr = 2,
  83. // /**参数非法*/
  84. // kUMessageErrorParamErr = 3,
  85. // /**条件不足(如:还未获取device_token,添加tag是不成功的)*/
  86. // kUMessageErrorDependsErr = 4,
  87. // /**服务器限定操作*/
  88. // kUMessageErrorServerSetErr = 5,
  89. - (NSString *)checkErrorMessage:(NSInteger)code
  90. {
  91. switch (code) {
  92. case 1:
  93. return @"响应出错";
  94. break;
  95. case 2:
  96. return @"操作失败";
  97. break;
  98. case 3:
  99. return @"参数非法";
  100. break;
  101. case 4:
  102. return @"条件不足(如:还未获取device_token,添加tag是不成功的)";
  103. break;
  104. case 5:
  105. return @"服务器限定操作";
  106. break;
  107. default:
  108. break;
  109. }
  110. return nil;
  111. }
  112. - (void)handleResponse:(id _Nonnull)responseObject remain:(NSInteger)remain error:(NSError * _Nonnull)error completion:(RCTResponseSenderBlock)completion
  113. {
  114. if (completion) {
  115. if (error) {
  116. NSString *msg = [self checkErrorMessage:error.code];
  117. if (msg.length == 0) {
  118. msg = error.localizedDescription;
  119. }
  120. completion(@[@(error.code), @(remain)]);
  121. } else {
  122. if ([responseObject isKindOfClass:[NSDictionary class]]) {
  123. NSDictionary *retDict = responseObject;
  124. if ([retDict[@"success"] isEqualToString:@"ok"]) {
  125. completion(@[@200, @(remain)]);
  126. } else {
  127. completion(@[@(-1), @(remain)]);
  128. }
  129. } else {
  130. completion(@[@(-1), @(remain)]);
  131. }
  132. }
  133. }
  134. }
  135. - (void)handleGetTagResponse:(NSSet * _Nonnull)responseTags remain:(NSInteger)remain error:(NSError * _Nonnull)error completion:(RCTResponseSenderBlock)completion
  136. {
  137. if (completion) {
  138. if (error) {
  139. NSString *msg = [self checkErrorMessage:error.code];
  140. if (msg.length == 0) {
  141. msg = error.localizedDescription;
  142. }
  143. completion(@[@(error.code), @(remain), @[]]);
  144. } else {
  145. if ([responseTags isKindOfClass:[NSSet class]]) {
  146. NSArray *retList = responseTags.allObjects;
  147. completion(@[@200, @(remain), retList]);
  148. } else {
  149. completion(@[@(-1), @(remain), @[]]);
  150. }
  151. }
  152. }
  153. }
  154. - (void)handleAliasResponse:(id _Nonnull)responseObject error:(NSError * _Nonnull)error completion:(RCTResponseSenderBlock)completion
  155. {
  156. if (completion) {
  157. if (error) {
  158. NSString *msg = [self checkErrorMessage:error.code];
  159. if (msg.length == 0) {
  160. msg = error.localizedDescription;
  161. }
  162. completion(@[@(error.code)]);
  163. } else {
  164. if ([responseObject isKindOfClass:[NSDictionary class]]) {
  165. NSDictionary *retDict = responseObject;
  166. if ([retDict[@"success"] isEqualToString:@"ok"]) {
  167. completion(@[@200]);
  168. } else {
  169. completion(@[@(-1)]);
  170. }
  171. } else {
  172. completion(@[@(-1)]);
  173. }
  174. }
  175. }
  176. }
  177. + (void)setDeviceToken:(NSString *)deviceToken {
  178. _deviceToken = deviceToken;
  179. }
  180. // push
  181. RCT_EXPORT_METHOD(deviceToken:(RCTResponseSenderBlock)callback)
  182. {
  183. NSString *result = @"";
  184. if (_deviceToken.length != 0) {
  185. result = _deviceToken;
  186. }
  187. callback(@[result]);
  188. }
  189. RCT_EXPORT_METHOD(addTag:(NSString *)tag response:(RCTResponseSenderBlock)completion)
  190. {
  191. [UMessage addTags:tag response:^(id _Nonnull responseObject, NSInteger remain, NSError * _Nonnull error) {
  192. [self handleResponse:responseObject remain:remain error:error completion:completion];
  193. }];
  194. }
  195. RCT_EXPORT_METHOD(deleteTag:(NSString *)tag response:(RCTResponseSenderBlock)completion)
  196. {
  197. [UMessage deleteTags:tag response:^(id _Nonnull responseObject, NSInteger remain, NSError * _Nonnull error) {
  198. [self handleResponse:responseObject remain:remain error:error completion:completion];
  199. }];
  200. }
  201. RCT_EXPORT_METHOD(listTag:(RCTResponseSenderBlock)completion)
  202. {
  203. [UMessage getTags:^(NSSet * _Nonnull responseTags, NSInteger remain, NSError * _Nonnull error) {
  204. [self handleGetTagResponse:responseTags remain:remain error:error completion:completion];
  205. }];
  206. }
  207. RCT_EXPORT_METHOD(addAlias:(NSString *)name type:(NSString *)type response:(RCTResponseSenderBlock)completion)
  208. {
  209. [UMessage addAlias:name type:type response:^(id _Nonnull responseObject, NSError * _Nonnull error) {
  210. [self handleAliasResponse:responseObject error:error completion:completion];
  211. }];
  212. }
  213. RCT_EXPORT_METHOD(addExclusiveAlias:(NSString *)name type:(NSString *)type response:(RCTResponseSenderBlock)completion)
  214. {
  215. [UMessage setAlias:name type:type response:^(id _Nonnull responseObject, NSError * _Nonnull error) {
  216. [self handleAliasResponse:responseObject error:error completion:completion];
  217. }];
  218. }
  219. RCT_EXPORT_METHOD(deleteAlias:(NSString *)name type:(NSString *)type response:(RCTResponseSenderBlock)completion)
  220. {
  221. [UMessage removeAlias:name type:type response:^(id _Nonnull responseObject, NSError * _Nonnull error) {
  222. [self handleAliasResponse:responseObject error:error completion:completion];
  223. }];
  224. }
  225. // Event
  226. RCT_EXPORT_METHOD(onEvent:(NSString *)eventId)
  227. {
  228. if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) {
  229. return;
  230. }
  231. [MobClick event:eventId];
  232. }
  233. RCT_EXPORT_METHOD(onEventWithLabel:(NSString *)eventId eventLabel:(NSString *)eventLabel)
  234. {
  235. if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) {
  236. return;
  237. }
  238. if ([eventLabel isKindOfClass:[NSNull class]]) {
  239. eventLabel = nil;
  240. }
  241. [MobClick event:eventId label:eventLabel];
  242. }
  243. RCT_EXPORT_METHOD(onEventWithMap:(NSString *)eventId parameters:(NSDictionary *)parameters)
  244. {
  245. if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) {
  246. return;
  247. }
  248. if (parameters == nil && [parameters isKindOfClass:[NSNull class]]) {
  249. parameters = nil;
  250. }
  251. [MobClick event:eventId attributes:parameters];
  252. }
  253. RCT_EXPORT_METHOD(onEventWithMapAndCount:(NSString *)eventId parameters:(NSDictionary *)parameters eventNum:(int)eventNum)
  254. {
  255. if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) {
  256. return;
  257. }
  258. if (parameters == nil && [parameters isKindOfClass:[NSNull class]]) {
  259. parameters = nil;
  260. }
  261. [MobClick event:eventId attributes:parameters counter:eventNum];
  262. }
  263. RCT_EXPORT_METHOD(onPageBegin:(NSString *)pageName)
  264. {
  265. if (pageName == nil || [pageName isKindOfClass:[NSNull class]]) {
  266. return;
  267. }
  268. [MobClick beginLogPageView:pageName];
  269. }
  270. RCT_EXPORT_METHOD(onPageEnd:(NSString *)pageName)
  271. {
  272. if (pageName == nil || [pageName isKindOfClass:[NSNull class]]) {
  273. return;
  274. }
  275. [MobClick endLogPageView:pageName];
  276. }
  277. RCT_EXPORT_METHOD(profileSignInWithPUID:(NSString *)puid)
  278. {
  279. if (puid == nil || [puid isKindOfClass:[NSNull class]]) {
  280. return;
  281. }
  282. [MobClick profileSignInWithPUID:puid];
  283. }
  284. RCT_EXPORT_METHOD(profileSignInWithPUIDWithProvider:(NSString *)provider puid:(NSString *)puid)
  285. {
  286. if (provider == nil && [provider isKindOfClass:[NSNull class]]) {
  287. provider = nil;
  288. }
  289. if (puid == nil || [puid isKindOfClass:[NSNull class]]) {
  290. return;
  291. }
  292. [MobClick profileSignInWithPUID:puid provider:provider];
  293. }
  294. RCT_EXPORT_METHOD(profileSignOff)
  295. {
  296. [MobClick profileSignOff];
  297. }
  298. // Dplus
  299. RCT_EXPORT_METHOD(track:(NSString *)eventName)
  300. {
  301. if (eventName == nil && [eventName isKindOfClass:[NSNull class]]) {
  302. eventName = nil;
  303. }
  304. [DplusMobClick track:eventName];
  305. }
  306. RCT_EXPORT_METHOD(trackWithMap:(NSString *)eventName property:(NSDictionary *) property)
  307. {
  308. if (eventName == nil && [eventName isKindOfClass:[NSNull class]]) {
  309. eventName = nil;
  310. }
  311. if (property == nil && [property isKindOfClass:[NSNull class]]) {
  312. property = nil;
  313. }
  314. [DplusMobClick track:eventName property:property];
  315. }
  316. RCT_EXPORT_METHOD(registerSuperProperty:(NSDictionary *)property)
  317. {
  318. if (property == nil && [property isKindOfClass:[NSNull class]]) {
  319. property = nil;
  320. }
  321. [DplusMobClick registerSuperProperty:property];
  322. }
  323. RCT_EXPORT_METHOD(unregisterSuperProperty:(NSString *)propertyName)
  324. {
  325. if (propertyName == nil && [propertyName isKindOfClass:[NSNull class]]) {
  326. propertyName = nil;
  327. }
  328. [DplusMobClick unregisterSuperProperty:propertyName];
  329. }
  330. RCT_EXPORT_METHOD(getSuperProperty:(NSString *)propertyName callback:(RCTResponseSenderBlock)callback)
  331. {
  332. if (propertyName == nil && [propertyName isKindOfClass:[NSNull class]]) {
  333. propertyName = nil;
  334. }
  335. callback(@[[DplusMobClick getSuperProperty:propertyName]]);
  336. }
  337. RCT_EXPORT_METHOD(getSuperProperties:(RCTResponseSenderBlock)callback)
  338. {
  339. NSString *jsonString = nil;
  340. NSError *error = nil;
  341. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[DplusMobClick getSuperProperties]
  342. options:kNilOptions //TODO: NSJSONWritingPrettyPrinted // kNilOptions
  343. error:&error];
  344. if ([jsonData length] && (error == nil))
  345. {
  346. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] ;
  347. }else{
  348. jsonString=@"";
  349. }
  350. callback(@[jsonString]);
  351. }
  352. RCT_EXPORT_METHOD(clearSuperProperties)
  353. {
  354. [DplusMobClick clearSuperProperties];
  355. }
  356. RCT_EXPORT_METHOD(setFirstLaunchEvent:(NSArray *)eventList)
  357. {
  358. if (eventList == nil && [eventList isKindOfClass:[NSNull class]]) {
  359. eventList = nil;
  360. }
  361. [DplusMobClick setFirstLaunchEvent:eventList];
  362. }
  363. @end