提交 f09621e6 authored 作者: JarvanMo's avatar JarvanMo

ios share

上级 bde9d52e
package com.jarvan.fluwx.handler package com.jarvan.fluwx.handler
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.util.Log import android.util.Log
import com.jarvan.fluwx.R
import com.jarvan.fluwx.constant.CallResult import com.jarvan.fluwx.constant.CallResult
import com.jarvan.fluwx.constant.WeChatPluginMethods import com.jarvan.fluwx.constant.WeChatPluginMethods
import com.jarvan.fluwx.constant.WechatPluginKeys import com.jarvan.fluwx.constant.WechatPluginKeys
import com.jarvan.fluwx.utils.ShareImageUtil import com.jarvan.fluwx.utils.ShareImageUtil
import com.jarvan.fluwx.utils.Util
import com.jarvan.fluwx.utils.WeChatThumbnailUtil import com.jarvan.fluwx.utils.WeChatThumbnailUtil
import com.tencent.mm.opensdk.modelbase.BaseResp import com.tencent.mm.opensdk.modelbase.BaseResp
import com.tencent.mm.opensdk.modelmsg.* import com.tencent.mm.opensdk.modelmsg.*
...@@ -138,7 +142,8 @@ object WeChatPluginHandler { ...@@ -138,7 +142,8 @@ object WeChatPluginHandler {
launch(UI){ launch(UI){
val byteArray :ByteArray? = getImageByteArrayCommon(registrar,imagePath) val byteArray :ByteArray? = getImageByteArrayCommon(registrar,imagePath)
val imgObj = if (byteArray != null) {
val imgObj = if (byteArray != null && byteArray.isNotEmpty()) {
WXImageObject(byteArray) WXImageObject(byteArray)
} else { } else {
null null
...@@ -153,8 +158,10 @@ object WeChatPluginHandler { ...@@ -153,8 +158,10 @@ object WeChatPluginHandler {
if (thumbnail.isNullOrBlank()){ if (thumbnail.isNullOrBlank()){
thumbnail = imagePath thumbnail = imagePath
} }
// val thumbnailData = getThumbnailByteArrayCommon(registrar,thumbnail!!)
handleShareImage(imgObj,call,null,result) val bitmap = BitmapFactory.decodeResource(registrar!!.context().resources,R.mipmap.ic_launcher)
val thumbnailData = Util.bmpToByteArray(bitmap,true)
handleShareImage(imgObj,call,thumbnailData,result)
} }
} }
......
...@@ -44,7 +44,8 @@ public class ShareImageUtil { ...@@ -44,7 +44,8 @@ public class ShareImageUtil {
bmp = BitmapFactory.decodeFile(path); bmp = BitmapFactory.decodeFile(path);
result = Util.bmpToByteArray(bmp, true); result = Util.bmpToByteArray(bmp, true);
} else { } else {
result = handleNetworkImage(registrar, path); // result = handleNetworkImage(registrar, path);
result = Util.inputStreamToByte(openStream(path));
} }
return result; return result;
...@@ -53,10 +54,13 @@ public class ShareImageUtil { ...@@ -53,10 +54,13 @@ public class ShareImageUtil {
private static byte[] handleNetworkImage(PluginRegistry.Registrar registrar, String path) { private static byte[] handleNetworkImage(PluginRegistry.Registrar registrar, String path) {
byte[] result = null; byte[] result = null;
InputStream inputStream = openStream(path); InputStream inputStream = openStream(path);
if (inputStream == null) { if (inputStream == null) {
return null; return null;
} }
String suffix = ".jpg"; String suffix = ".jpg";
int index = path.lastIndexOf("."); int index = path.lastIndexOf(".");
if (index > 0) { if (index > 0) {
......
...@@ -441,8 +441,9 @@ ...@@ -441,8 +441,9 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.jarvan.fluwxExample; PRODUCT_BUNDLE_IDENTIFIER = "com.jarvanmo.fluwx-example";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../..\"/** \"${PROJECT_DIR}/../..\"/**";
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Debug; name = Debug;
...@@ -465,8 +466,9 @@ ...@@ -465,8 +466,9 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.jarvan.fluwxExample; PRODUCT_BUNDLE_IDENTIFIER = "com.jarvanmo.fluwx-example";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../..\"/** \"${PROJECT_DIR}/../..\"/**";
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Release; name = Release;
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
<dict> <dict>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleDisplayName</key>
<string>${PROJECT_NAME}</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
...@@ -18,6 +20,19 @@ ...@@ -18,6 +20,19 @@
<string>1.0</string> <string>1.0</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>weixin</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wxd930ea5d5a258f4f</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1</string> <string>1</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
...@@ -41,5 +56,16 @@ ...@@ -41,5 +56,16 @@
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</dict> </dict>
</plist> </plist>
...@@ -17,8 +17,8 @@ class _MyAppState extends State<MyApp> { ...@@ -17,8 +17,8 @@ class _MyAppState extends State<MyApp> {
void initState() { void initState() {
super.initState(); super.initState();
// initPlatformState(); // initPlatformState();
Fluwx.init("wxd930ea5d5a258f4f").then((_) { Fluwx.init("wxd930ea5d5a258f4f").then((result) {
print("succes"); print("succes-->$result");
}, onError: (value) { }, onError: (value) {
print("--->$value"); print("--->$value");
}); });
...@@ -55,12 +55,7 @@ class _MyAppState extends State<MyApp> { ...@@ -55,12 +55,7 @@ class _MyAppState extends State<MyApp> {
child: new FlatButton( child: new FlatButton(
onPressed: () { onPressed: () {
var fluwx = Fluwx(); var fluwx = Fluwx();
fluwx.share(WeChatShareImageModel( fluwx.share(WeChatShareTextModel(text: "hehe"));
image: "https://timgsa.baidu.com/timg?image&quality=80&size=b10000_10000&sec=1534342262&di=ae1078c9080282ec8bbd4909e6669ee2&src=http://img4q.duitang.com/uploads/item/201402/19/20140219123329_QkdNy.jpeg",
transaction: "hehe",
title: "from dart",
scene: WeChatScene.SESSION
));
}, },
child: new Text("share text to wechat")), child: new Text("share text to wechat")),
), ),
......
#import <Flutter/Flutter.h> #import <Flutter/Flutter.h>
@class FluwxShareHandler;
extern BOOL isWeChatRegistered; extern BOOL isWeChatRegistered;
@interface FluwxPlugin : NSObject<FlutterPlugin>
@interface FluwxPlugin : NSObject<FlutterPlugin> {
@private
FluwxShareHandler *_fluwxShareHandler;
}
@end @end
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
#import "FluwxMethods.h" #import "FluwxMethods.h"
#import "WXApi.h" #import "WXApi.h"
#import "StringUtil.h" #import "StringUtil.h"
#import "CallResults.h" #import "../../../../../../ios/Classes/handler/FluwxShareHandler.h"
#import "WXApiRequestHandler.h" #import "FluwxShareHandler.h"
#import "FluwxKeys.h" #import "FluwxShareHandler.h"
#import "StringToWeChatScene.h"
@implementation FluwxPlugin @implementation FluwxPlugin
...@@ -17,70 +16,54 @@ BOOL isWeChatRegistered = NO; ...@@ -17,70 +16,54 @@ BOOL isWeChatRegistered = NO;
FlutterMethodChannel *channel = [FlutterMethodChannel FlutterMethodChannel *channel = [FlutterMethodChannel
methodChannelWithName:@"fluwx" methodChannelWithName:@"fluwx"
binaryMessenger:[registrar messenger]]; binaryMessenger:[registrar messenger]];
FluwxPlugin *instance = [[FluwxPlugin alloc] init]; FluwxPlugin *instance = [[FluwxPlugin alloc] initWithRegistrar:registrar];
[registrar addMethodCallDelegate:instance channel:channel]; [registrar addMethodCallDelegate:instance channel:channel];
}
-(instancetype) initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
self = [super init];
if (self) {
_fluwxShareHandler = [[FluwxShareHandler alloc] initWithRegistrar:registrar];
}
return self;
} }
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
if ([initWeChat isEqualToString:call.method]) { if ([initWeChat isEqualToString:call.method]) {
[self initWeChatIfNeeded:call result:result]; [self initWeChatIfNeeded:call result:result];
} else if ([call.method hasPrefix:@"share"]) { } if ([call.method hasPrefix:@"share"]) {
[self handleShare:call result:result]; [_fluwxShareHandler handleShare:call result:result];
} else { } else {
result(FlutterMethodNotImplemented); result(FlutterMethodNotImplemented);
} }
} }
- (void)initWeChatIfNeeded:(FlutterMethodCall *)call result:(FlutterResult)result { - (void)initWeChatIfNeeded:(FlutterMethodCall *)call result:(FlutterResult)result {
if (isWeChatRegistered) { if (isWeChatRegistered) {
result(resultDone); result(@YES);
return; return;
} }
NSString *appId = call.arguments; NSString *appId = call.arguments;
NSLog(appId);
if ([StringUtil isBlank:appId]) { if ([StringUtil isBlank:appId]) {
result([FlutterError errorWithCode:@"invalid app id" message:@"are you sure your app id is correct ? " details:appId]); result([FlutterError errorWithCode:@"invalid app id" message:@"are you sure your app id is correct ? " details:appId]);
return; return;
} }
[WXApi registerApp:appId]; isWeChatRegistered = [WXApi registerApp:appId];
result(resultDone); result(@YES);
}
- (void)handleShare:(FlutterMethodCall *)call result:(FlutterResult)result {
if (!isWeChatRegistered) {
result([FlutterError errorWithCode:resultErrorNeedWeChat message:resultMessageNeedWeChat details:nil]);
return;
}
if ([shareText isEqualToString:call.method]) {
[self shareText:call result:result];
} else if([shareImage isEqualToString:call.method]){
[self shareImage:call result:result];
result(FlutterMethodNotImplemented);
}
}
- (void)shareText:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendText:text InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
}
- (void)shareImage:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendText:text InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
} }
......
...@@ -18,5 +18,10 @@ extern NSString *const fluwxKeyDescription; ...@@ -18,5 +18,10 @@ extern NSString *const fluwxKeyDescription;
extern NSString *const fluwxKeyPackage; extern NSString *const fluwxKeyPackage;
extern NSString *const fluwxKeyMessageExt;
extern NSString *const fluwxKeyMediaTagName;
extern NSString *const fluwxKeyMessageAction;
@interface FluwxKeys : NSObject @interface FluwxKeys : NSObject
@end @end
\ No newline at end of file
...@@ -18,6 +18,10 @@ NSString *const fluwxKeyDescription = @"description"; ...@@ -18,6 +18,10 @@ NSString *const fluwxKeyDescription = @"description";
NSString *const fluwxKeyPackage = @"?package="; NSString *const fluwxKeyPackage = @"?package=";
NSString *const fluwxKeyMessageExt =@"messageExt";
NSString *const fluwxKeyMediaTagName = @"mediaTagName ";
NSString *const fluwxKeyMessageAction = @"messageAction";
@implementation FluwxKeys { @implementation FluwxKeys {
} }
......
//
// Created by mo on 2018/8/16.
//
#import <Foundation/Foundation.h>
extern NSString *const SCHEMA_ASSETS;
extern NSString *const SCHMEA_HTTP;
extern NSString *const SCHMEA_HTTPS;
extern NSString *const SCHEMA_FILE;
@interface ImageSchema : NSObject
@end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import "ImageSchema.h"
NSString *const SCHEMA_ASSETS = @ "assets://";
NSString *const SCHMEA_HTTP = @"http://";
NSString *const SCHMEA_HTTPS = @"https://";
NSString *const SCHEMA_FILE = @"file://";
@implementation ImageSchema
@end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import <Foundation/Foundation.h>
#import "CallResults.h"
#import "WXApiRequestHandler.h"
#import "FluwxKeys.h"
#import "StringToWeChatScene.h"
#import "WXApi.h"
#import "FluwxMethods.h"
#import <Flutter/Flutter.h>
#import "FluwxPlugin.h"
@class StringUtil;
@interface FluwxShareHandler : NSObject
-(instancetype) initWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar;
- (void)handleShare:(FlutterMethodCall *)call result:(FlutterResult)result;
@end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import "FluwxShareHandler.h"
#import "ImageSchema.h"
#import "StringUtil.h"
@implementation FluwxShareHandler
NSObject <FlutterPluginRegistrar> *_registrar;
- (instancetype)initWithRegistrar:(NSObject <FlutterPluginRegistrar> *)registrar {
self = [super init];
if (self) {
_registrar = registrar;
}
return self;
}
- (void)handleShare:(FlutterMethodCall *)call result:(FlutterResult)result {
if (!isWeChatRegistered) {
result([FlutterError errorWithCode:resultErrorNeedWeChat message:resultMessageNeedWeChat details:nil]);
return;
}
if (![WXApi isWXAppInstalled]) {
result([FlutterError errorWithCode:@"wechat not installed" message:@"wechat not installed" details:nil]);
return;
}
if ([shareText isEqualToString:call.method]) {
[self shareText:call result:result];
} else if ([shareImage isEqualToString:call.method]) {
[self shareImage:call result:result];
} else if ([shareWebPage isEqualToString:call.method]) {
[self shareWebPage:call result:result];
}
}
- (void)shareText:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendText:text InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
}
- (void)shareImage:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *imagePath = call.arguments[fluwxKeyImage];
if ([imagePath hasPrefix:SCHEMA_ASSETS]) {
} else if ([imagePath hasPrefix:SCHEMA_FILE]) {
} else {
[self shareNetworkImage:call result:result imagePath:imagePath];
}
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendText:text InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
}
- (void)shareNetworkImage:(FlutterMethodCall *)call result:(FlutterResult)result imagePath:(NSString *)imagePath {
NSString *thumbnail = call.arguments[fluwxKeyThumbnail];
if ([StringUtil isBlank:thumbnail]) {
thumbnail = imagePath;
}
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
NSURL *imageURL = [NSURL URLWithString:imagePath];
//下载图片
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
NSData *thumbnailData;
UIImage *thumbnailImage;
if ([thumbnail hasPrefix:SCHEMA_ASSETS]) {
} else if ([thumbnail hasPrefix:SCHEMA_FILE]) {
} else {
NSURL *thumbnailURL = [NSURL URLWithString:thumbnail];
thumbnailData = [NSData dataWithContentsOfURL:thumbnailURL];
if ([thumbnailData length] > (32 * 1024)) {
} else {
thumbnailImage = [UIImage imageWithData:thumbnailData];
}
}
dispatch_async(dispatch_get_main_queue(), ^{
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendImageData:imageData
TagName:call.arguments[fluwxKeyMediaTagName]
MessageExt:fluwxKeyMessageExt
Action:fluwxKeyMessageAction
ThumbImage:thumbnailImage
InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
});
});
}
- (void)shareWebPage:(FlutterMethodCall *)call result:(FlutterResult)result {
NSString *webPageUrl = call.arguments[@"webPage"];
NSString *imagePath = call.arguments[fluwxKeyImage];
if ([imagePath hasPrefix:SCHEMA_ASSETS]) {
} else if ([imagePath hasPrefix:SCHEMA_FILE]) {
} else {
[self shareNetworkImage:call result:result imagePath:imagePath];
}
NSString *text = call.arguments[fluwxKeyText];
NSString *scene = call.arguments[fluwxKeyScene];
BOOL done = [WXApiRequestHandler sendText:text InScene:[StringToWeChatScene toScene:scene]];
result(@(done));
}
@end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import <Foundation/Foundation.h>
#import "ImageSchema.h"
#import "FluwxKeys.h"
@interface FlutterAssetHelper : NSObject @end
\ No newline at end of file
//
// Created by mo on 2018/8/16.
//
#import "FlutterAssetHelper.h"
@implementation FlutterAssetHelper
+ (NSString *)getPackageName:(NSString *)assetPath {
NSUInteger length = SCHEMA_ASSETS.length;
return @"";
}
+ (NSString *)getPath:(NSString *)assetPath {
NSUInteger schemaLength = SCHEMA_ASSETS.length;
NSUInteger totalLength = assetPath.length;
NSRange range = NSMakeRange(schemaLength, totalLength-schemaLength);
NSString *result = [assetPath substringWithRange:range];
if ([result rangeOfString:fluwxKeyPackage].location != NSNotFound) {
result = [result stringByReplacingCharactersInRange:<#(NSRange)range#> withString:<#(NSString *)replacement#>]
}
return result;
}
@end
\ No newline at end of file
...@@ -29,12 +29,15 @@ ...@@ -29,12 +29,15 @@
MessageExt:(NSString *)messageExt MessageExt:(NSString *)messageExt
Action:(NSString *)action Action:(NSString *)action
ThumbImage:(UIImage *)thumbImage ThumbImage:(UIImage *)thumbImage
InScene:(enum WXScene)scene { InScene:(enum WXScene)scene
title:(NSString *) title
description:(NSString *) description
{
WXImageObject *ext = [WXImageObject object]; WXImageObject *ext = [WXImageObject object];
ext.imageData = imageData; ext.imageData = imageData;
WXMediaMessage *message = [WXMediaMessage messageWithTitle:nil WXMediaMessage *message = [WXMediaMessage messageWithTitle:title
Description:nil Description:description
Object:ext Object:ext
MessageExt:messageExt MessageExt:messageExt
MessageAction:action MessageAction:action
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论