// // WXApiManager.m // Unity-iPhone // // Created by wei liu on 2018/1/8. // #import "WXApiManager.h" #define WeiXinID @"wxe62c94a32796c496" #define WeiXinSecret @"e5278caf943b221493bb67b686bbb41f" #define GameObjectName "Main Camera" #define MethodName "Weixincallback_LoginSuccess" #define ShareMethod "Weixincallback_shareSuccess" const NSString * gameData = nil; const NSString * gameObjName = nil; const NSString * authorCallBack = nil; const NSString * authorCancle = nil; const NSString * shareCallBack = nil; const NSString * shareCancle = nil; const NSString * needAccessToken = nil; @implementation WXApiManager extern "C"{ void InitSDK(char * gameObjectNameP){ gameObjName = [NSString stringWithUTF8String:gameObjectNameP]; // needAccessToken = [NSString stringWithUTF8String:gameObjectNameP]; // NSLog(@"gameObjName gameObjectNameP:::%s",gameObjectNameP); // NSLog(@"gameObjName:::%s",gameObjName); } bool IsInstallWX(){ return [WXApi isWXAppInstalled]; } bool isWXAppSupportApi() { return [WXApi isWXAppSupportApi]; } void unityToIOS(char* str){ SendAuthReq* req = [[SendAuthReq alloc] init]; req.scope = @"snsapi_userinfo"; req.state = @"wechat_sdk"; [WXApi sendReq:req]; } void WXLogin(char* successP,char* cancleP){ authorCallBack = [NSString stringWithUTF8String:successP]; authorCancle = [NSString stringWithUTF8String:cancleP]; SendAuthReq* req = [[SendAuthReq alloc] init]; req.scope = @"snsapi_userinfo"; req.state = @"wechat_sdk"; [WXApi sendReq:req]; } void ShareAppDataToWX(int type){ WXAppExtendObject *appdata = [WXAppExtendObject object]; appdata.extInfo = @"This is ext info"; WXMediaMessage *message = [WXMediaMessage message]; message.title = @"This is title"; message.description = @"this is desc"; message.mediaObject = appdata; SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; if (type == 1){ req.scene = WXSceneSession; }else{ req.scene = WXSceneTimeline; } [WXApi sendReq:req]; } void ShareTextToWX(const char* text, int type,char *successP, char *cancleP){ shareCallBack = [NSString stringWithUTF8String:successP]; shareCancle = [NSString stringWithUTF8String:cancleP]; // NSLog(@"successTextP:::::::::%s",successP); // NSLog(@"cancleTextP:::::::::%s",cancleP); // NSLog(@"shareCancle gameObjName:::%@",gameObjName); // NSLog(@"shareCancle:::%@",shareCancle); SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; req.bText = YES; req.text = [NSString stringWithUTF8String:text]; if (type == 1){ req.scene = WXSceneSession; }else{ req.scene = WXSceneTimeline; } [WXApi sendReq:req]; // Byte* pBuffer = (Byte *)malloc(1024*100); // memset(pBuffer, 0, 1024*100); // NSData *data =[NSData dataWithBytes:pBuffer length:1024*100]; // free(pBuffer); // WXAppExtendObject *appdata = [WXAppExtendObject object]; // appdata.extInfo = @"This is ext info"; // appdata.url = @"http://weixin.qq.com"; // appdata.fileData = data; // // WXMediaMessage *message = [WXMediaMessage message]; // message.title = @"This is title"; // message.description = @"this is desc"; // message.mediaObject = appdata; // SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init]; // req.bText = NO; // req.message = message; // if (type == 1){ // req.scene = WXSceneSession; // }else{ // req.scene = WXSceneTimeline; // } // [WXApi sendReq:req]; } //分享图片 void ShareLocalImageToWX(const char* path, int type,char *successP, char *cancleP){ shareCallBack = [NSString stringWithUTF8String:successP]; shareCancle = [NSString stringWithUTF8String:cancleP]; WXMediaMessage *message = [WXMediaMessage message]; //[message setThumbImage:[UIImage imageNamed:@"图片.png"]]; NSString *imgPath = [NSString stringWithUTF8String:path]; UIImage *orgImg = [UIImage imageWithContentsOfFile:imgPath]; UIImage *img = [[WXApiManager sharedManager] thumbScaleImage:orgImg toByte:32000]; [message setThumbImage:img]; //缩略图 WXImageObject *imageObject = [WXImageObject object]; //NSLog(@"hhh1111"); //NSString *filePath = [[NSBundle mainBundle] pathForResource:imgPath ofType:@"jpg"];//图片路径 //UIImage orgImage = [UIImage imageWithContentsOfFile:<#(nonnull NSString *)#>] imageObject.imageData = [NSData dataWithContentsOfFile:imgPath]; message.mediaObject = imageObject; //NSLog(@"hhh222"); SendMessageToWXReq *req =[[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; if (type == 1){ req.scene = WXSceneSession; }else{ req.scene = WXSceneTimeline; } //NSLog(@"hhh3333"); // req.scene = WXSceneTimeline; //分享到朋友圈 [WXApi sendReq:req]; } //分享url void ShareWebUrlToWX(const char* title,const char*desc,const char*url,const char*imagePath,int type,char *successP,char *cancleP) { shareCallBack = [NSString stringWithUTF8String:successP]; shareCancle = [NSString stringWithUTF8String:cancleP]; NSString *titleStr=[NSString stringWithUTF8String:title]; NSString *descStr=[NSString stringWithUTF8String:desc];//0416aa28b5d2ed1f3199083b3806c6bl NSString *urlStr=[NSString stringWithUTF8String:url]; NSLog(@"ShareByIos titleStr:%@",titleStr); NSLog(@"ShareByIos descStr:%@",descStr); NSLog(@"ShareByIos urlStr:%@",urlStr); WXAppExtendObject *appdata = [WXAppExtendObject object]; appdata.extInfo = @"This is ext info"; // UIImage *img=[UIImage imageNamed:@"AppIcon72x72"]; // NSLog(@"ShareByIos img:%@",img); // 分享 WXMediaMessage *message = [WXMediaMessage message]; message.title = titleStr; message.description = descStr; message.mediaObject = appdata; //[message setThumbImage:[UIImage imageNamed:@"AppIcon72x72"]]; NSString *imgPath = [NSString stringWithUTF8String:imagePath]; UIImage *orgImg = [UIImage imageWithContentsOfFile:imgPath]; UIImage *img = [[WXApiManager sharedManager] thumbScaleImage:orgImg toByte:32000]; [message setThumbImage:img]; WXWebpageObject *ext = [WXWebpageObject object]; ext.webpageUrl = urlStr;//@"http://tech.qq.com/zt2012/tmtdecode/252.htm"; message.mediaObject = ext; // message.mediaTagName = @"WECHAT_TAG_SHARE"; SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; if (type == 1){ req.scene = WXSceneSession; }else{ req.scene = WXSceneTimeline; } //req.scene = WXSceneTimeline; [WXApi sendReq:req]; } } #pragma mark - LifeCycle +(instancetype)sharedManager { static dispatch_once_t onceToken; static WXApiManager *instance; dispatch_once(&onceToken, ^{ instance = [[WXApiManager alloc] init]; }); return instance; } #pragma mark - WXApiDelegate -(UIImage*) thumbScaleImage:(UIImage *)image toByte:(NSUInteger)maxLength{ // Compress by quality CGFloat compression = 1; NSData *data = UIImageJPEGRepresentation(image, compression); if (data.length < maxLength) return image; CGFloat max = 1; CGFloat min = 0; for (int i = 0; i < 6; ++i) { compression = (max + min) / 2; data = UIImageJPEGRepresentation(image, compression); if (data.length < maxLength * 0.9) { min = compression; } else if (data.length > maxLength) { max = compression; } else { break; } } UIImage *resultImage = [UIImage imageWithData:data]; if (data.length < maxLength) return resultImage; // Compress by size NSUInteger lastDataLength = 0; while (data.length > maxLength && data.length != lastDataLength) { lastDataLength = data.length; CGFloat ratio = (CGFloat)maxLength / data.length; CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)), (NSUInteger)(resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank UIGraphicsBeginImageContext(size); [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)]; resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); data = UIImageJPEGRepresentation(resultImage, compression); } //NSLog(@"data.length2222:::%lu",data.length); return resultImage; } float getiOSBatteryLevel() { [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; return [[UIDevice currentDevice] batteryLevel]; } const char * getGameData() { return [gameData UTF8String]; } -(void)SendGameDataMessage:(NSString*)dataString{ if (dataString == nil)return; const char * data = [dataString UTF8String]; gameData = [NSString stringWithUTF8String:data]; UnitySendMessage("GameManager", [@"ReceiveUrlGameData" UTF8String], [gameData UTF8String]); } - (void)onResp:(BaseResp *)resp { if([resp isKindOfClass:[SendMessageToWXResp class]]){ // SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp; // 分享 if(resp.errCode==0) { NSString *code = [NSString stringWithFormat:@"%d",resp.errCode]; // 0是成功 -2是取消 NSLog(@"SendMessageToWXResp:%@",code); UnitySendMessage([gameObjName UTF8String], [shareCallBack UTF8String], [code cStringUsingEncoding:NSUTF8StringEncoding]); }else{ NSLog(@"shareCancle gameObjName:::%@",gameObjName); NSLog(@"shareCancle:::%@",shareCancle); UnitySendMessage([gameObjName UTF8String], [shareCancle UTF8String], [@"" UTF8String]); } }else if([resp isKindOfClass:[SendAuthResp class]]){ SendAuthResp *authResp = (SendAuthResp *)resp; // UnitySendMessage("UICamera", "ReceiveIosMessage", [authResp.code UTF8String]); [self getAccessToken:authResp.code]; }else if([resp isKindOfClass:[AddCardToWXCardPackageResp class]]){ // AddCardToWXCardPackageResp *addCardResp = (AddCardToWXCardPackageResp *)resp; }else if([resp isKindOfClass:[WXChooseCardResp class]]){ // WXChooseCardResp *chooseCardResp = (WXChooseCardResp *)resp; }else if([resp isKindOfClass:[WXChooseInvoiceResp class]]){ // WXChooseInvoiceResp *chooseInvoiceResp = (WXChooseInvoiceResp *)resp; }else if([resp isKindOfClass:[WXSubscribeMsgResp class]]){ // WXSubscribeMsgResp *subscribeMsgResp = (WXSubscribeMsgResp *)resp; }else if([resp isKindOfClass:[WXLaunchMiniProgramResp class]]){ // WXLaunchMiniProgramResp *launchMiniProgramResp = (WXLaunchMiniProgramResp *)resp; } } - (void)onReq:(BaseReq *)req { if([req isKindOfClass:[GetMessageFromWXReq class]]){ // GetMessageFromWXReq *getMessageReq = (GetMessageFromWXReq *)req; }else if([req isKindOfClass:[ShowMessageFromWXReq class]]){ // ShowMessageFromWXReq *showMessageReq = (ShowMessageFromWXReq *)req; }else if([req isKindOfClass:[LaunchFromWXReq class]]){ // LaunchFromWXReq *launchReq = (LaunchFromWXReq *)req; } } - (void)getAccessToken:(NSString *)code { NSString *path = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WeiXinID,WeiXinSecret,code]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:path] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler: ^(NSURLResponse *response,NSData *data,NSError *connectionError) { if (connectionError != NULL) { //网络失败 UnitySendMessage([gameObjName UTF8String], [authorCancle UTF8String], [@"" UTF8String]); } else { if (data != NULL) { NSError *jsonParseError; NSDictionary *responseData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonParseError]; NSLog(@"#####responseData = %@",responseData); if (jsonParseError != NULL) { // NSLog(@"#####responseData = %@",jsonParseError); } NSString *accessToken = [responseData valueForKey:@"access_token"]; needAccessToken = accessToken; NSString *openid = [responseData valueForKey:@"openid"]; [self getUserInfo:accessToken withOpenID:openid]; } } }]; } - (void)getUserInfo:(NSString *)accessToken withOpenID: (NSString *)openid { NSString *path = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openid]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:path] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler: ^(NSURLResponse *response,NSData *data,NSError *connectionError) { if (connectionError != NULL) { UnitySendMessage([gameObjName UTF8String], [authorCancle UTF8String], [@"" UTF8String]); } else { if (data != NULL) { NSError *jsonError; // [data s] NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError]; [dic setValue:needAccessToken forKey:@"access_token"]; [dic setValue:@"1" forKey:@"status"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&jsonError]; if(!jsonData){ NSLog(@"Got an error:%@",jsonError); }else{ NSString *responseData = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"#####UserInfo responseData = %@",responseData); NSString *jsonStr = [NSString stringWithFormat:@"%@",responseData]; UnitySendMessage([gameObjName UTF8String], [authorCallBack UTF8String], [jsonStr cStringUsingEncoding:NSUTF8StringEncoding]); // if (jsonError != NULL) { // NSLog(@"#####responseData = %@",jsonError); // } } } } }]; } @end