Flutter

Flutter (半年开发经验)- iOS原生导航栏、iOS主动

2019-12-05  本文已影响0人  吃货_X

AppDelegate.m

/** iOS原生导航栏 */
FlutterViewController *controller = (FlutterViewController *)self.window.rootViewController;
///原生导航栏
ExpressNavigationController *nav = [[ExpressNavigationController alloc ]initWithRootViewController:controller];
 self.window.rootViewController = nav;
 [self.window makeKeyAndVisible];
///隐藏原生导航栏,因为要使用Flutter的导航栏。
 [controller.navigationController setNavigationBarHidden:YES animated:YES];

/** iOS主动通知Flutter -注册通知 */
[XlbPlugin registerWithRegistrar:[controller registrarForPlugin:@"XlbPlugin"]];
 [GeneratedPluginRegistrant registerWithRegistry:controller];

FlutterPlugin.h

#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>

@interface XlbPlugin : NSObject<FlutterPlugin>

/** 发送信息 */
+ (void)sendMessage:(NSDictionary *)dic;

/** 处理OpenURL */
+ (void)handleOpenURL:(NSURL*)url;

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar;

@end

FlutterPlugin.m

#import "XlbPlugin.h"


__weak XlbPlugin* __XlbPlugin;

@interface XlbPlugin()

@property (copy,nonatomic) FlutterBasicMessageChannel *channel;

@end
@implementation XlbPlugin


-(id)init{
    if(self = [super init]){
        __XlbPlugin  = self;
    }
    return self;
}

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar{
    FlutterBasicMessageChannel *basicMessage_channel = [FlutterBasicMessageChannel messageChannelWithName:@"XlbBasicMessage_Plugin" binaryMessenger:[registrar messenger]];
    FlutterMethodChannel *method_Channel = [FlutterMethodChannel
                                     methodChannelWithName:@"XlbMethod_Plugin"
                                     binaryMessenger:[registrar messenger]];
    XlbPlugin *instance = [[XlbPlugin alloc] init];
    [registrar addMethodCallDelegate:instance channel:method_Channel];
    [__XlbPlugin channelSet:basicMessage_channel];
}
//MARK: - Getter/Setter
- (void)channelSet:(FlutterBasicMessageChannel *)channel{
    _channel = channel;
}

+ (void)sendMessage:(NSDictionary *)dic{
    [__XlbPlugin sendMessage:dic];
}

+ (void)handleOpenURL:(NSURL*)url{
    [__XlbPlugin openUrl:url];
}

- (void)sendMessage:(NSDictionary *)dic{
    [self.channel sendMessage:dic];
}
- (void)openUrl:(NSURL *)url{
    [self.channel sendMessage:[NSString stringWithFormat:@"%@",url]];
}

最新微信SDK处理-universalLink配置网上一大堆

//最新微信需要配置universalLink,配置后微信打开APP走的下面方法。未配置走的openapplication:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler{
    ///第三方插件也是通过这个方法处理URL
   [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
    NSURL *url = userActivity.webpageURL;
    NSString *path = url.path;
  //这儿处理的是分享链接的。
    if ([path rangeOfString:appid].location != NSNotFound) {
        [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
    }
    if ([path rangeOfString:@"share"].location != NSNotFound) {
        NSDictionary *dic = @{@"share":[self diwWithUrl:userActivity.webpageURL.absoluteString],@"key":@"share"};
        ///发消息给Flutter
        [XlbPlugin sendMessage:dic];
        ///APP重新打开的情况下,发通知给Flutter。Flutter不会及时处理,需要在APP打开后通过粘贴板处理链接。
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        pasteboard.string = url.absoluteString;
    }
    return YES;
}

处理Flutter通知原生-图片压缩(需要image_Picker)

FlutterMethodChannel *shareChannel = [FlutterMethodChannel methodChannelWithName:@"NativeCode" binaryMessenger:controller];
    [shareChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult  _Nonnull result) {
      
      ///使用原生导航栏-跳转原生界面
      if ([call.method isEqualToString:@"Webview"]){
            ScanWebViewController *webView = [[ScanWebViewController alloc]init];
            webView.webUrl = call.arguments;
            webView.hidesBottomBarWhenPushed = YES;
            ///原生导航栏 ExpressNavigationController *nav = [[ExpressNavigationController alloc ]initWithRootViewController:controller];
            [nav pushViewController:webView animated:YES];
        }
        if ([call.method isEqualToString:@"imageEdit"]){
            //原图地址
            NSString *originalImageFile = call.arguments;
            NSData *originalImageData = [NSData dataWithContentsOfFile:originalImageFile];
            UIImage *originalImage = [UIImage imageWithData:originalImageData];
            CGFloat soriginalKB = originalImageData.length / 1024.0;
            NSLog(@"原图地址:%@,图片大小:%.2fKB",originalImageFile,soriginalKB);
            if (soriginalKB < 500){
                result(originalImageFile);
            } else{
                //处理后图片
                NSData *imageDate = [NetworkingRequest reSizeImageData:originalImage maxImageSize:0 maxSizeWithKB:500];
                UIImage *editImage = [UIImage imageWithData:imageDate];
                ///用imagePicker保存图片,返回路径
                NSString *imagePath = [FLTImagePickerPhotoAssetUtil saveImageWithOriginalImageData:originalImageData image:editImage maxWidth:[NSNumber numberWithFloat:originalImage.size.width] maxHeight:[NSNumber numberWithFloat:originalImage.size.height] imageQuality:[NSNumber numberWithInt:1]];
                //处理后图片大小
                CGFloat sizeOriginKB = imageDate.length / 1024.0;
                NSLog(@"现图地址:%@,图片大小:%.2fKB",imagePath,sizeOriginKB);
                result(imagePath);
            }
        }
    }];

Flutter端处理

static const BasicMessageChannel<dynamic> iosMessage =
const BasicMessageChannel(
"XlbBasicMessageNSDictionary_Plugin", StandardMessageCodec());

@override
void initState() {
super.initState();
iosMessage.setMessageHandler((dynamic value) {
print('收到iOS原生消息:' + value.toString());
//我原生传过来的是NSDictionary,所以Flutter用Map接收
Map dic = value;
});
}
上一篇下一篇

猜你喜欢

热点阅读