// // UMengIOSModule.m // UMengIOSModule // // Created by breeze deng on 2018/1/23. // Copyright © 2018年 BA. All rights reserved. // #import "UMengIOSModule.h" #import #import #import #import #import #import #import "RNUMConfigure.h" #import #define kDidReceiveRemoteNotification @"UMengPushClickListener" static NSString *_deviceToken = nil; @interface UMengIOSModule() @property (nonatomic, assign) BOOL isAppear; @property (nonatomic, strong) NSMutableArray *userInfos; @property (nonatomic, strong) RCTEventDispatcher *eventDispatcher; @end @implementation UMengIOSModule + (instancetype)sharedInstance { static UMengIOSModule *sharedInstance = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken,^{ if (sharedInstance == nil) { sharedInstance = [[UMengIOSModule alloc] init]; } }); return sharedInstance; } RCT_EXPORT_MODULE(); - (void)initWithAppKey:(NSString *)appKey channel:(NSString *)channel launchOptions:(NSDictionary *)launchOptions { self.userInfos = [NSMutableArray array]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(contentViewDidAppear) name:RCTContentDidAppearNotification object: nil]; #ifdef DEBUG [UMConfigure setLogEnabled:YES]; #endif [RNUMConfigure initWithAppkey: appKey channel: channel]; [MobClick setScenarioType:E_UM_NORMAL]; // Push组件基本功能配置 UMessageRegisterEntity *entity = [[UMessageRegisterEntity alloc] init]; //type是对推送的几个参数的选择,可以选择一个或者多个。默认是三个全部打开,即:声音,弹窗,角标等 entity.types = UMessageAuthorizationOptionBadge|UMessageAuthorizationOptionAlert|UMessageAuthorizationOptionSound; [UMessage registerForRemoteNotificationsWithLaunchOptions:launchOptions Entity:entity completionHandler:^(BOOL granted, NSError * _Nullable error) {}]; } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo eventDispatcher:(RCTEventDispatcher *)eventDispatcher { UIApplicationState state = [application applicationState]; self.eventDispatcher = eventDispatcher; // 小于iOS 10前台收到通知时,不进行处理 if(!(state == UIApplicationStateActive && [[[UIDevice currentDevice] systemVersion] floatValue] < 10)) { //关闭友盟自带的弹出框 [UMessage setAutoAlert:NO]; [UMessage didReceiveRemoteNotification:userInfo]; if (self.isAppear) { [self eventDispatcher: eventDispatcher sendBridgeWithName:kDidReceiveRemoteNotification userInfo:userInfo]; } else { [self.userInfos addObject: userInfo]; } } } - (void)contentViewDidAppear { self.isAppear = YES; for (NSDictionary *userInfo in self.userInfos) { [self eventDispatcher: self.eventDispatcher sendBridgeWithName: kDidReceiveRemoteNotification userInfo: userInfo]; } [self.userInfos removeAllObjects]; } - (void)eventDispatcher:(RCTEventDispatcher *)eventDispatcher sendBridgeWithName:(NSString *)name userInfo:(NSDictionary *)userInfo { [eventDispatcher sendDeviceEventWithName:name body:userInfo]; } // /**未知错误*/ // kUMessageErrorUnknown = 0, // /**响应出错*/ // kUMessageErrorResponseErr = 1, // /**操作失败*/ // kUMessageErrorOperateErr = 2, // /**参数非法*/ // kUMessageErrorParamErr = 3, // /**条件不足(如:还未获取device_token,添加tag是不成功的)*/ // kUMessageErrorDependsErr = 4, // /**服务器限定操作*/ // kUMessageErrorServerSetErr = 5, - (NSString *)checkErrorMessage:(NSInteger)code { switch (code) { case 1: return @"响应出错"; break; case 2: return @"操作失败"; break; case 3: return @"参数非法"; break; case 4: return @"条件不足(如:还未获取device_token,添加tag是不成功的)"; break; case 5: return @"服务器限定操作"; break; default: break; } return nil; } - (void)handleResponse:(id _Nonnull)responseObject remain:(NSInteger)remain error:(NSError * _Nonnull)error completion:(RCTResponseSenderBlock)completion { if (completion) { if (error) { NSString *msg = [self checkErrorMessage:error.code]; if (msg.length == 0) { msg = error.localizedDescription; } completion(@[@(error.code), @(remain)]); } else { if ([responseObject isKindOfClass:[NSDictionary class]]) { NSDictionary *retDict = responseObject; if ([retDict[@"success"] isEqualToString:@"ok"]) { completion(@[@200, @(remain)]); } else { completion(@[@(-1), @(remain)]); } } else { completion(@[@(-1), @(remain)]); } } } } - (void)handleGetTagResponse:(NSSet * _Nonnull)responseTags remain:(NSInteger)remain error:(NSError * _Nonnull)error completion:(RCTResponseSenderBlock)completion { if (completion) { if (error) { NSString *msg = [self checkErrorMessage:error.code]; if (msg.length == 0) { msg = error.localizedDescription; } completion(@[@(error.code), @(remain), @[]]); } else { if ([responseTags isKindOfClass:[NSSet class]]) { NSArray *retList = responseTags.allObjects; completion(@[@200, @(remain), retList]); } else { completion(@[@(-1), @(remain), @[]]); } } } } - (void)handleAliasResponse:(id _Nonnull)responseObject error:(NSError * _Nonnull)error completion:(RCTResponseSenderBlock)completion { if (completion) { if (error) { NSString *msg = [self checkErrorMessage:error.code]; if (msg.length == 0) { msg = error.localizedDescription; } completion(@[@(error.code)]); } else { if ([responseObject isKindOfClass:[NSDictionary class]]) { NSDictionary *retDict = responseObject; if ([retDict[@"success"] isEqualToString:@"ok"]) { completion(@[@200]); } else { completion(@[@(-1)]); } } else { completion(@[@(-1)]); } } } } + (void)setDeviceToken:(NSString *)deviceToken { _deviceToken = deviceToken; } // push RCT_EXPORT_METHOD(deviceToken:(RCTResponseSenderBlock)callback) { NSString *result = @""; if (_deviceToken.length != 0) { result = _deviceToken; } callback(@[result]); } RCT_EXPORT_METHOD(addTag:(NSString *)tag response:(RCTResponseSenderBlock)completion) { [UMessage addTags:tag response:^(id _Nonnull responseObject, NSInteger remain, NSError * _Nonnull error) { [self handleResponse:responseObject remain:remain error:error completion:completion]; }]; } RCT_EXPORT_METHOD(deleteTag:(NSString *)tag response:(RCTResponseSenderBlock)completion) { [UMessage deleteTags:tag response:^(id _Nonnull responseObject, NSInteger remain, NSError * _Nonnull error) { [self handleResponse:responseObject remain:remain error:error completion:completion]; }]; } RCT_EXPORT_METHOD(listTag:(RCTResponseSenderBlock)completion) { [UMessage getTags:^(NSSet * _Nonnull responseTags, NSInteger remain, NSError * _Nonnull error) { [self handleGetTagResponse:responseTags remain:remain error:error completion:completion]; }]; } RCT_EXPORT_METHOD(addAlias:(NSString *)name type:(NSString *)type response:(RCTResponseSenderBlock)completion) { [UMessage addAlias:name type:type response:^(id _Nonnull responseObject, NSError * _Nonnull error) { [self handleAliasResponse:responseObject error:error completion:completion]; }]; } RCT_EXPORT_METHOD(addExclusiveAlias:(NSString *)name type:(NSString *)type response:(RCTResponseSenderBlock)completion) { [UMessage setAlias:name type:type response:^(id _Nonnull responseObject, NSError * _Nonnull error) { [self handleAliasResponse:responseObject error:error completion:completion]; }]; } RCT_EXPORT_METHOD(deleteAlias:(NSString *)name type:(NSString *)type response:(RCTResponseSenderBlock)completion) { [UMessage removeAlias:name type:type response:^(id _Nonnull responseObject, NSError * _Nonnull error) { [self handleAliasResponse:responseObject error:error completion:completion]; }]; } // Event RCT_EXPORT_METHOD(onEvent:(NSString *)eventId) { if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) { return; } [MobClick event:eventId]; } RCT_EXPORT_METHOD(onEventWithLabel:(NSString *)eventId eventLabel:(NSString *)eventLabel) { if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) { return; } if ([eventLabel isKindOfClass:[NSNull class]]) { eventLabel = nil; } [MobClick event:eventId label:eventLabel]; } RCT_EXPORT_METHOD(onEventWithMap:(NSString *)eventId parameters:(NSDictionary *)parameters) { if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) { return; } if (parameters == nil && [parameters isKindOfClass:[NSNull class]]) { parameters = nil; } [MobClick event:eventId attributes:parameters]; } RCT_EXPORT_METHOD(onEventWithMapAndCount:(NSString *)eventId parameters:(NSDictionary *)parameters eventNum:(int)eventNum) { if (eventId == nil || [eventId isKindOfClass:[NSNull class]]) { return; } if (parameters == nil && [parameters isKindOfClass:[NSNull class]]) { parameters = nil; } [MobClick event:eventId attributes:parameters counter:eventNum]; } RCT_EXPORT_METHOD(onPageBegin:(NSString *)pageName) { if (pageName == nil || [pageName isKindOfClass:[NSNull class]]) { return; } [MobClick beginLogPageView:pageName]; } RCT_EXPORT_METHOD(onPageEnd:(NSString *)pageName) { if (pageName == nil || [pageName isKindOfClass:[NSNull class]]) { return; } [MobClick endLogPageView:pageName]; } RCT_EXPORT_METHOD(profileSignInWithPUID:(NSString *)puid) { if (puid == nil || [puid isKindOfClass:[NSNull class]]) { return; } [MobClick profileSignInWithPUID:puid]; } RCT_EXPORT_METHOD(profileSignInWithPUIDWithProvider:(NSString *)provider puid:(NSString *)puid) { if (provider == nil && [provider isKindOfClass:[NSNull class]]) { provider = nil; } if (puid == nil || [puid isKindOfClass:[NSNull class]]) { return; } [MobClick profileSignInWithPUID:puid provider:provider]; } RCT_EXPORT_METHOD(profileSignOff) { [MobClick profileSignOff]; } // Dplus RCT_EXPORT_METHOD(track:(NSString *)eventName) { if (eventName == nil && [eventName isKindOfClass:[NSNull class]]) { eventName = nil; } [DplusMobClick track:eventName]; } RCT_EXPORT_METHOD(trackWithMap:(NSString *)eventName property:(NSDictionary *) property) { if (eventName == nil && [eventName isKindOfClass:[NSNull class]]) { eventName = nil; } if (property == nil && [property isKindOfClass:[NSNull class]]) { property = nil; } [DplusMobClick track:eventName property:property]; } RCT_EXPORT_METHOD(registerSuperProperty:(NSDictionary *)property) { if (property == nil && [property isKindOfClass:[NSNull class]]) { property = nil; } [DplusMobClick registerSuperProperty:property]; } RCT_EXPORT_METHOD(unregisterSuperProperty:(NSString *)propertyName) { if (propertyName == nil && [propertyName isKindOfClass:[NSNull class]]) { propertyName = nil; } [DplusMobClick unregisterSuperProperty:propertyName]; } RCT_EXPORT_METHOD(getSuperProperty:(NSString *)propertyName callback:(RCTResponseSenderBlock)callback) { if (propertyName == nil && [propertyName isKindOfClass:[NSNull class]]) { propertyName = nil; } callback(@[[DplusMobClick getSuperProperty:propertyName]]); } RCT_EXPORT_METHOD(getSuperProperties:(RCTResponseSenderBlock)callback) { NSString *jsonString = nil; NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[DplusMobClick getSuperProperties] options:kNilOptions //TODO: NSJSONWritingPrettyPrinted // kNilOptions error:&error]; if ([jsonData length] && (error == nil)) { jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] ; }else{ jsonString=@""; } callback(@[jsonString]); } RCT_EXPORT_METHOD(clearSuperProperties) { [DplusMobClick clearSuperProperties]; } RCT_EXPORT_METHOD(setFirstLaunchEvent:(NSArray *)eventList) { if (eventList == nil && [eventList isKindOfClass:[NSNull class]]) { eventList = nil; } [DplusMobClick setFirstLaunchEvent:eventList]; } @end