miduo_client/Assets/Plugins/iOS/WXApiManager.mm

404 lines
16 KiB
Plaintext

//
// 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