From 48b51fd8df5ae79e41ee6765fcb846c0362f4c06 Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:14:37 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/WechatLib.mm | 1074 ++++++++++++++++++++++------------------------ 1 file changed, 522 insertions(+), 552 deletions(-) diff --git a/ios/WechatLib.mm b/ios/WechatLib.mm index 366c124..364f3ed 100644 --- a/ios/WechatLib.mm +++ b/ios/WechatLib.mm @@ -1,10 +1,10 @@ // Created by little-snow-fox on 2019-10-9. -#import "WechatLib.h" #import "WXApiObject.h" -#import +#import "WechatLib.h" #import -#import +#import #import +#import @implementation WechatLib @@ -16,100 +16,95 @@ RCT_EXPORT_MODULE() -- (instancetype)init -{ - self = [super init]; - if (self) { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:@"RCTOpenURLNotification" object:nil]; - } - return self; +- (instancetype)init { + self = [super init]; + if (self) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:@"RCTOpenURLNotification" object:nil]; + } + return self; } -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; } -- (BOOL)handleOpenURL:(NSNotification *)aNotification -{ - NSString * aURLString = [aNotification userInfo][@"url"]; - NSURL * aURL = [NSURL URLWithString:aURLString]; +- (BOOL)handleOpenURL:(NSNotification *)aNotification { + NSString *aURLString = [aNotification userInfo][@"url"]; + NSURL *aURL = [NSURL URLWithString:aURLString]; - if ([WXApi handleOpenURL:aURL delegate:self]) - { - return YES; - } else { - return NO; - } + if ([WXApi handleOpenURL:aURL delegate:self]) { + return YES; + } else { + return NO; + } } -- (dispatch_queue_t)methodQueue -{ - return dispatch_get_main_queue(); +- (dispatch_queue_t)methodQueue { + return dispatch_get_main_queue(); } + (BOOL)requiresMainQueueSetup { - return YES; + return YES; } // 获取网络图片的公共方法 -- (UIImage *) getImageFromURL:(NSString *)fileURL { - UIImage * result; - NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]]; - result = [UIImage imageWithData:data]; - return result; +- (UIImage *)getImageFromURL:(NSString *)fileURL { + UIImage *result; + NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]]; + result = [UIImage imageWithData:data]; + return result; } // 压缩图片 - (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength { - // Compress by quality - CGFloat compression = 1; - NSData *data = UIImageJPEGRepresentation(image, compression); - if (data.length < maxLength) return data; + // Compress by quality + CGFloat compression = 1; + NSData *data = UIImageJPEGRepresentation(image, compression); + if (data.length < maxLength) return data; - 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 data; + 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 data; - // 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); - } + // 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); + } - if (data.length > maxLength) { - return [self compressImage:resultImage toByte:maxLength]; - } + if (data.length > maxLength) { + return [self compressImage:resultImage toByte:maxLength]; + } - return data; + return data; } -RCT_EXPORT_METHOD(registerApp:(NSString *)appid - :(NSString *)universalLink - :(RCTResponseSenderBlock)callback) -{ - self.appId = appid; - callback(@[[WXApi registerApp:appid universalLink:universalLink] ? [NSNull null] : INVOKE_FAILED]); +RCT_EXPORT_METHOD(registerApp + : (NSString *)appid + : (NSString *)universalLink + : (RCTResponseSenderBlock)callback) { + self.appId = appid; + callback(@[[WXApi registerApp:appid universalLink:universalLink] ? [NSNull null] : INVOKE_FAILED]); } // RCT_EXPORT_METHOD(registerAppWithDescription:(NSString *)appid @@ -119,558 +114,533 @@ RCT_EXPORT_METHOD(registerApp:(NSString *)appid // callback(@[[WXApi registerApp:appid withDescription:appdesc] ? [NSNull null] : INVOKE_FAILED]); // } -RCT_EXPORT_METHOD(isWXAppInstalled:(RCTResponseSenderBlock)callback) -{ - callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); +RCT_EXPORT_METHOD(isWXAppInstalled + : (RCTResponseSenderBlock)callback) { + callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); } -RCT_EXPORT_METHOD(isWXAppSupportApi:(RCTResponseSenderBlock)callback) -{ - callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); +RCT_EXPORT_METHOD(isWXAppSupportApi + : (RCTResponseSenderBlock)callback) { + callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); } -RCT_EXPORT_METHOD(getWXAppInstallUrl:(RCTResponseSenderBlock)callback) -{ - callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]); +RCT_EXPORT_METHOD(getWXAppInstallUrl + : (RCTResponseSenderBlock)callback) { + callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]); } -RCT_EXPORT_METHOD(getApiVersion:(RCTResponseSenderBlock)callback) -{ - callback(@[[NSNull null], [WXApi getApiVersion]]); +RCT_EXPORT_METHOD(getApiVersion + : (RCTResponseSenderBlock)callback) { + callback(@[[NSNull null], [WXApi getApiVersion]]); } -RCT_EXPORT_METHOD(openWXApp:(RCTResponseSenderBlock)callback) -{ - callback(@[([WXApi openWXApp] ? [NSNull null] : INVOKE_FAILED)]); +RCT_EXPORT_METHOD(openWXApp + : (RCTResponseSenderBlock)callback) { + callback(@[([WXApi openWXApp] ? [NSNull null] : INVOKE_FAILED)]); } -RCT_EXPORT_METHOD(sendRequest:(NSString *)openid - :(RCTResponseSenderBlock)callback) -{ - BaseReq* req = [[BaseReq alloc] init]; - req.openID = openid; - // callback(@[[WXApi sendReq:req] ? [NSNull null] : INVOKE_FAILED]); - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; +RCT_EXPORT_METHOD(sendRequest + : (NSString *)openid + : (RCTResponseSenderBlock)callback) { + BaseReq *req = [[BaseReq alloc] init]; + req.openID = openid; + // callback(@[[WXApi sendReq:req] ? [NSNull null] : INVOKE_FAILED]); + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } -RCT_EXPORT_METHOD(sendAuthRequest:(NSString *)scope - :(NSString *)state - :(RCTResponseSenderBlock)callback) -{ - SendAuthReq* req = [[SendAuthReq alloc] init]; - req.scope = scope; - req.state = state; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; - [WXApi sendAuthReq:req viewController:rootViewController delegate:self completion:completion]; +RCT_EXPORT_METHOD(sendAuthRequest + : (NSString *)scope + : (NSString *)state + : (RCTResponseSenderBlock)callback) { + SendAuthReq *req = [[SendAuthReq alloc] init]; + req.scope = scope; + req.state = state; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; + [WXApi sendAuthReq:req viewController:rootViewController delegate:self completion:completion]; } -RCT_EXPORT_METHOD(sendSuccessResponse:(RCTResponseSenderBlock)callback) -{ - BaseResp* resp = [[BaseResp alloc] init]; - resp.errCode = WXSuccess; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendResp:resp completion:completion]; - // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); +RCT_EXPORT_METHOD(sendSuccessResponse + : (RCTResponseSenderBlock)callback) { + BaseResp *resp = [[BaseResp alloc] init]; + resp.errCode = WXSuccess; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendResp:resp completion:completion]; + // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); } -RCT_EXPORT_METHOD(sendErrorCommonResponse:(NSString *)message - :(RCTResponseSenderBlock)callback) -{ - BaseResp* resp = [[BaseResp alloc] init]; - resp.errCode = WXErrCodeCommon; - resp.errStr = message; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendResp:resp completion:completion]; - // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); +RCT_EXPORT_METHOD(sendErrorCommonResponse + : (NSString *)message + : (RCTResponseSenderBlock)callback) { + BaseResp *resp = [[BaseResp alloc] init]; + resp.errCode = WXErrCodeCommon; + resp.errStr = message; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendResp:resp completion:completion]; + // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); } -RCT_EXPORT_METHOD(sendErrorUserCancelResponse:(NSString *)message - :(RCTResponseSenderBlock)callback) -{ - BaseResp* resp = [[BaseResp alloc] init]; - resp.errCode = WXErrCodeUserCancel; - resp.errStr = message; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendResp:resp completion:completion]; - // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); +RCT_EXPORT_METHOD(sendErrorUserCancelResponse + : (NSString *)message + : (RCTResponseSenderBlock)callback) { + BaseResp *resp = [[BaseResp alloc] init]; + resp.errCode = WXErrCodeUserCancel; + resp.errStr = message; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendResp:resp completion:completion]; + // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); } // 分享文本 -RCT_EXPORT_METHOD(shareText:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = YES; - req.text = data[@"text"]; - req.scene = [data[@"scene"] intValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; +RCT_EXPORT_METHOD(shareText + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = YES; + req.text = data[@"text"]; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 选择发票 -RCT_EXPORT_METHOD(chooseInvoice:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXChooseInvoiceReq *req = [[WXChooseInvoiceReq alloc] init]; - req.appID = self.appId; - req.timeStamp = [data[@"timeStamp"] intValue]; - req.nonceStr = data[@"nonceStr"]; - req.cardSign = data[@"cardSign"]; - req.signType = data[@"signType"]; +RCT_EXPORT_METHOD(chooseInvoice + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXChooseInvoiceReq *req = [[WXChooseInvoiceReq alloc] init]; + req.appID = self.appId; + req.timeStamp = [data[@"timeStamp"] intValue]; + req.nonceStr = data[@"nonceStr"]; + req.cardSign = data[@"cardSign"]; + req.signType = data[@"signType"]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享文件 -RCT_EXPORT_METHOD(shareFile:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - NSString *url = data[@"url"]; - WXFileObject *file = [[WXFileObject alloc] init]; - file.fileExtension = data[@"ext"]; - NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString: url]]; - file.fileData = fileData; +RCT_EXPORT_METHOD(shareFile + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + NSString *url = data[@"url"]; + WXFileObject *file = [[WXFileObject alloc] init]; + file.fileExtension = data[@"ext"]; + NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; + file.fileData = fileData; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.mediaObject = file; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.mediaObject = file; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享图片 -RCT_EXPORT_METHOD(shareImage:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - NSString *imageUrl = data[@"imageUrl"]; - if (imageUrl == NULL || [imageUrl isEqual:@""]) { - callback([NSArray arrayWithObject:@"shareImage: The value of ImageUrl cannot be empty."]); - return; - } - NSRange range = [imageUrl rangeOfString:@"."]; - if ( range.length == 0) - { - callback([NSArray arrayWithObject:@"shareImage: ImageUrl value, Could not find file suffix."]); - return; - } +RCT_EXPORT_METHOD(shareImage + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + NSString *imageUrl = data[@"imageUrl"]; + if (imageUrl == NULL || [imageUrl isEqual:@""]) { + callback([NSArray arrayWithObject:@"shareImage: The value of ImageUrl cannot be empty."]); + return; + } + NSRange range = [imageUrl rangeOfString:@"."]; + if (range.length == 0) { + callback([NSArray arrayWithObject:@"shareImage: ImageUrl value, Could not find file suffix."]); + return; + } - // 根据路径下载图片 - UIImage *image = [self getImageFromURL:imageUrl]; - // 从 UIImage 获取图片数据 - NSData *imageData = UIImageJPEGRepresentation(image, 1); - // 用图片数据构建 WXImageObject 对象 - WXImageObject *imageObject = [WXImageObject object]; - imageObject.imageData = imageData; + // 根据路径下载图片 + UIImage *image = [self getImageFromURL:imageUrl]; + // 从 UIImage 获取图片数据 + NSData *imageData = UIImageJPEGRepresentation(image, 1); + // 用图片数据构建 WXImageObject 对象 + WXImageObject *imageObject = [WXImageObject object]; + imageObject.imageData = imageData; - WXMediaMessage *message = [WXMediaMessage message]; - // 利用原图压缩出缩略图,确保缩略图大小不大于32KB - message.thumbData = [self compressImage: image toByte:32678]; - message.mediaObject = imageObject; - message.title = data[@"title"]; - message.description = data[@"description"]; + WXMediaMessage *message = [WXMediaMessage message]; + // 利用原图压缩出缩略图,确保缩略图大小不大于 32KB + message.thumbData = [self compressImage:image toByte:32678]; + message.mediaObject = imageObject; + message.title = data[@"title"]; + message.description = data[@"description"]; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - // [WXApi sendReq:req]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + // [WXApi sendReq:req]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享本地图片 -RCT_EXPORT_METHOD(shareLocalImage:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - NSString *imageUrl = data[@"imageUrl"]; - if (imageUrl == NULL || [imageUrl isEqual:@""]) { - callback([NSArray arrayWithObject:@"shareLocalImage: The value of ImageUrl cannot be empty."]); - return; - } - NSRange range = [imageUrl rangeOfString:@"."]; - if ( range.length == 0) - { - callback([NSArray arrayWithObject:@"shareLocalImage: ImageUrl value, Could not find file suffix."]); - return; - } +RCT_EXPORT_METHOD(shareLocalImage + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + NSString *imageUrl = data[@"imageUrl"]; + if (imageUrl == NULL || [imageUrl isEqual:@""]) { + callback([NSArray arrayWithObject:@"shareLocalImage: The value of ImageUrl cannot be empty."]); + return; + } + NSRange range = [imageUrl rangeOfString:@"."]; + if (range.length == 0) { + callback([NSArray arrayWithObject:@"shareLocalImage: ImageUrl value, Could not find file suffix."]); + return; + } - // 根据路径下载图片 - UIImage *image = [UIImage imageWithContentsOfFile:imageUrl]; - // 从 UIImage 获取图片数据 - NSData *imageData = UIImageJPEGRepresentation(image, 1); - // 用图片数据构建 WXImageObject 对象 - WXImageObject *imageObject = [WXImageObject object]; - imageObject.imageData = imageData; + // 根据路径下载图片 + UIImage *image = [UIImage imageWithContentsOfFile:imageUrl]; + // 从 UIImage 获取图片数据 + NSData *imageData = UIImageJPEGRepresentation(image, 1); + // 用图片数据构建 WXImageObject 对象 + WXImageObject *imageObject = [WXImageObject object]; + imageObject.imageData = imageData; - WXMediaMessage *message = [WXMediaMessage message]; - // 利用原图压缩出缩略图,确保缩略图大小不大于32KB - message.thumbData = [self compressImage: image toByte:32678]; - message.mediaObject = imageObject; - message.title = data[@"title"]; - message.description = data[@"description"]; + WXMediaMessage *message = [WXMediaMessage message]; + // 利用原图压缩出缩略图,确保缩略图大小不大于 32KB + message.thumbData = [self compressImage:image toByte:32678]; + message.mediaObject = imageObject; + message.title = data[@"title"]; + message.description = data[@"description"]; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - // [WXApi sendReq:req]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + // [WXApi sendReq:req]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享音乐 -RCT_EXPORT_METHOD(shareMusic:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXMusicObject *musicObject = [WXMusicObject object]; - musicObject.musicUrl = data[@"musicUrl"]; - musicObject.musicLowBandUrl = data[@"musicLowBandUrl"]; - musicObject.musicDataUrl = data[@"musicDataUrl"]; - musicObject.musicLowBandDataUrl = data[@"musicLowBandDataUrl"]; +RCT_EXPORT_METHOD(shareMusic + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXMusicObject *musicObject = [WXMusicObject object]; + musicObject.musicUrl = data[@"musicUrl"]; + musicObject.musicLowBandUrl = data[@"musicLowBandUrl"]; + musicObject.musicDataUrl = data[@"musicDataUrl"]; + musicObject.musicLowBandDataUrl = data[@"musicLowBandDataUrl"]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - // 根据路径下载图片 - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage: image toByte:32678]; - } - message.mediaObject = musicObject; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + // 根据路径下载图片 + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = musicObject; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享视频 -RCT_EXPORT_METHOD(shareVideo:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXVideoObject *videoObject = [WXVideoObject object]; - videoObject.videoUrl = data[@"videoUrl"]; - videoObject.videoLowBandUrl = data[@"videoLowBandUrl"]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage: image toByte:32678]; - } - message.mediaObject = videoObject; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; +RCT_EXPORT_METHOD(shareVideo + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXVideoObject *videoObject = [WXVideoObject object]; + videoObject.videoUrl = data[@"videoUrl"]; + videoObject.videoLowBandUrl = data[@"videoLowBandUrl"]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = videoObject; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } - // 分享网页 -RCT_EXPORT_METHOD(shareWebpage:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXWebpageObject *webpageObject = [WXWebpageObject object]; - webpageObject.webpageUrl = data[@"webpageUrl"]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage: image toByte:32678]; - } - message.mediaObject = webpageObject; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; +RCT_EXPORT_METHOD(shareWebpage + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXWebpageObject *webpageObject = [WXWebpageObject object]; + webpageObject.webpageUrl = data[@"webpageUrl"]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = webpageObject; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享小程序 -RCT_EXPORT_METHOD(shareMiniProgram:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXMiniProgramObject *object = [WXMiniProgramObject object]; - object.webpageUrl = data[@"webpageUrl"]; - object.userName = data[@"userName"]; - object.path = data[@"path"]; - NSString *hdImageUrl = data[@"hdImageUrl"]; - if (hdImageUrl != NULL && ![hdImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:hdImageUrl]; - // 压缩图片到小于128KB - object.hdImageData = [self compressImage: image toByte:131072]; - } - object.withShareTicket = data[@"withShareTicket"]; - int miniProgramType = [data[@"miniProgramType"] integerValue]; - object.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - //兼容旧版本节点的图片,小于32KB,新版本优先 - //使用WXMiniProgramObject的hdImageData属性 - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage: image toByte:32678]; - } - message.mediaObject = object; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] integerValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; +RCT_EXPORT_METHOD(shareMiniProgram + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXMiniProgramObject *object = [WXMiniProgramObject object]; + object.webpageUrl = data[@"webpageUrl"]; + object.userName = data[@"userName"]; + object.path = data[@"path"]; + NSString *hdImageUrl = data[@"hdImageUrl"]; + if (hdImageUrl != NULL && ![hdImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:hdImageUrl]; + // 压缩图片到小于 128KB + object.hdImageData = [self compressImage:image toByte:131072]; + } + object.withShareTicket = data[@"withShareTicket"]; + int miniProgramType = [data[@"miniProgramType"] integerValue]; + object.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + // 兼容旧版本节点的图片,小于 32KB,新版本优先 + // 使用 WXMiniProgramObject 的 hdImageData 属性 + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = object; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] integerValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 一次性订阅消息 -RCT_EXPORT_METHOD(subscribeMessage:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXSubscribeMsgReq *req = [[WXSubscribeMsgReq alloc] init]; - req.scene = [data[@"scene"] integerValue]; - req.templateId = data[@"templateId"]; - req.reserved = data[@"reserved"]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; +RCT_EXPORT_METHOD(subscribeMessage + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXSubscribeMsgReq *req = [[WXSubscribeMsgReq alloc] init]; + req.scene = [data[@"scene"] integerValue]; + req.templateId = data[@"templateId"]; + req.reserved = data[@"reserved"]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } -RCT_EXPORT_METHOD(launchMiniProgram:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object]; - // 拉起的小程序的username - launchMiniProgramReq.userName = data[@"userName"]; - // 拉起小程序页面的可带参路径,不填默认拉起小程序首页 - launchMiniProgramReq.path = data[@"path"]; - // 拉起小程序的类型 - int miniProgramType = [data[@"miniProgramType"] integerValue]; - launchMiniProgramReq.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; - // launchMiniProgramReq.miniProgramType = [data[@"miniProgramType"] integerValue]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:launchMiniProgramReq completion:completion]; - // BOOL success = [WXApi sendReq:launchMiniProgramReq]; - // callback(@[success ? [NSNull null] : INVOKE_FAILED]); +RCT_EXPORT_METHOD(launchMiniProgram + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object]; + // 拉起的小程序的 username + launchMiniProgramReq.userName = data[@"userName"]; + // 拉起小程序页面的可带参路径,不填默认拉起小程序首页 + launchMiniProgramReq.path = data[@"path"]; + // 拉起小程序的类型 + int miniProgramType = [data[@"miniProgramType"] integerValue]; + launchMiniProgramReq.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; + // launchMiniProgramReq.miniProgramType = [data[@"miniProgramType"] integerValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:launchMiniProgramReq completion:completion]; + // BOOL success = [WXApi sendReq:launchMiniProgramReq]; + // callback(@[success ? [NSNull null] : INVOKE_FAILED]); } -RCT_EXPORT_METHOD(pay:(NSDictionary *)data - :(RCTResponseSenderBlock)callback) -{ - PayReq* req = [PayReq new]; - req.partnerId = data[@"partnerId"]; - req.prepayId = data[@"prepayId"]; - req.nonceStr = data[@"nonceStr"]; - req.timeStamp = [data[@"timeStamp"] unsignedIntValue]; - req.package = data[@"package"]; - req.sign = data[@"sign"]; - void ( ^ completion )( BOOL ); - completion = ^( BOOL success ) - { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; - // BOOL success = [WXApi sendReq:req]; - // callback(@[success ? [NSNull null] : INVOKE_FAILED]); +RCT_EXPORT_METHOD(pay + : (NSDictionary *)data + : (RCTResponseSenderBlock)callback) { + PayReq *req = [PayReq new]; + req.partnerId = data[@"partnerId"]; + req.prepayId = data[@"prepayId"]; + req.nonceStr = data[@"nonceStr"]; + req.timeStamp = [data[@"timeStamp"] unsignedIntValue]; + req.package = data[@"package"]; + req.sign = data[@"sign"]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; + // BOOL success = [WXApi sendReq:req]; + // callback(@[success ? [NSNull null] : INVOKE_FAILED]); } // 跳转微信客服 -RCT_EXPORT_METHOD(openCustomerServiceChat:(NSString *)corpId - :(NSString *)kfUrl - :(RCTResponseSenderBlock)callback) -{ - WXOpenCustomerServiceReq *req = [[WXOpenCustomerServiceReq alloc] init]; - req.corpid = corpId; //企业ID - req.url = kfUrl; //客服URL - [WXApi sendReq:req completion:nil]; +RCT_EXPORT_METHOD(openCustomerServiceChat + : (NSString *)corpId + : (NSString *)kfUrl + : (RCTResponseSenderBlock)callback) { + WXOpenCustomerServiceReq *req = [[WXOpenCustomerServiceReq alloc] init]; + req.corpid = corpId; // 企业 ID + req.url = kfUrl; // 客服 URL + [WXApi sendReq:req completion:nil]; } #pragma mark - wx callback --(void) onReq:(BaseReq*)req -{ - if ([req isKindOfClass:[LaunchFromWXReq class]]) { - LaunchFromWXReq *launchReq = req; - NSString *appParameter = launchReq.message.messageExt; - NSMutableDictionary *body = @{@"errCode":@0}.mutableCopy; - body[@"type"] = @"LaunchFromWX.Req"; - body[@"lang"] = launchReq.lang; - body[@"country"] = launchReq.country; - body[@"extMsg"] = appParameter; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventNameWeChatReq body:body]; - } +- (void)onReq:(BaseReq *)req { + if ([req isKindOfClass:[LaunchFromWXReq class]]) { + LaunchFromWXReq *launchReq = req; + NSString *appParameter = launchReq.message.messageExt; + NSMutableDictionary *body = @{ @"errCode": @0 }.mutableCopy; + body[@"type"] = @"LaunchFromWX.Req"; + body[@"lang"] = launchReq.lang; + body[@"country"] = launchReq.country; + body[@"extMsg"] = appParameter; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventNameWeChatReq body:body]; + } } --(void) onResp:(BaseResp*)resp -{ - if([resp isKindOfClass:[SendMessageToWXResp class]]) - { - SendMessageToWXResp *r = (SendMessageToWXResp *)resp; +- (void)onResp:(BaseResp *)resp { + if ([resp isKindOfClass:[SendMessageToWXResp class]]) { + SendMessageToWXResp *r = (SendMessageToWXResp *)resp; - NSMutableDictionary *body = @{@"errCode":@(r.errCode)}.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"lang"] = r.lang; - body[@"country"] =r.country; - body[@"type"] = @"SendMessageToWX.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } else if ([resp isKindOfClass:[SendAuthResp class]]) { - SendAuthResp *r = (SendAuthResp *)resp; - NSMutableDictionary *body = @{@"errCode":@(r.errCode)}.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"state"] = r.state; - body[@"lang"] = r.lang; - body[@"country"] =r.country; - body[@"type"] = @"SendAuth.Resp"; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"lang"] = r.lang; + body[@"country"] = r.country; + body[@"type"] = @"SendMessageToWX.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } else if ([resp isKindOfClass:[SendAuthResp class]]) { + SendAuthResp *r = (SendAuthResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"state"] = r.state; + body[@"lang"] = r.lang; + body[@"country"] = r.country; + body[@"type"] = @"SendAuth.Resp"; - if (resp.errCode == WXSuccess) { - if (self.appId && r) { - // ios第一次获取不到appid会卡死,加个判断OK - [body addEntriesFromDictionary:@{@"appid":self.appId, @"code":r.code}]; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } - } - else { - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } - } else if ([resp isKindOfClass:[PayResp class]]) { - PayResp *r = (PayResp *)resp; - NSMutableDictionary *body = @{@"errCode":@(r.errCode)}.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"type"] = @(r.type); - body[@"returnKey"] =r.returnKey; - body[@"type"] = @"PayReq.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } else if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]]){ - WXLaunchMiniProgramResp *r = (WXLaunchMiniProgramResp *)resp; - NSMutableDictionary *body = @{@"errCode":@(r.errCode)}.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"extMsg"] = r.extMsg; - body[@"type"] = @"WXLaunchMiniProgramReq.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } else if ([resp isKindOfClass:[WXChooseInvoiceResp class]]){ - WXChooseInvoiceResp *r = (WXChooseInvoiceResp *)resp; - NSMutableDictionary *body = @{@"errCode":@(r.errCode)}.mutableCopy; - body[@"errStr"] = r.errStr; - NSMutableArray *arr = [[NSMutableArray alloc] init]; - for (WXCardItem* cardItem in r.cardAry) { - NSMutableDictionary *item = @{@"cardId":cardItem.cardId,@"encryptCode":cardItem.encryptCode,@"appId":cardItem.appID}.mutableCopy; - [arr addObject:item]; - } - body[@"cards"] = arr; - body[@"type"] = @"WXChooseInvoiceResp.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } + if (resp.errCode == WXSuccess) { + if (self.appId && r) { + // ios 第一次获取不到 appid 会卡死,加个判断 OK + [body addEntriesFromDictionary:@{ @"appid": self.appId, @"code": r.code }]; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } + } else { + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } + } else if ([resp isKindOfClass:[PayResp class]]) { + PayResp *r = (PayResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"type"] = @(r.type); + body[@"returnKey"] = r.returnKey; + body[@"type"] = @"PayReq.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } else if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]]) { + WXLaunchMiniProgramResp *r = (WXLaunchMiniProgramResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"extMsg"] = r.extMsg; + body[@"type"] = @"WXLaunchMiniProgramReq.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } else if ([resp isKindOfClass:[WXChooseInvoiceResp class]]) { + WXChooseInvoiceResp *r = (WXChooseInvoiceResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + NSMutableArray *arr = [[NSMutableArray alloc] init]; + for (WXCardItem *cardItem in r.cardAry) { + NSMutableDictionary *item = @{ @"cardId": cardItem.cardId, @"encryptCode": cardItem.encryptCode, @"appId": cardItem.appID }.mutableCopy; + [arr addObject:item]; + } + body[@"cards"] = arr; + body[@"type"] = @"WXChooseInvoiceResp.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } } --(WXMiniProgramType) integerToWXMiniProgramType:(int)value { - WXMiniProgramType type = WXMiniProgramTypeRelease; - switch (value) { - case 0: - type = WXMiniProgramTypeRelease; - break; - case 1: - type = WXMiniProgramTypeTest; - break; - case 2: - type = WXMiniProgramTypePreview; - break; - } - return type; +- (WXMiniProgramType)integerToWXMiniProgramType:(int)value { + WXMiniProgramType type = WXMiniProgramTypeRelease; + switch (value) { + case 0: + type = WXMiniProgramTypeRelease; + break; + case 1: + type = WXMiniProgramTypeTest; + break; + case 2: + type = WXMiniProgramTypePreview; + break; + } + return type; } @end - From 367ae4bbde06f64275741f01e00c13d2e1848d1d Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:19:51 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/WechatLib.mm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ios/WechatLib.mm b/ios/WechatLib.mm index 364f3ed..0ea0272 100644 --- a/ios/WechatLib.mm +++ b/ios/WechatLib.mm @@ -254,7 +254,13 @@ RCT_EXPORT_METHOD(shareFile NSString *url = data[@"url"]; WXFileObject *file = [[WXFileObject alloc] init]; file.fileExtension = data[@"ext"]; - NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; + + NSData *fileData; + if ([url hasPrefix:@"http"]) { + fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString: url]]; + } else { + fileData = [NSData dataWithContentsOfFile:url]; + } file.fileData = fileData; WXMediaMessage *message = [WXMediaMessage message]; From efe268229f75b4e43b51c7f34753b9cd63ca70a7 Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:26:30 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wechatlib/WeChatLibModule.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/wechatlib/WeChatLibModule.java b/android/src/main/java/com/wechatlib/WeChatLibModule.java index 6ba0b24..7adc9c3 100644 --- a/android/src/main/java/com/wechatlib/WeChatLibModule.java +++ b/android/src/main/java/com/wechatlib/WeChatLibModule.java @@ -255,6 +255,21 @@ public class WeChatLibModule extends ReactContextBaseJavaModule implements IWXAP return data; } + public String getFileUri(Context context, File file) { + if (file == null || !file.exists()) { + return null; + } + + Uri contentUri = FileProvider.getUriForFile(context, + "com.norcy.iread.fileprovider", // 要与`AndroidManifest.xml`里配置的`authorities`一致 + file); + + // 授权给微信访问路径 + context.grantUriPermission("com.tencent.mm", // 这里填微信包名 + contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + + return contentUri.toString(); // contentUri.toString() 即是以"content://"开头的用于共享的路径 + } /** * 分享文本 @@ -265,7 +280,15 @@ public class WeChatLibModule extends ReactContextBaseJavaModule implements IWXAP @ReactMethod public void shareFile(ReadableMap data, Callback callback) throws Exception { WXFileObject fileObj = new WXFileObject(); - fileObj.fileData = loadRawDataFromURL(data.getString("url")); + + String url = data.getString("url"); + if (url.startsWith("http")) { + fileObj.fileData = loadRawDataFromURL(url); + } else { + File file = new File(url); + String fileUri = getFileUri(getReactApplicationContext(), file); + fileObj.filePath = fileUri; + } WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = fileObj; From ad9b5f1ef168e0e8da554e39d469e3aef366b59f Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:29:18 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/src/main/java/com/wechatlib/WeChatLibModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/wechatlib/WeChatLibModule.java b/android/src/main/java/com/wechatlib/WeChatLibModule.java index 7adc9c3..ec3edde 100644 --- a/android/src/main/java/com/wechatlib/WeChatLibModule.java +++ b/android/src/main/java/com/wechatlib/WeChatLibModule.java @@ -261,7 +261,7 @@ public class WeChatLibModule extends ReactContextBaseJavaModule implements IWXAP } Uri contentUri = FileProvider.getUriForFile(context, - "com.norcy.iread.fileprovider", // 要与`AndroidManifest.xml`里配置的`authorities`一致 + context.getPackageName() + ".fileprovider", // 要与`AndroidManifest.xml`里配置的`authorities`一致 file); // 授权给微信访问路径 From 81915e19e0834b8adae585b04dc9cf47bb1046ff Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:42:50 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- docs/build-setup-android.md | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bcdc69..2cf24b3 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,7 @@ ShareFileMetadata | name | type | description | | ----- | ------ | -------------- | -| url | String | 文件地址 | +| url | String | 文件地址。如果是远程文件,则为 http 开头;如果是本地文件,则为绝对路径,如 /storage/emulated/0/Android/xxx | | title | String | 文件标题 | | scene | Number | 分享到, 0:会话 | @@ -237,6 +237,9 @@ Return: | errCode | Number | 0 if authorization succeed | | errStr | String | Error message if any error occurred | + +安卓实现分享本地文件需要对工程进行一些配置,详见 [Android 安装](./docs/build-setup-android.md#分享本地文件) + ```js import * as WeChat from 'react-native-wechat-lib'; diff --git a/docs/build-setup-android.md b/docs/build-setup-android.md index 444cf11..1a7c5b7 100644 --- a/docs/build-setup-android.md +++ b/docs/build-setup-android.md @@ -114,6 +114,43 @@ android:launchMode="singleTask" ``` +## 分享本地文件 +如果你需要分享本地文件,需要在 Android 的工程里进行一些设置,否则会有权限问题 + +步骤 1:app/src/main/AndroidManifest.xml 中添加 provider 标签,其中 com.yourapp.xxx 要替换为你自己的包名,记得保留后面的 `.fileprovider` + +```xml + + ... + + + + ... + +``` + +步骤 2:实现 app/src/main/res/xml/filepaths.xml + +```xml + + + + + + + +``` + +在这个 XML 文件中,你可以定义不同的路径类型(如 cache-path、external-path 等),以及对应的路径前缀。这样,在使用 FileProvider.getUriForFile() 时,就可以根据这些定义来获取正确的 URI。 + +请注意,当组件库被集成到不同的应用中时,你可能需要根据你自己的需求调整 filepaths.xml 中的路径定义。 + ## 关于 Android11 微信将于近期发布 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行更新 From d6ef691f958894cdb5cbd302c2b2a528d82f974b Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:49:11 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/WechatLib.mm | 884 +++++++++++++++++++++++------------------------ 1 file changed, 442 insertions(+), 442 deletions(-) diff --git a/ios/WechatLib.mm b/ios/WechatLib.mm index 0ea0272..3efec82 100644 --- a/ios/WechatLib.mm +++ b/ios/WechatLib.mm @@ -17,94 +17,94 @@ RCT_EXPORT_MODULE() - (instancetype)init { - self = [super init]; - if (self) { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:@"RCTOpenURLNotification" object:nil]; - } - return self; + self = [super init]; + if (self) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:@"RCTOpenURLNotification" object:nil]; + } + return self; } - (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (BOOL)handleOpenURL:(NSNotification *)aNotification { - NSString *aURLString = [aNotification userInfo][@"url"]; - NSURL *aURL = [NSURL URLWithString:aURLString]; + NSString *aURLString = [aNotification userInfo][@"url"]; + NSURL *aURL = [NSURL URLWithString:aURLString]; - if ([WXApi handleOpenURL:aURL delegate:self]) { - return YES; - } else { - return NO; - } + if ([WXApi handleOpenURL:aURL delegate:self]) { + return YES; + } else { + return NO; + } } - (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); + return dispatch_get_main_queue(); } + (BOOL)requiresMainQueueSetup { - return YES; + return YES; } // 获取网络图片的公共方法 - (UIImage *)getImageFromURL:(NSString *)fileURL { - UIImage *result; - NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]]; - result = [UIImage imageWithData:data]; - return result; + UIImage *result; + NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]]; + result = [UIImage imageWithData:data]; + return result; } // 压缩图片 - (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength { - // Compress by quality - CGFloat compression = 1; - NSData *data = UIImageJPEGRepresentation(image, compression); - if (data.length < maxLength) return data; + // Compress by quality + CGFloat compression = 1; + NSData *data = UIImageJPEGRepresentation(image, compression); + if (data.length < maxLength) return data; - 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 data; + 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 data; - // 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); - } + // 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); + } - if (data.length > maxLength) { - return [self compressImage:resultImage toByte:maxLength]; - } + if (data.length > maxLength) { + return [self compressImage:resultImage toByte:maxLength]; + } - return data; + return data; } RCT_EXPORT_METHOD(registerApp : (NSString *)appid : (NSString *)universalLink : (RCTResponseSenderBlock)callback) { - self.appId = appid; - callback(@[[WXApi registerApp:appid universalLink:universalLink] ? [NSNull null] : INVOKE_FAILED]); + self.appId = appid; + callback(@[[WXApi registerApp:appid universalLink:universalLink] ? [NSNull null] : INVOKE_FAILED]); } // RCT_EXPORT_METHOD(registerAppWithDescription:(NSString *)appid @@ -116,437 +116,437 @@ RCT_EXPORT_METHOD(registerApp RCT_EXPORT_METHOD(isWXAppInstalled : (RCTResponseSenderBlock)callback) { - callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); + callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); } RCT_EXPORT_METHOD(isWXAppSupportApi : (RCTResponseSenderBlock)callback) { - callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); + callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); } RCT_EXPORT_METHOD(getWXAppInstallUrl : (RCTResponseSenderBlock)callback) { - callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]); + callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]); } RCT_EXPORT_METHOD(getApiVersion : (RCTResponseSenderBlock)callback) { - callback(@[[NSNull null], [WXApi getApiVersion]]); + callback(@[[NSNull null], [WXApi getApiVersion]]); } RCT_EXPORT_METHOD(openWXApp : (RCTResponseSenderBlock)callback) { - callback(@[([WXApi openWXApp] ? [NSNull null] : INVOKE_FAILED)]); + callback(@[([WXApi openWXApp] ? [NSNull null] : INVOKE_FAILED)]); } RCT_EXPORT_METHOD(sendRequest : (NSString *)openid : (RCTResponseSenderBlock)callback) { - BaseReq *req = [[BaseReq alloc] init]; - req.openID = openid; - // callback(@[[WXApi sendReq:req] ? [NSNull null] : INVOKE_FAILED]); - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + BaseReq *req = [[BaseReq alloc] init]; + req.openID = openid; + // callback(@[[WXApi sendReq:req] ? [NSNull null] : INVOKE_FAILED]); + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } RCT_EXPORT_METHOD(sendAuthRequest : (NSString *)scope : (NSString *)state : (RCTResponseSenderBlock)callback) { - SendAuthReq *req = [[SendAuthReq alloc] init]; - req.scope = scope; - req.state = state; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; - [WXApi sendAuthReq:req viewController:rootViewController delegate:self completion:completion]; + SendAuthReq *req = [[SendAuthReq alloc] init]; + req.scope = scope; + req.state = state; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController; + [WXApi sendAuthReq:req viewController:rootViewController delegate:self completion:completion]; } RCT_EXPORT_METHOD(sendSuccessResponse : (RCTResponseSenderBlock)callback) { - BaseResp *resp = [[BaseResp alloc] init]; - resp.errCode = WXSuccess; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendResp:resp completion:completion]; - // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); + BaseResp *resp = [[BaseResp alloc] init]; + resp.errCode = WXSuccess; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendResp:resp completion:completion]; + // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); } RCT_EXPORT_METHOD(sendErrorCommonResponse : (NSString *)message : (RCTResponseSenderBlock)callback) { - BaseResp *resp = [[BaseResp alloc] init]; - resp.errCode = WXErrCodeCommon; - resp.errStr = message; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendResp:resp completion:completion]; - // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); + BaseResp *resp = [[BaseResp alloc] init]; + resp.errCode = WXErrCodeCommon; + resp.errStr = message; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendResp:resp completion:completion]; + // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); } RCT_EXPORT_METHOD(sendErrorUserCancelResponse : (NSString *)message : (RCTResponseSenderBlock)callback) { - BaseResp *resp = [[BaseResp alloc] init]; - resp.errCode = WXErrCodeUserCancel; - resp.errStr = message; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendResp:resp completion:completion]; - // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); + BaseResp *resp = [[BaseResp alloc] init]; + resp.errCode = WXErrCodeUserCancel; + resp.errStr = message; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendResp:resp completion:completion]; + // callback(@[[WXApi sendResp:resp] ? [NSNull null] : INVOKE_FAILED]); } // 分享文本 RCT_EXPORT_METHOD(shareText : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = YES; - req.text = data[@"text"]; - req.scene = [data[@"scene"] intValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = YES; + req.text = data[@"text"]; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 选择发票 RCT_EXPORT_METHOD(chooseInvoice : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXChooseInvoiceReq *req = [[WXChooseInvoiceReq alloc] init]; - req.appID = self.appId; - req.timeStamp = [data[@"timeStamp"] intValue]; - req.nonceStr = data[@"nonceStr"]; - req.cardSign = data[@"cardSign"]; - req.signType = data[@"signType"]; + WXChooseInvoiceReq *req = [[WXChooseInvoiceReq alloc] init]; + req.appID = self.appId; + req.timeStamp = [data[@"timeStamp"] intValue]; + req.nonceStr = data[@"nonceStr"]; + req.cardSign = data[@"cardSign"]; + req.signType = data[@"signType"]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享文件 RCT_EXPORT_METHOD(shareFile : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - NSString *url = data[@"url"]; - WXFileObject *file = [[WXFileObject alloc] init]; - file.fileExtension = data[@"ext"]; + NSString *url = data[@"url"]; + WXFileObject *file = [[WXFileObject alloc] init]; + file.fileExtension = data[@"ext"]; NSData *fileData; if ([url hasPrefix:@"http"]) { - fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString: url]]; + fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; } else { fileData = [NSData dataWithContentsOfFile:url]; } - file.fileData = fileData; + file.fileData = fileData; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.mediaObject = file; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.mediaObject = file; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享图片 RCT_EXPORT_METHOD(shareImage : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - NSString *imageUrl = data[@"imageUrl"]; - if (imageUrl == NULL || [imageUrl isEqual:@""]) { - callback([NSArray arrayWithObject:@"shareImage: The value of ImageUrl cannot be empty."]); - return; - } - NSRange range = [imageUrl rangeOfString:@"."]; - if (range.length == 0) { - callback([NSArray arrayWithObject:@"shareImage: ImageUrl value, Could not find file suffix."]); - return; - } + NSString *imageUrl = data[@"imageUrl"]; + if (imageUrl == NULL || [imageUrl isEqual:@""]) { + callback([NSArray arrayWithObject:@"shareImage: The value of ImageUrl cannot be empty."]); + return; + } + NSRange range = [imageUrl rangeOfString:@"."]; + if (range.length == 0) { + callback([NSArray arrayWithObject:@"shareImage: ImageUrl value, Could not find file suffix."]); + return; + } - // 根据路径下载图片 - UIImage *image = [self getImageFromURL:imageUrl]; - // 从 UIImage 获取图片数据 - NSData *imageData = UIImageJPEGRepresentation(image, 1); - // 用图片数据构建 WXImageObject 对象 - WXImageObject *imageObject = [WXImageObject object]; - imageObject.imageData = imageData; + // 根据路径下载图片 + UIImage *image = [self getImageFromURL:imageUrl]; + // 从 UIImage 获取图片数据 + NSData *imageData = UIImageJPEGRepresentation(image, 1); + // 用图片数据构建 WXImageObject 对象 + WXImageObject *imageObject = [WXImageObject object]; + imageObject.imageData = imageData; - WXMediaMessage *message = [WXMediaMessage message]; - // 利用原图压缩出缩略图,确保缩略图大小不大于 32KB - message.thumbData = [self compressImage:image toByte:32678]; - message.mediaObject = imageObject; - message.title = data[@"title"]; - message.description = data[@"description"]; + WXMediaMessage *message = [WXMediaMessage message]; + // 利用原图压缩出缩略图,确保缩略图大小不大于 32KB + message.thumbData = [self compressImage:image toByte:32678]; + message.mediaObject = imageObject; + message.title = data[@"title"]; + message.description = data[@"description"]; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - // [WXApi sendReq:req]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + // [WXApi sendReq:req]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享本地图片 RCT_EXPORT_METHOD(shareLocalImage : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - NSString *imageUrl = data[@"imageUrl"]; - if (imageUrl == NULL || [imageUrl isEqual:@""]) { - callback([NSArray arrayWithObject:@"shareLocalImage: The value of ImageUrl cannot be empty."]); - return; - } - NSRange range = [imageUrl rangeOfString:@"."]; - if (range.length == 0) { - callback([NSArray arrayWithObject:@"shareLocalImage: ImageUrl value, Could not find file suffix."]); - return; - } + NSString *imageUrl = data[@"imageUrl"]; + if (imageUrl == NULL || [imageUrl isEqual:@""]) { + callback([NSArray arrayWithObject:@"shareLocalImage: The value of ImageUrl cannot be empty."]); + return; + } + NSRange range = [imageUrl rangeOfString:@"."]; + if (range.length == 0) { + callback([NSArray arrayWithObject:@"shareLocalImage: ImageUrl value, Could not find file suffix."]); + return; + } - // 根据路径下载图片 - UIImage *image = [UIImage imageWithContentsOfFile:imageUrl]; - // 从 UIImage 获取图片数据 - NSData *imageData = UIImageJPEGRepresentation(image, 1); - // 用图片数据构建 WXImageObject 对象 - WXImageObject *imageObject = [WXImageObject object]; - imageObject.imageData = imageData; + // 根据路径下载图片 + UIImage *image = [UIImage imageWithContentsOfFile:imageUrl]; + // 从 UIImage 获取图片数据 + NSData *imageData = UIImageJPEGRepresentation(image, 1); + // 用图片数据构建 WXImageObject 对象 + WXImageObject *imageObject = [WXImageObject object]; + imageObject.imageData = imageData; - WXMediaMessage *message = [WXMediaMessage message]; - // 利用原图压缩出缩略图,确保缩略图大小不大于 32KB - message.thumbData = [self compressImage:image toByte:32678]; - message.mediaObject = imageObject; - message.title = data[@"title"]; - message.description = data[@"description"]; + WXMediaMessage *message = [WXMediaMessage message]; + // 利用原图压缩出缩略图,确保缩略图大小不大于 32KB + message.thumbData = [self compressImage:image toByte:32678]; + message.mediaObject = imageObject; + message.title = data[@"title"]; + message.description = data[@"description"]; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - // [WXApi sendReq:req]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + // [WXApi sendReq:req]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享音乐 RCT_EXPORT_METHOD(shareMusic : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXMusicObject *musicObject = [WXMusicObject object]; - musicObject.musicUrl = data[@"musicUrl"]; - musicObject.musicLowBandUrl = data[@"musicLowBandUrl"]; - musicObject.musicDataUrl = data[@"musicDataUrl"]; - musicObject.musicLowBandDataUrl = data[@"musicLowBandDataUrl"]; + WXMusicObject *musicObject = [WXMusicObject object]; + musicObject.musicUrl = data[@"musicUrl"]; + musicObject.musicLowBandUrl = data[@"musicLowBandUrl"]; + musicObject.musicDataUrl = data[@"musicDataUrl"]; + musicObject.musicLowBandDataUrl = data[@"musicLowBandDataUrl"]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - // 根据路径下载图片 - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage:image toByte:32678]; - } - message.mediaObject = musicObject; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + // 根据路径下载图片 + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = musicObject; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享视频 RCT_EXPORT_METHOD(shareVideo : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXVideoObject *videoObject = [WXVideoObject object]; - videoObject.videoUrl = data[@"videoUrl"]; - videoObject.videoLowBandUrl = data[@"videoLowBandUrl"]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage:image toByte:32678]; - } - message.mediaObject = videoObject; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + WXVideoObject *videoObject = [WXVideoObject object]; + videoObject.videoUrl = data[@"videoUrl"]; + videoObject.videoLowBandUrl = data[@"videoLowBandUrl"]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = videoObject; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享网页 RCT_EXPORT_METHOD(shareWebpage : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXWebpageObject *webpageObject = [WXWebpageObject object]; - webpageObject.webpageUrl = data[@"webpageUrl"]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage:image toByte:32678]; - } - message.mediaObject = webpageObject; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] intValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + WXWebpageObject *webpageObject = [WXWebpageObject object]; + webpageObject.webpageUrl = data[@"webpageUrl"]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = webpageObject; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] intValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 分享小程序 RCT_EXPORT_METHOD(shareMiniProgram : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXMiniProgramObject *object = [WXMiniProgramObject object]; - object.webpageUrl = data[@"webpageUrl"]; - object.userName = data[@"userName"]; - object.path = data[@"path"]; - NSString *hdImageUrl = data[@"hdImageUrl"]; - if (hdImageUrl != NULL && ![hdImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:hdImageUrl]; - // 压缩图片到小于 128KB - object.hdImageData = [self compressImage:image toByte:131072]; - } - object.withShareTicket = data[@"withShareTicket"]; - int miniProgramType = [data[@"miniProgramType"] integerValue]; - object.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; - WXMediaMessage *message = [WXMediaMessage message]; - message.title = data[@"title"]; - message.description = data[@"description"]; - // 兼容旧版本节点的图片,小于 32KB,新版本优先 - // 使用 WXMiniProgramObject 的 hdImageData 属性 - NSString *thumbImageUrl = data[@"thumbImageUrl"]; - if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { - UIImage *image = [self getImageFromURL:thumbImageUrl]; - message.thumbData = [self compressImage:image toByte:32678]; - } - message.mediaObject = object; - SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; - req.bText = NO; - req.message = message; - req.scene = [data[@"scene"] integerValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + WXMiniProgramObject *object = [WXMiniProgramObject object]; + object.webpageUrl = data[@"webpageUrl"]; + object.userName = data[@"userName"]; + object.path = data[@"path"]; + NSString *hdImageUrl = data[@"hdImageUrl"]; + if (hdImageUrl != NULL && ![hdImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:hdImageUrl]; + // 压缩图片到小于 128KB + object.hdImageData = [self compressImage:image toByte:131072]; + } + object.withShareTicket = data[@"withShareTicket"]; + int miniProgramType = [data[@"miniProgramType"] integerValue]; + object.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; + WXMediaMessage *message = [WXMediaMessage message]; + message.title = data[@"title"]; + message.description = data[@"description"]; + // 兼容旧版本节点的图片,小于 32KB,新版本优先 + // 使用 WXMiniProgramObject 的 hdImageData 属性 + NSString *thumbImageUrl = data[@"thumbImageUrl"]; + if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) { + UIImage *image = [self getImageFromURL:thumbImageUrl]; + message.thumbData = [self compressImage:image toByte:32678]; + } + message.mediaObject = object; + SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; + req.bText = NO; + req.message = message; + req.scene = [data[@"scene"] integerValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } // 一次性订阅消息 RCT_EXPORT_METHOD(subscribeMessage : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXSubscribeMsgReq *req = [[WXSubscribeMsgReq alloc] init]; - req.scene = [data[@"scene"] integerValue]; - req.templateId = data[@"templateId"]; - req.reserved = data[@"reserved"]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; + WXSubscribeMsgReq *req = [[WXSubscribeMsgReq alloc] init]; + req.scene = [data[@"scene"] integerValue]; + req.templateId = data[@"templateId"]; + req.reserved = data[@"reserved"]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; } RCT_EXPORT_METHOD(launchMiniProgram : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object]; - // 拉起的小程序的 username - launchMiniProgramReq.userName = data[@"userName"]; - // 拉起小程序页面的可带参路径,不填默认拉起小程序首页 - launchMiniProgramReq.path = data[@"path"]; - // 拉起小程序的类型 - int miniProgramType = [data[@"miniProgramType"] integerValue]; - launchMiniProgramReq.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; - // launchMiniProgramReq.miniProgramType = [data[@"miniProgramType"] integerValue]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:launchMiniProgramReq completion:completion]; - // BOOL success = [WXApi sendReq:launchMiniProgramReq]; - // callback(@[success ? [NSNull null] : INVOKE_FAILED]); + WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object]; + // 拉起的小程序的 username + launchMiniProgramReq.userName = data[@"userName"]; + // 拉起小程序页面的可带参路径,不填默认拉起小程序首页 + launchMiniProgramReq.path = data[@"path"]; + // 拉起小程序的类型 + int miniProgramType = [data[@"miniProgramType"] integerValue]; + launchMiniProgramReq.miniProgramType = [self integerToWXMiniProgramType:miniProgramType]; + // launchMiniProgramReq.miniProgramType = [data[@"miniProgramType"] integerValue]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:launchMiniProgramReq completion:completion]; + // BOOL success = [WXApi sendReq:launchMiniProgramReq]; + // callback(@[success ? [NSNull null] : INVOKE_FAILED]); } RCT_EXPORT_METHOD(pay : (NSDictionary *)data : (RCTResponseSenderBlock)callback) { - PayReq *req = [PayReq new]; - req.partnerId = data[@"partnerId"]; - req.prepayId = data[@"prepayId"]; - req.nonceStr = data[@"nonceStr"]; - req.timeStamp = [data[@"timeStamp"] unsignedIntValue]; - req.package = data[@"package"]; - req.sign = data[@"sign"]; - void (^completion)(BOOL); - completion = ^(BOOL success) { - callback(@[success ? [NSNull null] : INVOKE_FAILED]); - return; - }; - [WXApi sendReq:req completion:completion]; - // BOOL success = [WXApi sendReq:req]; - // callback(@[success ? [NSNull null] : INVOKE_FAILED]); + PayReq *req = [PayReq new]; + req.partnerId = data[@"partnerId"]; + req.prepayId = data[@"prepayId"]; + req.nonceStr = data[@"nonceStr"]; + req.timeStamp = [data[@"timeStamp"] unsignedIntValue]; + req.package = data[@"package"]; + req.sign = data[@"sign"]; + void (^completion)(BOOL); + completion = ^(BOOL success) { + callback(@[success ? [NSNull null] : INVOKE_FAILED]); + return; + }; + [WXApi sendReq:req completion:completion]; + // BOOL success = [WXApi sendReq:req]; + // callback(@[success ? [NSNull null] : INVOKE_FAILED]); } // 跳转微信客服 @@ -554,99 +554,99 @@ RCT_EXPORT_METHOD(openCustomerServiceChat : (NSString *)corpId : (NSString *)kfUrl : (RCTResponseSenderBlock)callback) { - WXOpenCustomerServiceReq *req = [[WXOpenCustomerServiceReq alloc] init]; - req.corpid = corpId; // 企业 ID - req.url = kfUrl; // 客服 URL - [WXApi sendReq:req completion:nil]; + WXOpenCustomerServiceReq *req = [[WXOpenCustomerServiceReq alloc] init]; + req.corpid = corpId; // 企业 ID + req.url = kfUrl; // 客服 URL + [WXApi sendReq:req completion:nil]; } #pragma mark - wx callback - (void)onReq:(BaseReq *)req { - if ([req isKindOfClass:[LaunchFromWXReq class]]) { - LaunchFromWXReq *launchReq = req; - NSString *appParameter = launchReq.message.messageExt; - NSMutableDictionary *body = @{ @"errCode": @0 }.mutableCopy; - body[@"type"] = @"LaunchFromWX.Req"; - body[@"lang"] = launchReq.lang; - body[@"country"] = launchReq.country; - body[@"extMsg"] = appParameter; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventNameWeChatReq body:body]; - } + if ([req isKindOfClass:[LaunchFromWXReq class]]) { + LaunchFromWXReq *launchReq = req; + NSString *appParameter = launchReq.message.messageExt; + NSMutableDictionary *body = @{ @"errCode": @0 }.mutableCopy; + body[@"type"] = @"LaunchFromWX.Req"; + body[@"lang"] = launchReq.lang; + body[@"country"] = launchReq.country; + body[@"extMsg"] = appParameter; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventNameWeChatReq body:body]; + } } - (void)onResp:(BaseResp *)resp { - if ([resp isKindOfClass:[SendMessageToWXResp class]]) { - SendMessageToWXResp *r = (SendMessageToWXResp *)resp; + if ([resp isKindOfClass:[SendMessageToWXResp class]]) { + SendMessageToWXResp *r = (SendMessageToWXResp *)resp; - NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"lang"] = r.lang; - body[@"country"] = r.country; - body[@"type"] = @"SendMessageToWX.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } else if ([resp isKindOfClass:[SendAuthResp class]]) { - SendAuthResp *r = (SendAuthResp *)resp; - NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"state"] = r.state; - body[@"lang"] = r.lang; - body[@"country"] = r.country; - body[@"type"] = @"SendAuth.Resp"; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"lang"] = r.lang; + body[@"country"] = r.country; + body[@"type"] = @"SendMessageToWX.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } else if ([resp isKindOfClass:[SendAuthResp class]]) { + SendAuthResp *r = (SendAuthResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"state"] = r.state; + body[@"lang"] = r.lang; + body[@"country"] = r.country; + body[@"type"] = @"SendAuth.Resp"; - if (resp.errCode == WXSuccess) { - if (self.appId && r) { - // ios 第一次获取不到 appid 会卡死,加个判断 OK - [body addEntriesFromDictionary:@{ @"appid": self.appId, @"code": r.code }]; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } - } else { - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } - } else if ([resp isKindOfClass:[PayResp class]]) { - PayResp *r = (PayResp *)resp; - NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"type"] = @(r.type); - body[@"returnKey"] = r.returnKey; - body[@"type"] = @"PayReq.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } else if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]]) { - WXLaunchMiniProgramResp *r = (WXLaunchMiniProgramResp *)resp; - NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; - body[@"errStr"] = r.errStr; - body[@"extMsg"] = r.extMsg; - body[@"type"] = @"WXLaunchMiniProgramReq.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } else if ([resp isKindOfClass:[WXChooseInvoiceResp class]]) { - WXChooseInvoiceResp *r = (WXChooseInvoiceResp *)resp; - NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; - body[@"errStr"] = r.errStr; - NSMutableArray *arr = [[NSMutableArray alloc] init]; - for (WXCardItem *cardItem in r.cardAry) { - NSMutableDictionary *item = @{ @"cardId": cardItem.cardId, @"encryptCode": cardItem.encryptCode, @"appId": cardItem.appID }.mutableCopy; - [arr addObject:item]; - } - body[@"cards"] = arr; - body[@"type"] = @"WXChooseInvoiceResp.Resp"; - [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; - } + if (resp.errCode == WXSuccess) { + if (self.appId && r) { + // ios 第一次获取不到 appid 会卡死,加个判断 OK + [body addEntriesFromDictionary:@{ @"appid": self.appId, @"code": r.code }]; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } + } else { + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } + } else if ([resp isKindOfClass:[PayResp class]]) { + PayResp *r = (PayResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"type"] = @(r.type); + body[@"returnKey"] = r.returnKey; + body[@"type"] = @"PayReq.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } else if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]]) { + WXLaunchMiniProgramResp *r = (WXLaunchMiniProgramResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + body[@"extMsg"] = r.extMsg; + body[@"type"] = @"WXLaunchMiniProgramReq.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } else if ([resp isKindOfClass:[WXChooseInvoiceResp class]]) { + WXChooseInvoiceResp *r = (WXChooseInvoiceResp *)resp; + NSMutableDictionary *body = @{ @"errCode": @(r.errCode) }.mutableCopy; + body[@"errStr"] = r.errStr; + NSMutableArray *arr = [[NSMutableArray alloc] init]; + for (WXCardItem *cardItem in r.cardAry) { + NSMutableDictionary *item = @{ @"cardId": cardItem.cardId, @"encryptCode": cardItem.encryptCode, @"appId": cardItem.appID }.mutableCopy; + [arr addObject:item]; + } + body[@"cards"] = arr; + body[@"type"] = @"WXChooseInvoiceResp.Resp"; + [self.bridge.eventDispatcher sendDeviceEventWithName:RCTWXEventName body:body]; + } } - (WXMiniProgramType)integerToWXMiniProgramType:(int)value { - WXMiniProgramType type = WXMiniProgramTypeRelease; - switch (value) { - case 0: - type = WXMiniProgramTypeRelease; - break; - case 1: - type = WXMiniProgramTypeTest; - break; - case 2: - type = WXMiniProgramTypePreview; - break; - } - return type; + WXMiniProgramType type = WXMiniProgramTypeRelease; + switch (value) { + case 0: + type = WXMiniProgramTypeRelease; + break; + case 1: + type = WXMiniProgramTypeTest; + break; + case 2: + type = WXMiniProgramTypePreview; + break; + } + return type; } @end From 41bd3982148707019688853ad972769f6e6f4750 Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:54:06 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/WechatLib.mm | 90 ++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/ios/WechatLib.mm b/ios/WechatLib.mm index 3efec82..76e0ad7 100644 --- a/ios/WechatLib.mm +++ b/ios/WechatLib.mm @@ -100,9 +100,9 @@ RCT_EXPORT_MODULE() } RCT_EXPORT_METHOD(registerApp - : (NSString *)appid - : (NSString *)universalLink - : (RCTResponseSenderBlock)callback) { + :(NSString *)appid + :(NSString *)universalLink + :(RCTResponseSenderBlock)callback) { self.appId = appid; callback(@[[WXApi registerApp:appid universalLink:universalLink] ? [NSNull null] : INVOKE_FAILED]); } @@ -115,33 +115,33 @@ RCT_EXPORT_METHOD(registerApp // } RCT_EXPORT_METHOD(isWXAppInstalled - : (RCTResponseSenderBlock)callback) { + :(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); } RCT_EXPORT_METHOD(isWXAppSupportApi - : (RCTResponseSenderBlock)callback) { + :(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); } RCT_EXPORT_METHOD(getWXAppInstallUrl - : (RCTResponseSenderBlock)callback) { + :(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]); } RCT_EXPORT_METHOD(getApiVersion - : (RCTResponseSenderBlock)callback) { + :(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], [WXApi getApiVersion]]); } RCT_EXPORT_METHOD(openWXApp - : (RCTResponseSenderBlock)callback) { + :(RCTResponseSenderBlock)callback) { callback(@[([WXApi openWXApp] ? [NSNull null] : INVOKE_FAILED)]); } RCT_EXPORT_METHOD(sendRequest - : (NSString *)openid - : (RCTResponseSenderBlock)callback) { + :(NSString *)openid + :(RCTResponseSenderBlock)callback) { BaseReq *req = [[BaseReq alloc] init]; req.openID = openid; // callback(@[[WXApi sendReq:req] ? [NSNull null] : INVOKE_FAILED]); @@ -154,9 +154,9 @@ RCT_EXPORT_METHOD(sendRequest } RCT_EXPORT_METHOD(sendAuthRequest - : (NSString *)scope - : (NSString *)state - : (RCTResponseSenderBlock)callback) { + :(NSString *)scope + :(NSString *)state + :(RCTResponseSenderBlock)callback) { SendAuthReq *req = [[SendAuthReq alloc] init]; req.scope = scope; req.state = state; @@ -170,7 +170,7 @@ RCT_EXPORT_METHOD(sendAuthRequest } RCT_EXPORT_METHOD(sendSuccessResponse - : (RCTResponseSenderBlock)callback) { + :(RCTResponseSenderBlock)callback) { BaseResp *resp = [[BaseResp alloc] init]; resp.errCode = WXSuccess; void (^completion)(BOOL); @@ -183,8 +183,8 @@ RCT_EXPORT_METHOD(sendSuccessResponse } RCT_EXPORT_METHOD(sendErrorCommonResponse - : (NSString *)message - : (RCTResponseSenderBlock)callback) { + :(NSString *)message + :(RCTResponseSenderBlock)callback) { BaseResp *resp = [[BaseResp alloc] init]; resp.errCode = WXErrCodeCommon; resp.errStr = message; @@ -198,8 +198,8 @@ RCT_EXPORT_METHOD(sendErrorCommonResponse } RCT_EXPORT_METHOD(sendErrorUserCancelResponse - : (NSString *)message - : (RCTResponseSenderBlock)callback) { + :(NSString *)message + :(RCTResponseSenderBlock)callback) { BaseResp *resp = [[BaseResp alloc] init]; resp.errCode = WXErrCodeUserCancel; resp.errStr = message; @@ -214,8 +214,8 @@ RCT_EXPORT_METHOD(sendErrorUserCancelResponse // 分享文本 RCT_EXPORT_METHOD(shareText - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init]; req.bText = YES; req.text = data[@"text"]; @@ -230,8 +230,8 @@ RCT_EXPORT_METHOD(shareText // 选择发票 RCT_EXPORT_METHOD(chooseInvoice - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXChooseInvoiceReq *req = [[WXChooseInvoiceReq alloc] init]; req.appID = self.appId; req.timeStamp = [data[@"timeStamp"] intValue]; @@ -249,8 +249,8 @@ RCT_EXPORT_METHOD(chooseInvoice // 分享文件 RCT_EXPORT_METHOD(shareFile - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { NSString *url = data[@"url"]; WXFileObject *file = [[WXFileObject alloc] init]; file.fileExtension = data[@"ext"]; @@ -281,8 +281,8 @@ RCT_EXPORT_METHOD(shareFile // 分享图片 RCT_EXPORT_METHOD(shareImage - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { NSString *imageUrl = data[@"imageUrl"]; if (imageUrl == NULL || [imageUrl isEqual:@""]) { callback([NSArray arrayWithObject:@"shareImage: The value of ImageUrl cannot be empty."]); @@ -324,8 +324,8 @@ RCT_EXPORT_METHOD(shareImage // 分享本地图片 RCT_EXPORT_METHOD(shareLocalImage - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { NSString *imageUrl = data[@"imageUrl"]; if (imageUrl == NULL || [imageUrl isEqual:@""]) { callback([NSArray arrayWithObject:@"shareLocalImage: The value of ImageUrl cannot be empty."]); @@ -367,8 +367,8 @@ RCT_EXPORT_METHOD(shareLocalImage // 分享音乐 RCT_EXPORT_METHOD(shareMusic - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXMusicObject *musicObject = [WXMusicObject object]; musicObject.musicUrl = data[@"musicUrl"]; musicObject.musicLowBandUrl = data[@"musicLowBandUrl"]; @@ -399,8 +399,8 @@ RCT_EXPORT_METHOD(shareMusic // 分享视频 RCT_EXPORT_METHOD(shareVideo - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXVideoObject *videoObject = [WXVideoObject object]; videoObject.videoUrl = data[@"videoUrl"]; videoObject.videoLowBandUrl = data[@"videoLowBandUrl"]; @@ -426,8 +426,8 @@ RCT_EXPORT_METHOD(shareVideo } // 分享网页 RCT_EXPORT_METHOD(shareWebpage - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXWebpageObject *webpageObject = [WXWebpageObject object]; webpageObject.webpageUrl = data[@"webpageUrl"]; WXMediaMessage *message = [WXMediaMessage message]; @@ -453,8 +453,8 @@ RCT_EXPORT_METHOD(shareWebpage // 分享小程序 RCT_EXPORT_METHOD(shareMiniProgram - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXMiniProgramObject *object = [WXMiniProgramObject object]; object.webpageUrl = data[@"webpageUrl"]; object.userName = data[@"userName"]; @@ -493,8 +493,8 @@ RCT_EXPORT_METHOD(shareMiniProgram // 一次性订阅消息 RCT_EXPORT_METHOD(subscribeMessage - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXSubscribeMsgReq *req = [[WXSubscribeMsgReq alloc] init]; req.scene = [data[@"scene"] integerValue]; req.templateId = data[@"templateId"]; @@ -508,8 +508,8 @@ RCT_EXPORT_METHOD(subscribeMessage } RCT_EXPORT_METHOD(launchMiniProgram - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object]; // 拉起的小程序的 username launchMiniProgramReq.userName = data[@"userName"]; @@ -530,8 +530,8 @@ RCT_EXPORT_METHOD(launchMiniProgram } RCT_EXPORT_METHOD(pay - : (NSDictionary *)data - : (RCTResponseSenderBlock)callback) { + :(NSDictionary *)data + :(RCTResponseSenderBlock)callback) { PayReq *req = [PayReq new]; req.partnerId = data[@"partnerId"]; req.prepayId = data[@"prepayId"]; @@ -551,9 +551,9 @@ RCT_EXPORT_METHOD(pay // 跳转微信客服 RCT_EXPORT_METHOD(openCustomerServiceChat - : (NSString *)corpId - : (NSString *)kfUrl - : (RCTResponseSenderBlock)callback) { + :(NSString *)corpId + :(NSString *)kfUrl + :(RCTResponseSenderBlock)callback) { WXOpenCustomerServiceReq *req = [[WXOpenCustomerServiceReq alloc] init]; req.corpid = corpId; // 企业 ID req.url = kfUrl; // 客服 URL From 3376243a2c8d3062c839263c1d5757060e380f2d Mon Sep 17 00:00:00 2001 From: chenying09 Date: Wed, 7 Aug 2024 21:57:53 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/WechatLib.mm | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/ios/WechatLib.mm b/ios/WechatLib.mm index 76e0ad7..8ece4c1 100644 --- a/ios/WechatLib.mm +++ b/ios/WechatLib.mm @@ -114,28 +114,23 @@ RCT_EXPORT_METHOD(registerApp // callback(@[[WXApi registerApp:appid withDescription:appdesc] ? [NSNull null] : INVOKE_FAILED]); // } -RCT_EXPORT_METHOD(isWXAppInstalled - :(RCTResponseSenderBlock)callback) { +RCT_EXPORT_METHOD(isWXAppInstalled:(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], @([WXApi isWXAppInstalled])]); } -RCT_EXPORT_METHOD(isWXAppSupportApi - :(RCTResponseSenderBlock)callback) { +RCT_EXPORT_METHOD(isWXAppSupportApi:(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], @([WXApi isWXAppSupportApi])]); } -RCT_EXPORT_METHOD(getWXAppInstallUrl - :(RCTResponseSenderBlock)callback) { +RCT_EXPORT_METHOD(getWXAppInstallUrl:(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]); } -RCT_EXPORT_METHOD(getApiVersion - :(RCTResponseSenderBlock)callback) { +RCT_EXPORT_METHOD(getApiVersion:(RCTResponseSenderBlock)callback) { callback(@[[NSNull null], [WXApi getApiVersion]]); } -RCT_EXPORT_METHOD(openWXApp - :(RCTResponseSenderBlock)callback) { +RCT_EXPORT_METHOD(openWXApp:(RCTResponseSenderBlock)callback) { callback(@[([WXApi openWXApp] ? [NSNull null] : INVOKE_FAILED)]); }