| // | 
| //  UniversalSDK.m | 
| //  Unity-iPhone | 
| // | 
| //  Created by 蔡瀚 on 2018/4/24. | 
| // | 
|   | 
| #import "UniversalSDK.h" | 
| #import "AdSupport/AdSupport.h" | 
| #import "opus.h" | 
| #ifdef NSFoundationVersionNumber_iOS_9_x_Max | 
| #import <UserNotifications/UserNotifications.h> | 
| #endif | 
| #import "SystemConfiguration/CaptiveNetwork.h" | 
| #import <GMSDK/GMSDK.h> | 
| #import <AppTrackingTransparency/AppTrackingTransparency.h> | 
|   | 
|   | 
| @implementation UniversalSDK | 
|   | 
| #define CHANNEL_NUM 1 | 
|   | 
| static int s_frequency = 16000; | 
| static int s_bitRate = 20000; | 
| static int s_bandMode = OPUS_BANDWIDTH_WIDEBAND; | 
| static int s_frameSize = 160; | 
| static int sBatteryLevel = -1; | 
| static int sBatteryState = -1; | 
| static NSString* sAppID; | 
| static NSString* sGameID; | 
| static NSString* sUserName; | 
| static NSThread* _thread; | 
|   | 
| static int initedState=0; //初始化状态,0初始化中,1成功,2失败 | 
|   | 
| static NSString * const kClientID = @"468442318367-ocoqrm0kei0gpkrnnq1ql628v4g4dbqd.apps.googleusercontent.com"; | 
|   | 
| -(id)init | 
| { | 
|      self = [super init]; | 
|      | 
|      m_fakeUIWebView = [[WKWebView alloc] initWithFrame:CGRectZero]; | 
|      NSURL *url = [NSURL URLWithString:@"www.baidu.com"]; | 
|      NSURLRequest *request = [NSURLRequest requestWithURL:url | 
|                                            cachePolicy:NSURLRequestUseProtocolCachePolicy | 
|                                            timeoutInterval:10.f]; | 
|      [m_fakeUIWebView loadRequest:request]; | 
|   | 
|      return self; | 
| } | 
| -(void) Init | 
| { | 
|     UIDevice *_device = [UIDevice currentDevice]; | 
|     _device.batteryMonitoringEnabled = true; | 
|      | 
|     NSString* _uniqueID = [[NSUserDefaults standardUserDefaults] objectForKey:@"tsw_unique_id"]; | 
|     //获取IDFA | 
|     NSString* _idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; | 
|      | 
|     if(_uniqueID == NULL || [_uniqueID length] <= 0) | 
|     { | 
|         //判断IDFA是否为空 | 
|         BOOL isEmpty = [[_idfa stringByReplacingOccurrencesOfString:@"-" withString:@""] stringByReplacingOccurrencesOfString:@"0" withString:@""].length; | 
|         if (isEmpty) { | 
|             //不为空,将IDFA作为唯一标识 | 
|             _uniqueID = _idfa; | 
|         } | 
|         else { | 
|             //为空,获取UUID作为唯一标识 | 
|             _uniqueID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; | 
|         } | 
|          | 
|         //保存唯一设备标识,如已存在则不进行任何处理 | 
|         [[NSUserDefaults standardUserDefaults] setObject:_uniqueID forKey:@"tsw_unique_id"]; | 
|         [[NSUserDefaults standardUserDefaults] synchronize]; | 
|     } | 
|     | 
|     // 取得UserAgent | 
|     [m_fakeUIWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable userAgent, NSError * _Nullable error) { | 
|   | 
|         NSLog(@"%@", userAgent); | 
|         NSString* _userAgent = [NSString stringWithFormat:@"%@", userAgent]; | 
|         // 发送设备信息 | 
|         NSMutableDictionary *_dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: | 
|                                       _uniqueID,@"unique_id", | 
|                                       _idfa,@"android_id", | 
|                                       [NSNumber numberWithInt:S2U_DeviceInfo],@"code", | 
|                                       _userAgent,@"userAgent",nil]; | 
|         [self SendMessageToUnity:_dict]; | 
|         }]; | 
|      | 
| } | 
|   | 
| -(void)SendMessageToUnity:(NSDictionary*)dict | 
| { | 
|     BOOL _result = [NSJSONSerialization isValidJSONObject:dict]; | 
|     if(_result) | 
|     { | 
|         NSData* _jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL]; | 
|         UnitySendMessage(UNITY_OBJ_NAME, UNITY_FUNC_NAME, | 
|                          [[[NSString alloc] initWithData:_jsonData encoding:NSUTF8StringEncoding] UTF8String]); | 
|     } | 
| } | 
|   | 
| -(void) BatteryThread { | 
|     while (TRUE) | 
|     { | 
|         [NSThread sleepForTimeInterval:1]; | 
|          | 
|         UIDevice *_device = [UIDevice currentDevice]; | 
|          | 
|         int _state = [_device batteryState]; | 
|         if(_state != sBatteryState){ | 
|             sBatteryState = _state; | 
|             NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
|                                    [NSNumber numberWithInt:sBatteryState], @"status", | 
|                                    [NSNumber numberWithInt:S2U_BatteryCharging], @"code", nil]; | 
|              | 
|             [self SendMessageToUnity:_dict]; | 
|         } | 
|          | 
|         int _level = (int)([_device batteryLevel] * 100); | 
|         if(_level != sBatteryLevel){ | 
|             sBatteryLevel = _level; | 
|             NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
|                                    [NSNumber numberWithInt:sBatteryLevel], @"level", | 
|                                    [NSNumber numberWithInt:S2U_BatteryLevel], @"code", nil]; | 
|              | 
|             [self SendMessageToUnity:_dict]; | 
|         } | 
|     } | 
| } | 
|   | 
| -(void) OpenURL:(NSString*) url { | 
|      | 
|     if(m_UIWebView != NULL) { | 
|         [self btnClick:NULL]; | 
|         return; | 
|     } | 
|      | 
|     CGRect _bounds = UnityGetMainWindow().bounds; | 
|      | 
|     float _scale = _bounds.size.width / 1334; | 
|      | 
|     float _width = 982 * _scale; | 
|     float _height = 560 * _scale; | 
|      | 
|     float _offsetX = (_bounds.size.width - _width) * .5f; | 
|     float _offsetY = (_bounds.size.height - _height) * .5f; | 
|      | 
|     m_UIWebView = [[WKWebView alloc] initWithFrame:CGRectMake(_offsetX, _offsetY, _width, _height)]; | 
|     m_UIWebView.UIDelegate = self; | 
|     m_UIWebView.navigationDelegate = self ; | 
|     m_UIWebView.scrollView.scrollEnabled = YES; | 
|     m_UIWebView.scrollView.bounces = NO; | 
|     NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:url]]; | 
|     [m_UIWebView loadRequest:request]; | 
|      | 
|      | 
| } | 
|   | 
| -(void) btnClick:(UIButton*)sender { | 
|     [m_CloseBtn removeFromSuperview]; | 
|     [m_CloseBtn removeTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; | 
|     m_CloseBtn = NULL; | 
|      | 
|     NSURLCache *_cache = [NSURLCache sharedURLCache]; | 
|     [_cache removeAllCachedResponses]; | 
|     [_cache setDiskCapacity:0]; | 
|     [_cache setMemoryCapacity:0]; | 
|      | 
|     [m_UIWebView removeFromSuperview]; | 
|     m_UIWebView = NULL; | 
| } | 
|   | 
|   | 
| //-(void)webViewDidFinishLoad:(WKWebView *)webView{ | 
| - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{ | 
|      | 
|     CGRect _bounds = UnityGetMainWindow().bounds; | 
|      | 
|     float _scale = _bounds.size.width / 1334; | 
|      | 
|     float _width = 982 * _scale; | 
|     float _height = 560 * _scale; | 
|      | 
|     m_CloseBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; | 
|     [m_CloseBtn setFrame:CGRectMake(_width - 600 * _scale, _height - 86 * _scale, 360 * _scale, 72 * _scale)]; | 
|     [m_CloseBtn setTitle:@"我知道了" forState:UIControlStateNormal]; | 
|      | 
|     NSString *_bundlePath = [[NSBundle mainBundle] pathForResource:@"The2thWorldRES.bundle" ofType:nil]; | 
|     NSBundle *_bundle = [NSBundle bundleWithPath:_bundlePath]; | 
|     NSString *pic1Path = [_bundle pathForResource:@"TY_AN_34.png" ofType:nil]; | 
|      | 
|     [m_CloseBtn setBackgroundImage:[UIImage imageWithContentsOfFile:pic1Path] forState:UIControlStateNormal]; | 
|     [m_CloseBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; | 
|     [m_CloseBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; | 
|      | 
|     [m_UIWebView addSubview:m_CloseBtn]; | 
|      | 
|     UIView *view = UnityGetGLViewController().view; | 
|     [view addSubview:m_UIWebView]; | 
| } | 
|   | 
|   | 
| -(void)QuickSDKInit:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { | 
|      | 
|     /* | 
|      初始化完成之后,会有初始化完成通知( yyj_PlatformInitDidFinishedNotification )开发者在该回调方法中做登录操作 | 
|      该通知应注册在初始化之前 | 
|      */ | 
|     //添加一个初始化通知观察者,初始化结束后,登录等操作务必在收到该通知后调用 | 
|     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformInitFinished) name:PlatformInitDidFinishedNotification object:nil]; | 
|      | 
|     //初始化失败 | 
|     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformInitFinishedFail) | 
|     name:PlatformInitFinishedFailNotification object:nil]; | 
|      | 
|     // 添加一个支付成功通知观察者 | 
|     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformBMaiSuccessful) name:PlatformBMaiSuccessfulNotification  object:nil]; | 
|      | 
|     // 添加一个支付失败通知观察者 | 
|     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformBMaiFail) name:PlatformBMaiFailNotification  object:nil]; | 
|      | 
|     //添加一个登录成功通知观察者,调用悬浮框等操作务必在收到该通知后调用 | 
|     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformLogin) name:PlatformLoginNotification object:nil]; | 
|      | 
|     //添加一个注销成功通知观察者 | 
|     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformLogout) name:PlatformLogoutNotification  object:nil]; | 
|      | 
|    //添加FB分享 结果通知观察者 | 
|    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(YYJPlatformFBShareNotify:) name:PlatformShareFBNotification  object:nil]; | 
|      | 
| #ifdef DEBUG | 
|     // 输出日志 | 
|     [[YYJPlatform yyj_defaultPlatform]yyj_isShowLog:YES]; | 
| #endif | 
|      | 
|     [self initYYJSdk]; | 
|      | 
|     //appsflyer | 
|     [[SXGMSDK shareSDK] AppsFlyer_Init:AF_KEY appleAppID:AF_APPLE_APPID]; | 
|     //google | 
|     [[SXGMSDK shareSDK] google_Init:kClientID]; | 
|     //facebook | 
|     [[SXGMSDK shareSDK] fb_Init:application launchOptions:launchOptions]; | 
|      | 
|      | 
|     //升级iOS SDK V6 介绍 ++++++++ | 
|     [[NSNotificationCenter defaultCenter] addObserver:self | 
|             selector:@selector(sendAppsFlyerLaunch:) | 
|             name:UIApplicationDidBecomeActiveNotification | 
|             object:nil]; | 
|     //升级iOS SDK V6 介绍 ++++++++ | 
|      | 
| } | 
| -(void)sendAppsFlyerLaunch:(UIApplication *)application { | 
|     [[SXGMSDK shareSDK] AppFlysStart]; | 
| } | 
| -(void) initYYJSdk{ | 
|     NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; | 
|     NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; | 
|     // SDK初始化,务必放在其他接⼝调⽤之前 | 
|     [[SXGMSDK shareSDK] initializeWithAppId:YYJ_APPID gameVersion:app_Version]; | 
|     initedState=0; | 
| } | 
|   | 
| - (void)YYJPlatformInitFinished{ | 
|     NSLog(@"渠道初始化成功"); | 
|     initedState=1; | 
|     NSMutableDictionary *_dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: | 
|                                   [NSNumber numberWithInt:S2U_SdkInitComplete], @"code", | 
|                                   @"sanxiaios", @"channelPlatform", nil]; | 
|     [self SendMessageToUnity:_dict]; | 
| } | 
|   | 
|   | 
| - (void)YYJPlatformInitFinishedFail{ | 
|     NSLog(@"渠道初始化失败"); | 
|     initedState=2; | 
| } | 
|   | 
| - (void)YYJPlatformLogin { | 
| //    NSString *regType = [[SXGMSDK shareSDK] regType]; | 
|     NSString *loginType = [[SXGMSDK shareSDK] loginType]; | 
| //    if(regType&&[regType length]!=0){ | 
| //        NSLog(@"渠道注册成功"); | 
| //        NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
| //                               regType, @"reg_type", | 
| //                               [NSNumber numberWithInt:S2U_FreePlatformRegisterOk], @"code", nil]; | 
| //        [self SendMessageToUnity:_dict]; | 
| //    } | 
|     if(loginType&&[loginType length]!=0){ | 
|         NSLog(@"渠道登录成功"); | 
|         NSString *account = [[SXGMSDK shareSDK] userUID]; | 
|         NSString *game_id = [[SXGMSDK shareSDK] gameId]; | 
|         NSString *session_id = [[SXGMSDK shareSDK] token]; | 
|          | 
|         NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
|                                [NSDictionary dictionaryWithObjectsAndKeys:account, @"account", | 
|                                 game_id, @"game_id", | 
|                                 session_id, @"session_id", nil],@"info", | 
|                                [NSNumber numberWithInt:S2U_FreePlatformLoginOk], @"code", nil]; | 
|         [self SendMessageToUnity:_dict]; | 
|     } | 
|     //调用悬浮框,开发者继续游戏逻辑 | 
|     [[SXGMSDK shareSDK] showFloatWindow]; | 
|     | 
|      | 
|     //升级iOS SDK V6 介绍 ++++++++ | 
|     if (@available(iOS 14, *)) { | 
|             [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status){ | 
|                 NSLog(@"attracking .. status: %ld",status); | 
|             }]; | 
|     } | 
| } | 
|   | 
| - (void)YYJPlatformLogout { | 
|     NSLog(@"渠道注销成功"); | 
|     NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:S2U_FreePlatformLogoutOk], @"code", nil]; | 
|     [self SendMessageToUnity:_dict]; | 
| } | 
|   | 
| - (void)YYJPlatformBMaiSuccessful{ | 
|     NSLog(@"渠道支付成功"); | 
|     NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
|                            [NSNumber numberWithInt:S2U_FreePlatformPayOk], @"code", nil]; | 
|     [self SendMessageToUnity:_dict]; | 
| } | 
|   | 
| - (void) YYJPlatformBMaiFail{ | 
|     NSLog(@"渠道支付失败"); | 
|     NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
|                            [NSNumber numberWithInt:S2U_FreePlatformPayFail], @"code", nil]; | 
|     [self SendMessageToUnity:_dict]; | 
| } | 
|   | 
| //FB 分享回调通知 | 
| -(void)YYJPlatformFBShareNotify:(NSNotification *)obj | 
| { | 
|     NSString *msg = obj?[obj.userInfo valueForKey:@"msg"]: @""; | 
|     NSInteger code = obj? [[obj.userInfo valueForKey:@"code"] intValue] :-1; | 
|      | 
|     //code: 1成功, -1 取消, -2 异常 | 
|     int state = 0; | 
|     switch (code) { | 
|         case 1: | 
|             //成功 | 
|             state = 1; | 
|             break; | 
|         case -2: | 
|             //异常 | 
|             state = 2; | 
|             break; | 
|         default: | 
|             //取消 | 
|             state = 0; | 
|             break; | 
|     } | 
|     NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: | 
|                            [NSNumber numberWithInt:state], @"state", | 
|                            [NSNumber numberWithInt:S2U_ShareCallBack], @"code", nil]; | 
|     [self SendMessageToUnity:_dict]; | 
|     NSLog(@"** FB 分享完成  ** code:%ld, msg:%@ ", code, msg); | 
| } | 
|   | 
|   | 
| -(id) APNativeJSONObject:(NSData *)data{ | 
|     if (!data) { | 
|         return nil; | 
|     } | 
|      | 
|     NSError *error = nil; | 
|     id retId = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; | 
|      | 
|     if (error) { | 
|         NSLog(@"%s trans data to obj with error: %@", __func__, error); | 
|         return nil; | 
|     } | 
|      | 
|     return retId; | 
| } | 
|   | 
| -(void) PlatformLogin{ | 
|     switch (initedState) { | 
|         case 0: | 
|         { | 
|            | 
|         } | 
|             break; | 
|         case 1: | 
|             //[[YYJPlatform yyj_defaultPlatform]yyj_userLogin]; | 
|             [[SXGMSDK shareSDK] UserLogin]; | 
|             break; | 
|         case 2: | 
|             [self initYYJSdk]; | 
|             break; | 
|         default: | 
|             break; | 
|     } | 
| } | 
|   | 
| -(void)HandleUnityMessage:(NSString *)json { | 
|      | 
|     NSLog(@"收到Unity发来的消息 => %@", json); | 
|      | 
|     NSData *_jsonData = [json dataUsingEncoding:NSUTF8StringEncoding]; | 
|     NSDictionary *_dict = [self APNativeJSONObject:_jsonData]; | 
|      | 
|     switch([[_dict objectForKey:@"code"] intValue]){ | 
|         case U2S_Init: | 
|             sAppID = _dict[@"appID"]; | 
|             sGameID = _dict[@"gameID"]; | 
|             [self Init]; | 
|             break; | 
|         case U2S_CopyContent: | 
|             [UIPasteboard generalPasteboard].string = _dict[@"content"]; | 
|             break; | 
|         case U2S_FreePlatformInit: | 
|             break; | 
|         case U2S_MakeKeyAndVisible: | 
|         { | 
|             UIWindow * _window = [[UIApplication sharedApplication].delegate window]; | 
|             if (_window != nil && _window.rootViewController != nil) { | 
|                 [_window makeKeyAndVisible]; | 
|             } | 
|         } | 
|             break; | 
|         case U2S_OpenWebView: | 
|             [self OpenURL:_dict[@"url"]]; | 
|             break; | 
|         case U2S_FreePlatformLogin: | 
|             [self PlatformLogin]; | 
|             break; | 
|         case U2S_ShowAccountView: | 
|         { | 
|             [[SXGMSDK shareSDK] ShowAccountView]; | 
|         } | 
|             break; | 
|         case U2S_FreePlatformLogout: | 
|         { | 
|             [[SXGMSDK shareSDK] UserLogin]; | 
|         } | 
|             break; | 
|         case U2S_CreateRole: | 
|         { | 
|             // 更新角色信息 | 
|             NSString *serverId = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]]; | 
|             NSString *serviceTypeId= @"0"; | 
|             NSString *serverName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]]; | 
|             NSString *gameRoleID = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]]; | 
|             NSString *gameRoleName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]]; | 
|             NSString *gameUserLevel = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]]; | 
|              | 
|             [[SXGMSDK shareSDK]submitRoleInfoWithServiceCode:serverId WithRoleId:gameRoleID WithRoleName:gameRoleName WithLevel:gameUserLevel WithServiceTypeId:serviceTypeId WithServiceTypeName:serverName ]; | 
|             break; | 
|         } | 
|         case U2S_RoleLogin: | 
|         { | 
|             // 更新角色信息 | 
|             NSString *serverId = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]]; | 
|             NSString *serviceTypeId= @"0"; | 
|             NSString *serverName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]]; | 
|             NSString *gameRoleID = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]]; | 
|             NSString *gameRoleName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]]; | 
|             NSString *gameUserLevel = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]]; | 
|              | 
|             [[SXGMSDK shareSDK]submitRoleInfoWithServiceCode:serverId WithRoleId:gameRoleID WithRoleName:gameRoleName WithLevel:gameUserLevel WithServiceTypeId:serviceTypeId WithServiceTypeName:serverName ]; | 
|             break; | 
|         } | 
|              | 
|         case U2S_RoleLevelUp: | 
|         { | 
|             // 更新角色信息 | 
|             NSString *serverId = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]]; | 
|             NSString *serviceTypeId= @"0"; | 
|             NSString *serverName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"serverName"]]; | 
|             NSString *gameRoleID = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]]; | 
|             NSString *gameRoleName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleName"]]; | 
|             NSString *gameUserLevel = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"level"]]; | 
|              | 
|             [[SXGMSDK shareSDK]submitRoleInfoWithServiceCode:serverId WithRoleId:gameRoleID WithRoleName:gameRoleName WithLevel:gameUserLevel WithServiceTypeId:serviceTypeId WithServiceTypeName:serverName ]; | 
|             break; | 
|         } | 
|         case U2S_FreePlatformPay: | 
|         { | 
|             NSString *serverId = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"sid"]]; | 
|             NSString *gameRoleID = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"roleID"]]; | 
|             NSString *goodsID = [NSString stringWithFormat:@"%@", [_dict objectForKey:@"cpInfo"]]; | 
|             NSString *productName = [NSString stringWithFormat:@"%@", [_dict objectForKey:@"title"]]; | 
|             NSString *mount = [NSString stringWithFormat:@"%@", [_dict objectForKey:@"mount"]]; | 
|             NSString *orderId = [NSString stringWithFormat:@"%@", [_dict objectForKey:@"orderId"]]; | 
|             NSString *payType = @"apple"; | 
|             NSString *_appid = sAppID; | 
|             NSString *extrasParams = [NSString stringWithFormat:@"{\"appid\":\"%@\",\"cpinfo\":\"%@\",\"cporderid\":\"%@\"}", | 
|                                   _appid, | 
|                                   [_dict objectForKey:@"cpInfo"], | 
|                                   [_dict objectForKey:@"orderId"] | 
|                                   ]; | 
|             [[SXGMSDK shareSDK] CreatOrderWithCpOrderId:orderId WithMoney:mount WithGoodsId:goodsID WithGoodsName:productName WithPayType:payType WithServer:serverId WithRole:gameRoleID  WithExt:extrasParams]; | 
|             break; | 
|         } | 
|         case U2S_BatteryListenStart: | 
|             if(_thread == NULL) | 
|             { | 
|                 _thread = [[NSThread alloc] initWithTarget:self selector:@selector(BatteryThread) object:nil]; | 
|                 [_thread setName:@"BatteryCheck"]; | 
|             } | 
|             if(![_thread isExecuting]) | 
|             { | 
|                 [_thread start]; | 
|             } | 
|             break; | 
|         case U2S_BatteryListenStop: | 
|             break; | 
|         case U2S_AFTrackEvent: | 
|         { | 
|             NSString *eventName = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"eventName"]]; | 
|             NSDictionary *param=  _dict[@"eventValues"]; | 
|             [[SXGMSDK shareSDK] AppFlysTraceEvent:eventName param:param]; | 
|             break; | 
|         } | 
|   | 
|         case U2S_ShareToFaceBook: | 
|         { | 
|             NSString *shareurl = [NSString stringWithFormat:@"%@",[_dict objectForKey:@"url"]]; | 
|             [[SXGMSDK shareSDK] shareByfacebook:@"share" img:NULL]; | 
|              | 
|             break; | 
|         } | 
|   | 
|     } | 
| } | 
| @end | 
|   | 
| extern "C" void native_opus_init(int frequency, int bitRate, int bandMode) | 
| { | 
|     s_frequency = frequency; | 
|     s_bandMode = bandMode; | 
|     s_bitRate = bitRate; | 
|     s_frameSize = frequency / 100; | 
| } | 
|   | 
| extern "C" int native_opus_encode(opus_int16 *pcm, int len, unsigned char *opus) | 
| { | 
|     int errorCode = 0; | 
|     opus_int32 skip = 0; | 
|     OpusEncoder *enc = opus_encoder_create(s_frequency, CHANNEL_NUM, OPUS_APPLICATION_VOIP, &errorCode); | 
|     if (OPUS_OK != errorCode) { | 
|         enc = NULL; | 
|         return -1; | 
|     } | 
|      | 
|     opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(s_bandMode)); | 
|     opus_encoder_ctl(enc, OPUS_SET_BITRATE(s_bitRate)); | 
|     opus_encoder_ctl(enc, OPUS_SET_VBR(1)); | 
|     opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(10)); | 
|     opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0)); | 
|     opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_SIGNAL_VOICE)); | 
|     opus_encoder_ctl(enc, OPUS_SET_DTX(0)); | 
|     opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(0)); | 
|     opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip)); | 
|     opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16)); | 
|      | 
|     unsigned char *rbytes = opus; | 
|     opus_int16 *frame = pcm; | 
|     int totalSize = 0; | 
|     while (len >= s_frameSize) | 
|     { | 
|         opus_int32 length = opus_encode(enc, frame, s_frameSize, rbytes + sizeof(char), s_bitRate); | 
|         rbytes[0] = length; | 
|         frame += s_frameSize; | 
|         rbytes += length + sizeof(char); | 
|         len -= s_frameSize; | 
|         totalSize += (length+1); | 
|     } | 
|     opus_encoder_destroy(enc); | 
|     return totalSize; | 
| } | 
|   | 
| extern "C" int native_opus_decode(unsigned char *opus, int len, short *pcm) | 
| { | 
|     int err = 0; | 
|     //opus_int32 skip = 0; | 
|      | 
|     OpusDecoder *dec = opus_decoder_create(s_frequency, CHANNEL_NUM, &err); | 
|     if (err != OPUS_OK) { | 
|         dec = NULL; | 
|         return -1; | 
|     } | 
|      | 
|     while (len > 0) | 
|     { | 
|         int frame_opus_length = opus[0]; | 
|         int length = opus_decode(dec, opus + sizeof(char), frame_opus_length, pcm, s_frameSize, 0); | 
|         opus += sizeof(char) + frame_opus_length; | 
|         pcm += s_frameSize; | 
|         len = len - frame_opus_length - sizeof(char); | 
|     } | 
|     opus_decoder_destroy(dec); | 
|     return 0; | 
| } |