一.xcode代码修改
先在xCode全局搜索了一下UIWebView,把所有UIWebView该移除,该替换为WKWebview的替换
二、vscode 代码修改
然后又在vscode 里面搜索了rn代码,卧槽我怎么知道这个WebView是不是用了UIWebView呢,然后我在网上找到了一个方法可以设置为WKWebView
网上看见设置为WKWebView的代码,<WebView useWebKit={true} source={{url: 'https://www.google.com'}} />,本来觉得希望很大了,全部WebView都改了一遍,打包上传,大写的卧槽,还是不行。
然后再搜搜了一下网上的问题,可惜没有一个说这个问题的,倒是看到有个人写了用命令行看;
打包成功,但在appstore无法看到上传的版本,一直收到以上邮件,当时内心是绝望的,打包了很久,对React-native又不熟,
使用命令查看那个文件包含UIWebView;
grep -r UIWebView .
查看结果如下:
三、查找包含的RN第三方包更新各种库
找的了微信的第三方库,我验证了一下到底是不是react-native-wechat包导致的,我就用最笨的方案,删除微信相关的库,然后打包上传,然后终于可以看到appstore上终于重逢了APP,老泪纵横,感动啊,终于找到最后的问题所在了。
接下来就是解决微信第三方的问题了,这个更新的是8个月前,大大的卧槽,这个微信的SDK果然不是最新的,还特么以前的老板本,太坑了
坑又能怎么办,找到问题就只有解决了,然后我用了最快速的方法,就是把pod里面的微信SDK都替换了,然后再改改代码
//
// RCTWeChat.m
// RCTWeChat
//
// Created by Yorkie Liu on 10/16/15.
// Copyright © 2015 WeFlex. All rights reserved.
//
#import "RCTWeChat.h"
#import "WXApiObject.h"
#import <React/RCTEventDispatcher.h>
#import <React/RCTBridge.h>
#import <React/RCTLog.h>
#import <React/RCTImageLoader.h>
// Define error messages
#define NOT_REGISTERED (@"registerApp required.")
#define INVOKE_FAILED (@"WeChat API invoke returns false.")
@implementation RCTWeChat
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE()
- (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];
}
- (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;
}
}
- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}
+ (BOOL)requiresMainQueueSetup {
return YES;
}
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
// :(NSString *)appdesc
// :(RCTResponseSenderBlock)callback)
//{
// callback(@[[WXApi registerApp:appid withDescription:appdesc] ? [NSNull null] : INVOKE_FAILED]);
//}
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(getWXAppInstallUrl:(RCTResponseSenderBlock)callback)
{
callback(@[[NSNull null], [WXApi getWXAppInstallUrl]]);
}
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(sendRequest:(NSString *)openid
:(RCTResponseSenderBlock)callback)
{
BaseReq* req = [[BaseReq alloc] init];
req.openID = openid;
[WXApi sendReq:req completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
RCT_EXPORT_METHOD(sendAuthRequest:(NSString *)scope
:(NSString *)state
:(RCTResponseSenderBlock)callback)
{
SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = scope;
req.state = state;
[WXApi sendReq:req completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
RCT_EXPORT_METHOD(sendSuccessResponse:(RCTResponseSenderBlock)callback)
{
BaseResp* resp = [[BaseResp alloc] init];
resp.errCode = WXSuccess;
[WXApi sendResp:resp completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
RCT_EXPORT_METHOD(sendErrorCommonResponse:(NSString *)message
:(RCTResponseSenderBlock)callback)
{
BaseResp* resp = [[BaseResp alloc] init];
resp.errCode = WXErrCodeCommon;
resp.errStr = message;
[WXApi sendResp:resp completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
RCT_EXPORT_METHOD(sendErrorUserCancelResponse:(NSString *)message
:(RCTResponseSenderBlock)callback)
{
BaseResp* resp = [[BaseResp alloc] init];
resp.errCode = WXErrCodeUserCancel;
resp.errStr = message;
[WXApi sendResp:resp completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
RCT_EXPORT_METHOD(shareToTimeline:(NSDictionary *)data
:(RCTResponseSenderBlock)callback)
{
[self shareToWeixinWithData:data scene:WXSceneTimeline callback:callback];
}
RCT_EXPORT_METHOD(shareToSession:(NSDictionary *)data
:(RCTResponseSenderBlock)callback)
{
[self shareToWeixinWithData:data scene:WXSceneSession callback:callback];
}
RCT_EXPORT_METHOD(shareToFavorite:(NSDictionary *)data
:(RCTResponseSenderBlock)callback)
{
[self shareToWeixinWithData:data scene:WXSceneFavorite callback:callback];
}
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"];
[WXApi sendReq:req completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
- (void)shareToWeixinWithData:(NSDictionary *)aData
thumbImage:(UIImage *)aThumbImage
scene:(int)aScene
callBack:(RCTResponseSenderBlock)callback
{
NSString *type = aData[RCTWXShareType];
if ([type isEqualToString:RCTWXShareTypeText]) {
NSString *text = aData[RCTWXShareDescription];
[self shareToWeixinWithTextMessage:aScene Text:text callBack:callback];
} else {
NSString * title = aData[RCTWXShareTitle];
NSString * description = aData[RCTWXShareDescription];
NSString * mediaTagName = aData[@"mediaTagName"];
NSString * messageAction = aData[@"messageAction"];
NSString * messageExt = aData[@"messageExt"];
if (type.length <= 0 || [type isEqualToString:RCTWXShareTypeNews]) {
NSString * webpageUrl = aData[RCTWXShareWebpageUrl];
if (webpageUrl.length <= 0) {
callback(@[@"webpageUrl required"]);
return;
}
WXWebpageObject* webpageObject = [WXWebpageObject object];
webpageObject.webpageUrl = webpageUrl;
[self shareToWeixinWithMediaMessage:aScene
Title:title
Description:description
Object:webpageObject
MessageExt:messageExt
MessageAction:messageAction
ThumbImage:aThumbImage
MediaTag:mediaTagName
callBack:callback];
} else if ([type isEqualToString:RCTWXShareTypeAudio]) {
WXMusicObject *musicObject = [WXMusicObject new];
musicObject.musicUrl = aData[@"musicUrl"];
musicObject.musicLowBandUrl = aData[@"musicLowBandUrl"];
musicObject.musicDataUrl = aData[@"musicDataUrl"];
musicObject.musicLowBandDataUrl = aData[@"musicLowBandDataUrl"];
[self shareToWeixinWithMediaMessage:aScene
Title:title
Description:description
Object:musicObject
MessageExt:messageExt
MessageAction:messageAction
ThumbImage:aThumbImage
MediaTag:mediaTagName
callBack:callback];
} else if ([type isEqualToString:RCTWXShareTypeVideo]) {
WXVideoObject *videoObject = [WXVideoObject new];
videoObject.videoUrl = aData[@"videoUrl"];
videoObject.videoLowBandUrl = aData[@"videoLowBandUrl"];
[self shareToWeixinWithMediaMessage:aScene
Title:title
Description:description
Object:videoObject
MessageExt:messageExt
MessageAction:messageAction
ThumbImage:aThumbImage
MediaTag:mediaTagName
callBack:callback];
} else if ([type isEqualToString:RCTWXShareTypeImageUrl] ||
[type isEqualToString:RCTWXShareTypeImageFile] ||
[type isEqualToString:RCTWXShareTypeImageResource]) {
NSURL *url = [NSURL URLWithString:aData[RCTWXShareImageUrl]];
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:url];
[self.bridge.imageLoader loadImageWithURLRequest:imageRequest callback:^(NSError *error, UIImage *image) {
if (image == nil){
callback(@[@"fail to load image resource"]);
} else {
WXImageObject *imageObject = [WXImageObject object];
// imageObject.imageData = UIImagePNGRepresentation(image);
NSData *imgData=UIImageJPEGRepresentation(image, 0.8);
imageObject.imageData = imgData;
[self shareToWeixinWithMediaMessage:aScene
Title:title
Description:description
Object:imageObject
MessageExt:messageExt
MessageAction:messageAction
ThumbImage:aThumbImage
MediaTag:mediaTagName
callBack:callback];
}
}];
} else if ([type isEqualToString:RCTWXShareTypeFile]) {
NSString * filePath = aData[@"filePath"];
NSString * fileExtension = aData[@"fileExtension"];
WXFileObject *fileObject = [WXFileObject object];
fileObject.fileData = [NSData dataWithContentsOfFile:filePath];
fileObject.fileExtension = fileExtension;
[self shareToWeixinWithMediaMessage:aScene
Title:title
Description:description
Object:fileObject
MessageExt:messageExt
MessageAction:messageAction
ThumbImage:aThumbImage
MediaTag:mediaTagName
callBack:callback];
} else {
callback(@[@"message type unsupported"]);
}
}
}
- (void)shareToWeixinWithData:(NSDictionary *)aData scene:(int)aScene callback:(RCTResponseSenderBlock)aCallBack
{
NSString *imageUrl = aData[RCTWXShareTypeThumbImageUrl];
if (imageUrl.length && _bridge.imageLoader) {
NSURL *url = [NSURL URLWithString:imageUrl];
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:url];
[_bridge.imageLoader loadImageWithURLRequest:imageRequest size:CGSizeMake(100, 100) scale:1 clipped:FALSE resizeMode:RCTResizeModeStretch progressBlock:nil partialLoadBlock:nil
completionBlock:^(NSError *error, UIImage *image) {
[self shareToWeixinWithData:aData thumbImage:image scene:aScene callBack:aCallBack];
}];
} else {
[self shareToWeixinWithData:aData thumbImage:nil scene:aScene callBack:aCallBack];
}
}
- (void)shareToWeixinWithTextMessage:(int)aScene
Text:(NSString *)text
callBack:(RCTResponseSenderBlock)callback
{
SendMessageToWXReq* req = [SendMessageToWXReq new];
req.bText = YES;
req.scene = aScene;
req.text = text;
[WXApi sendReq:req completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
}
- (void)shareToWeixinWithMediaMessage:(int)aScene
Title:(NSString *)title
Description:(NSString *)description
Object:(id)mediaObject
MessageExt:(NSString *)messageExt
MessageAction:(NSString *)action
ThumbImage:(UIImage *)thumbImage
MediaTag:(NSString *)tagName
callBack:(RCTResponseSenderBlock)callback
{
WXMediaMessage *message = [WXMediaMessage message];
message.title = title;
message.description = description;
message.mediaObject = mediaObject;
message.messageExt = @"这是第三方带的测试字段";;
message.messageAction = @"<action>dotalist</action>";;
message.mediaTagName = @"WECHAT_TAG_JUMP_APP";
[message setThumbImage:thumbImage];
// WXMediaMessage *message = [WXMediaMessage message];
// message.title = title;
// message.description = description;
// message.mediaObject = mediaObject;
// message.messageExt = messageExt;
// message.messageAction = action;
// message.mediaTagName = tagName;
// [message setThumbImage:thumbImage];
SendMessageToWXReq* req = [SendMessageToWXReq new];
req.bText = NO;
req.scene = aScene;
req.message = message;
dispatch_async(dispatch_get_main_queue(), ^{
[WXApi sendReq:req completion:^(BOOL success) {
callback(@[success ? [NSNull null] : INVOKE_FAILED]);
}];
});
}
#pragma mark - wx callback
-(void) onReq:(BaseReq*)req
{
// TODO(Yorkie)
}
-(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";
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];
}
}
@end
然后改完代码,打包成功了。真是太不容易了,各位客官,觉得可以打打个裳呗,创造不易啊。