diff --git a/RCTWeChat.podspec b/RCTWeChat.podspec index 5dea541..59b0117 100644 --- a/RCTWeChat.podspec +++ b/RCTWeChat.podspec @@ -20,6 +20,7 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/little-snow-fox/react-native-wechat-lib.git", :tag => "master" } s.source_files = "ios/*.{h,m}" s.dependency "React" + s.dependency "WechatOpenSDK-XCFramework", "2.0.4" s.vendored_libraries = "ios/libWeChatSDK.a" s.requires_arc = true s.frameworks = 'SystemConfiguration','CoreTelephony' diff --git a/android/build.gradle b/android/build.gradle index 872fb6b..0763d5f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,6 +28,6 @@ allprojects { dependencies { api 'com.facebook.react:react-native:+' - api files('libs/libammsdk.jar') + api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.30' // compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' } diff --git a/android/libs/libammsdk.jar b/android/libs/libammsdk.jar deleted file mode 100644 index 0333f68..0000000 Binary files a/android/libs/libammsdk.jar and /dev/null differ diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index d7e6b6e..94658f8 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -5,4 +5,8 @@ + + + // 指定微信包名 + diff --git a/android/src/main/java/com/theweflex/react/WeChatModule.java b/android/src/main/java/com/theweflex/react/WeChatModule.java index 99d4518..468e4bb 100644 --- a/android/src/main/java/com/theweflex/react/WeChatModule.java +++ b/android/src/main/java/com/theweflex/react/WeChatModule.java @@ -5,12 +5,10 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; -import android.os.Environment; import androidx.annotation.Nullable; import com.facebook.common.executors.UiThreadImmediateExecutorService; -import com.facebook.common.internal.Files; import com.facebook.common.references.CloseableReference; import com.facebook.common.util.UriUtil; import com.facebook.datasource.DataSource; @@ -29,8 +27,11 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.tencent.mm.opensdk.constants.ConstantsAPI; import com.tencent.mm.opensdk.modelbase.BaseReq; import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.modelbiz.SubscribeMessage; +import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram; import com.tencent.mm.opensdk.modelmsg.SendAuth; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; import com.tencent.mm.opensdk.modelmsg.ShowMessageFromWX; @@ -44,21 +45,13 @@ import com.tencent.mm.opensdk.modelmsg.WXWebpageObject; import com.tencent.mm.opensdk.modelpay.PayReq; import com.tencent.mm.opensdk.modelpay.PayResp; -import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; import com.tencent.mm.opensdk.openapi.WXAPIFactory; -import com.tencent.mm.opensdk.constants.ConstantsAPI; -import com.tencent.mm.opensdk.modelbiz.SubscribeMessage; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URI; import java.util.ArrayList; import java.util.UUID; @@ -92,7 +85,8 @@ private static byte[] bitmapResizeGetBytes(Bitmap image, int size) { if (options > 10) { options -= 8; } else { - return bitmapResizeGetBytes(Bitmap.createScaledBitmap(image, 280, image.getHeight() / image.getWidth() * 280, true), size); + float height = (float) image.getHeight() / image.getWidth() * 280; + return bitmapResizeGetBytes(Bitmap.createScaledBitmap(image, 280, (int) height , true), size); } // 这里压缩options%,把压缩后的数据存放到baos中 image.compress(Bitmap.CompressFormat.JPEG, options, baos); @@ -106,7 +100,7 @@ public WeChatModule(ReactApplicationContext context) { @Override public String getName() { - return "RCTWeChat"; + return "WeChat"; } /** @@ -128,8 +122,8 @@ public void initialize() { } @Override - public void onCatalystInstanceDestroy() { - super.onCatalystInstanceDestroy(); + public void invalidate() { + super.invalidate(); if (api != null) { api = null; } @@ -262,47 +256,34 @@ public void invoke(@Nullable Bitmap bitmap) { */ @ReactMethod public void shareLocalImage(final ReadableMap data, final Callback callback) { - FileInputStream fs = null; try { String path = data.getString("imageUrl"); - if (path.indexOf("file://") > -1) { + + Bitmap originalBitmap = null; + if (path.startsWith("file://")) { path = path.substring(7); + FileInputStream fs = new FileInputStream(path); + originalBitmap = BitmapFactory.decodeStream(fs); + } else { + originalBitmap = BitmapFactory.decodeStream(getReactApplicationContext().getContentResolver().openInputStream(Uri.parse(path))); } -// int maxWidth = data.hasKey("maxWidth") ? data.getInt("maxWidth") : -1; - fs = new FileInputStream(path); - Bitmap bmp = BitmapFactory.decodeStream(fs); - -// if (maxWidth > 0) { -// bmp = Bitmap.createScaledBitmap(bmp, maxWidth, bmp.getHeight() / bmp.getWidth() * maxWidth, true); -// } - -// File f = Environment.getExternalStoragePublicDirectory(SDCARD_ROOT + "/react-native-wechat-lib"); -// String fileName = "wechat-share.jpg"; -// String tempPath = SDCARD_ROOT + "/react-native-wechat-lib"; -// File file = new File(f, fileName); -// try { -// FileOutputStream fos = new FileOutputStream(file); -// bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos); -// fos.flush(); -// fos.close(); -// } catch (FileNotFoundException e) { -// e.printStackTrace(); -// } catch (IOException e) { -// e.printStackTrace(); -// } - -// int size = bmp.getByteCount(); -// ByteArrayOutputStream var2 = new ByteArrayOutputStream(); -// bmp.compress(Bitmap.CompressFormat.JPEG, 85, var2); -// int size2 = var2.toByteArray().length; - // 初始化 WXImageObject 和 WXMediaMessage 对象 - - WXImageObject imgObj = new WXImageObject(bmp); + + float maxHeight = 3000; + float originalBitmapWidth = originalBitmap.getWidth(); + float originalBitmapHeight = originalBitmap.getHeight(); + + float currentHeight = originalBitmapHeight > maxHeight ? maxHeight : originalBitmapHeight; + float currentWidth = currentHeight / originalBitmapHeight * originalBitmapWidth; WXMediaMessage msg = new WXMediaMessage(); + + Bitmap imageBitmap = Bitmap.createScaledBitmap(originalBitmap, (int) currentWidth, (int) currentHeight, false); + + WXImageObject imgObj = new WXImageObject(imageBitmap); + msg.mediaObject = imgObj; - // 设置缩略图 - msg.thumbData = bitmapResizeGetBytes(bmp, THUMB_SIZE); - bmp.recycle(); + // 设置缩略图 + msg.thumbData = bitmapResizeGetBytes(imageBitmap, THUMB_SIZE); + // 构造一个Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = "img"; @@ -477,7 +458,8 @@ public void shareMiniProgram(final ReadableMap data, final Callback callback) { public void invoke(@Nullable Bitmap bmp) { // 小程序消息封面图片,小于128k if (bmp != null) { - msg.thumbData = bitmapResizeGetBytes(bmp, 128); + // 设置size为128有时候微信会报错图片太大, 无法成功分享, 故设为100 + msg.thumbData = bitmapResizeGetBytes(bmp, 100); } // 构造一个Req SendMessageToWX.Req req = new SendMessageToWX.Req(); diff --git a/ios/RCTWeChat.m b/ios/RCTWeChat.m index 88a15c2..18f6450 100644 --- a/ios/RCTWeChat.m +++ b/ios/RCTWeChat.m @@ -101,7 +101,7 @@ - (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength { if (data.length > maxLength) { return [self compressImage:resultImage toByte:maxLength]; } - + return data; } @@ -255,7 +255,7 @@ - (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength { callback([NSArray arrayWithObject:@"shareImage: ImageUrl value, Could not find file suffix."]); return; } - + // 根据路径下载图片 UIImage *image = [self getImageFromURL:imageUrl]; // 从 UIImage 获取图片数据 @@ -263,7 +263,7 @@ - (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength { // 用图片数据构建 WXImageObject 对象 WXImageObject *imageObject = [WXImageObject object]; imageObject.imageData = imageData; - + WXMediaMessage *message = [WXMediaMessage message]; // 利用原图压缩出缩略图,确保缩略图大小不大于32KB message.thumbData = [self compressImage: image toByte:32678]; @@ -300,15 +300,17 @@ - (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength { callback([NSArray arrayWithObject:@"shareLocalImage: ImageUrl value, Could not find file suffix."]); return; } - // 根据路径下载图片 + if ([imageUrl hasPrefix:@"file"]) { + imageUrl = [imageUrl stringByReplacingOccurrencesOfString: @"file://" withString: @""]; + } 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]; @@ -540,7 +542,7 @@ -(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; @@ -555,7 +557,7 @@ -(void) onResp:(BaseResp*)resp body[@"lang"] = r.lang; body[@"country"] =r.country; body[@"type"] = @"SendAuth.Resp"; - + if (resp.errCode == WXSuccess) { if (self.appId && r) { // ios第一次获取不到appid会卡死,加个判断OK diff --git a/ios/RCTWeChat.xcodeproj/project.pbxproj b/ios/RCTWeChat.xcodeproj/project.pbxproj index ec9c5c4..89116ac 100644 --- a/ios/RCTWeChat.xcodeproj/project.pbxproj +++ b/ios/RCTWeChat.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ 10D6D7A91F160C250066F0F3 /* libRCTWeChat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 86D238421BD0BB9E00C75D01 /* libRCTWeChat.a */; }; 10D6D7AF1F160C3A0066F0F3 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 10D6D76D1F160B090066F0F3 /* libReact.a */; }; 86D238561BD0BC1000C75D01 /* RCTWeChat.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D238551BD0BC1000C75D01 /* RCTWeChat.m */; }; - 86D2385D1BD0CA3D00C75D01 /* libWeChatSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 86D238571BD0BC2200C75D01 /* libWeChatSDK.a */; settings = {ATTRIBUTES = (Required, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -128,7 +127,6 @@ 86D238421BD0BB9E00C75D01 /* libRCTWeChat.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTWeChat.a; sourceTree = BUILT_PRODUCTS_DIR; }; 86D238541BD0BC1000C75D01 /* RCTWeChat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTWeChat.h; sourceTree = SOURCE_ROOT; }; 86D238551BD0BC1000C75D01 /* RCTWeChat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTWeChat.m; sourceTree = SOURCE_ROOT; }; - 86D238571BD0BC2200C75D01 /* libWeChatSDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWeChatSDK.a; sourceTree = ""; }; 86D238581BD0BC2200C75D01 /* WXApi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApi.h; sourceTree = ""; }; 86D238591BD0BC2200C75D01 /* WXApiObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApiObject.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -147,7 +145,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 86D2385D1BD0CA3D00C75D01 /* libWeChatSDK.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -185,7 +182,6 @@ 86D238391BD0BB9E00C75D01 = { isa = PBXGroup; children = ( - 86D238571BD0BC2200C75D01 /* libWeChatSDK.a */, 86D238581BD0BC2200C75D01 /* WXApi.h */, 86D238591BD0BC2200C75D01 /* WXApiObject.h */, 86D238441BD0BB9E00C75D01 /* RCTWeChat */, @@ -276,6 +272,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 86D238391BD0BB9E00C75D01; diff --git a/ios/libWeChatSDK.a b/ios/libWeChatSDK.a deleted file mode 100644 index 66b3398..0000000 Binary files a/ios/libWeChatSDK.a and /dev/null differ