LuLuConnector.mm 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. //
  2. #import "LuLuConnector.h"
  3. #if defined(__cplusplus)
  4. extern "C" {
  5. #endif
  6. extern NSString* LoginKitCreateNSString (const char* string);
  7. extern char* LoginKitMakeStringCopy(const char*string);
  8. extern void UnitySendMessage(const char *, const char *, const char *);
  9. #pragma mark - SDK 平台接口调用
  10. void LuluSetListener(const char *gameObjectName){
  11. [[LuLuConnector shareInstance] setListener:LoginKitCreateNSString(gameObjectName)];
  12. }
  13. void luLuInit(){
  14. //设置回调
  15. [REDeLoginKit setFunctionLoginCallback:[LuLuConnector shareInstance]];
  16. [REDeLoginKit setFunctionBuyCallback:[LuLuConnector shareInstance]];
  17. [REDeLoginKit restoreNonConsumptionProducts:[LuLuConnector shareInstance]];
  18. // 初始化
  19. NSString *gameId = @"38269516260030609925583594255948";
  20. NSDictionary<NSString *, id> *infoDictionary = [NSBundle mainBundle].infoDictionary;
  21. id value = [infoDictionary objectForKey:@"QkSDK_GameId"];
  22. if (value != NULL && [value isKindOfClass:[NSString class]]) {
  23. gameId = (NSString *)value;
  24. }
  25. [REDeLoginKit initSDKWithProductCode:gameId callback:[LuLuConnector shareInstance]]; /** productCode到sdk后台获取, 请务必修改为自己的参数 */
  26. }
  27. /** 显示登陆界面 */
  28. void luLuLogin(BOOL isShowMenu){
  29. [REDeLoginKit loginWithMenuShow:isShowMenu];
  30. }
  31. /** 固定调起某个三方登录 */
  32. void loginKitLoginWithType(int type){
  33. [REDeLoginKit loginAccountType:(USERCENTER_TYPE)type];
  34. }
  35. /** 静默登录不显示登陆界面 */
  36. void luLuFastStartGame(){
  37. [REDeLoginKit fastlyStartGame];
  38. }
  39. /** 获取userid */
  40. const char * LuluGetUserId(){
  41. NSString * userId = [REDeLoginKit userID];
  42. return LoginKitMakeStringCopy([userId UTF8String]);
  43. }
  44. /** 获取SDK设备ID */
  45. const char * LuluGetDeviceId(){
  46. NSString * deviceId = [REDeLoginKit getDeviceID];
  47. return LoginKitMakeStringCopy([deviceId UTF8String]);
  48. }
  49. /** 注销登陆 */
  50. void luLuLogout(){
  51. [REDeLoginKit logout];
  52. }
  53. /** 显示个人中心 */
  54. void luLuUserCenter(){
  55. [REDeLoginKit enterUserCenter];
  56. }
  57. /** 获取三方绑定信息 */
  58. const char * luLuGetUserBindInfo(){
  59. NSDictionary * resultDict = [REDeLoginKit getUserBindInfo];
  60. NSString *jsonStr = [[LuLuConnector shareInstance] dictionaryToJson:resultDict];
  61. return LoginKitMakeStringCopy([jsonStr UTF8String]);
  62. }
  63. /** 进入三方绑定界面 */
  64. void luLuBindAccount(){
  65. [REDeLoginKit bandAccount];
  66. }
  67. /** 绑定三方账号 */
  68. void luLuBindAccountWithType(int type){
  69. [REDeLoginKit bindAccountType:(USERCENTER_TYPE)type];
  70. }
  71. /** 解绑三方账号 */
  72. void luLuUnbindAccountWithType(int type){
  73. [REDeLoginKit unbindAccount:(USERCENTER_TYPE)type];
  74. }
  75. /** 删除当前登录账号,游客登录没有此功能 */
  76. void luLuAccountDeletion(){
  77. [REDeLoginKit accountDeletion];
  78. }
  79. /** 显示悬浮窗 */
  80. void luLuShowMenu(float y){
  81. [REDeLoginKit showFloatButtonIsLeft:YES buttonOriginalY:y > 0 ? y:40];
  82. }
  83. /** 隐藏悬浮窗 */
  84. void luLuDismissMenu(){
  85. [REDeLoginKit dismissMenu];
  86. }
  87. /** 上报角色信息 */
  88. void luluSetRoleInfo(const char *serverName,const char *serverId,const char *roleId,const char *roleName,const char *roleLevel,const char *roleVipLevel){
  89. REDeRoleInfo * role = [[REDeRoleInfo alloc]init];
  90. role.server_name = LoginKitCreateNSString(serverName);
  91. role.server_id = LoginKitCreateNSString(serverId);
  92. role.game_role_name = LoginKitCreateNSString(roleName);
  93. role.game_role_id = LoginKitCreateNSString(roleId);
  94. role.game_role_level = LoginKitCreateNSString(roleLevel);
  95. role.vip_level = LoginKitCreateNSString(roleVipLevel);
  96. [REDeLoginKit setGameRoleInfo:role];
  97. }
  98. /** 调用下单方法 */
  99. void luLuCongzi(const char *productId,const char *productName,char * amount,const char *orderNo,const char *callBackUrl,const char *extrasParams){
  100. REDeOrderInfo *param = [[REDeOrderInfo alloc] init];
  101. param.productId = LoginKitCreateNSString(productId); ///设置商品ID,苹果后台对应的productID
  102. param.subject = LoginKitCreateNSString(productName); ///商品名称 必填
  103. param.total = LoginKitCreateNSString(amount); ///商品总价 必填
  104. param.product_order_no = LoginKitCreateNSString(orderNo); ///游戏方订单号 string[64] 接入QuickAd时必填、必须唯一
  105. param.callback_url = LoginKitCreateNSString(callBackUrl); ///回调通知地址 string[200] 可选 客户端配置优先; 可传nil
  106. param.extras_params = LoginKitCreateNSString(extrasParams); ///透传参数 可选
  107. [REDeLoginKit IAPWithParameter:param];
  108. }
  109. /** 恢复历史内购 */
  110. void luluRestoreNonConsumptionProducts(){
  111. [REDeLoginKit restoreNonConsumptionProducts:[LuLuConnector shareInstance]];
  112. }
  113. /** 通过商品ids数组查找商品信息 */
  114. void luluFindProductInfo(const char *productIds){
  115. NSString * productIdStr = LoginKitCreateNSString(productIds);
  116. NSArray * productIdArr = [[LuLuConnector shareInstance] arrFromJsonStr:productIdStr];
  117. if (productIdArr.count) {
  118. [REDeLoginKit findProductInfoWithProductIds:productIdArr delegate:(id)[LuLuConnector shareInstance]];
  119. } else {
  120. [[LuLuConnector shareInstance] sendU3dMessage:@"findProductInfoFail" parameters:@"productids is not json string"];
  121. }
  122. }
  123. NSString* LoginKitCreateNSString (const char* string)
  124. {
  125. if (string)
  126. return [NSString stringWithUTF8String: string];
  127. else
  128. return [NSString stringWithUTF8String: ""];
  129. }
  130. char* LoginKitMakeStringCopy(const char*string) {
  131. if (string == NULL) {
  132. return NULL;
  133. }
  134. char*res = (char*)malloc(strlen(string)+1);
  135. strcpy(res, string);
  136. return res;
  137. }
  138. #if defined(__cplusplus)
  139. }
  140. #endif
  141. @implementation LuLuConnector
  142. +(LuLuConnector *)shareInstance{
  143. static LuLuConnector *shareInstance = nil;
  144. static dispatch_once_t predicate;
  145. dispatch_once(&predicate, ^{
  146. shareInstance = [[LuLuConnector alloc] init];
  147. });
  148. return shareInstance;
  149. }
  150. //MARK: - 回调
  151. // 初始化结果回调
  152. - (void)qgSDKInitDone {
  153. // 初始化成功
  154. if (_U3dInited) {
  155. [self sendU3dMessage:@"onInitSuccess" parameters:@"Init:Init Success"];
  156. return;
  157. }
  158. else
  159. {
  160. [self sendU3dMessage:@"onInitSuccess" parameters:@"Fail"];
  161. }
  162. _initSuccess = YES;
  163. }
  164. // 登录回调
  165. - (void)loginUid:(NSString *)uid userToken:(NSString *)token type:(USERCENTER_TYPE)type {
  166. NSDictionary * resultDict = @{@"uid":uid, @"token":token, @"loginType":@(type).stringValue, @"isNewUser":@(REDeLoginKit.isNewUser).stringValue, @"isGuest":@(REDeLoginKit.isUserGuest).stringValue};
  167. [self sendU3dMessage:@"onLoginSuccess" parameters:[self dictionaryToJson:resultDict]];
  168. }
  169. //绑定回调
  170. - (void)bindUid:(NSString *)uid userToken:(NSString *)token type:(USERCENTER_TYPE)type
  171. {
  172. NSDictionary * resultDict = @{@"uid":uid, @"token":token, @"loginType":@(type).stringValue};
  173. [self sendU3dMessage:@"onBindSuccess" parameters:[self dictionaryToJson:resultDict]];
  174. }
  175. //解绑回调
  176. - (void)unBindUid:(NSString *)uid userToken:(NSString *)token type:(USERCENTER_TYPE)type
  177. {
  178. NSDictionary * resultDict = @{@"uid":uid, @"token":token, @"loginType":@(type).stringValue};
  179. [self sendU3dMessage:@"onUnBindSuccess" parameters:[self dictionaryToJson:resultDict]];
  180. }
  181. /** 游戏调用logout操作完成回调 */
  182. - (void)gameLogoutSuccess {
  183. [self sendU3dMessage:@"onGameLogoutSuccess" parameters:@"game Logout"];
  184. }
  185. //在SDK的个人中心主动退出登录
  186. - (void)userLogout{
  187. NSLog(@"用户从个人中心手动登出。");
  188. [self sendU3dMessage:@"onLogoutSuccess" parameters:@"Log out"];
  189. }
  190. //支付结果的回调
  191. //购买完成 内购商品Id SDK订单号
  192. - (void)purchaseDoneProductId:(NSString *)productId orderNo:(NSString *)orderNo gameOrderNo:(NSString *)gameOrderNo appStoreReceiptBase64EncodedString:(NSString *)receiptString {
  193. NSMutableDictionary * resultDict = [NSMutableDictionary dictionary];
  194. [resultDict setObject:productId forKey:@"productId"];
  195. [resultDict setObject:orderNo forKey:@"orderNo"];
  196. [resultDict setObject:gameOrderNo forKey:@"gameOrderNo"];
  197. [resultDict setObject:receiptString forKey:@"receiptString"];
  198. [self sendU3dMessage:@"onPurchaseSuccess" parameters:[self dictionaryToJson:resultDict]];
  199. }
  200. //购买失败
  201. - (void)purchaseFail{
  202. [self sendU3dMessage:@"onPurchaseFail" parameters:@""];
  203. }
  204. //恢复非消耗商品成功,返回商品id信息
  205. - (void)restoreSuccess:(NSArray *)products
  206. {
  207. [self sendU3dMessage:@"onRestoreSuccess" parameters:[self jsonStrFromArr:products]];
  208. }
  209. //恢复失败
  210. - (void)restoreFail:(NSString *)msg
  211. {
  212. [self sendU3dMessage:@"onRestoreFail" parameters:msg];
  213. }
  214. //查找商品信息成功数组元素为REDeOrderInfo实例
  215. - (void)findProductInfoSuccess:(NSArray *)products {
  216. NSMutableArray * arr = [[NSMutableArray alloc]init];
  217. for (REDeOrderInfo * info in products) {
  218. // NSLog(@"查询商品信息成功结果:商品id=%@,商品名称=%@,商品描述=%@,商品价格=%@,商品总价=%@,透传参数=%@",info.productId, info.subject, info.desc, info.price, info.total, info.extras_params);
  219. [arr addObject:@{@"productId":info.productId, @"productName":info.subject, @"productDesc":info.desc, @"price":info.price, @"total":info.total, @"extras_params":info.extras_params}];
  220. }
  221. NSString *jsonStr = [self jsonStrFromArr:arr];
  222. [self sendU3dMessage:@"findProductInfoSuccess" parameters:[self jsonStrFromArr:arr]];
  223. }
  224. //查找商品信息失败
  225. - (void)findProductInfoFail:(NSString *)msg {
  226. [self sendU3dMessage:@"findProductInfoFail" parameters:msg];
  227. }
  228. - (void)setListener:(NSString *)gameObjectName
  229. {
  230. _gameObjectName = gameObjectName;
  231. _U3dInited = YES;
  232. if (_initSuccess)//初始化成功
  233. {
  234. [self sendU3dMessage:@"onInitSuccess" parameters:nil];
  235. _initSuccess = NO;
  236. }
  237. }
  238. - (void)sendU3dMessage:(NSString *)messageName parameters:(NSString *)parameters {
  239. if (!_gameObjectName) {
  240. NSLog(@"U3D not set listener");
  241. return;
  242. }
  243. if ([parameters isKindOfClass:NSString.class] && [parameters length]) {
  244. UnitySendMessage([_gameObjectName UTF8String], [messageName UTF8String], [parameters UTF8String]);
  245. }
  246. else{
  247. UnitySendMessage([_gameObjectName UTF8String], [messageName UTF8String], "");
  248. }
  249. }
  250. - (NSString *)jsonStrFromArr:(NSArray *)arr {
  251. NSError *error = nil;
  252. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:0 error:&error];
  253. if ([error code]) {
  254. return @"";
  255. }
  256. return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  257. }
  258. - (NSArray *)arrFromJsonStr:(NSString *)string {
  259. NSError *error = nil;
  260. NSData* data = [string dataUsingEncoding:NSUTF8StringEncoding];
  261. id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:nil];
  262. if ([jsonObject isKindOfClass:NSArray.class]) {
  263. return jsonObject;
  264. }
  265. return @[];
  266. }
  267. - (NSDictionary *)dictionaryFromJsonStr:(NSString *)string {
  268. NSError *error = nil;
  269. NSData* data = [string dataUsingEncoding:NSUTF8StringEncoding];
  270. id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:nil];
  271. if ([jsonObject isKindOfClass:NSDictionary.class]) {
  272. return jsonObject;
  273. }
  274. return @{};
  275. }
  276. - (NSString*)dictionaryToJson:(NSDictionary *)dic
  277. {
  278. NSError *parseError = nil;
  279. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];
  280. return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  281. }
  282. @end