404 lines
16 KiB
Plaintext
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
|
|
|