77#import " JavaScriptChannelHandler.h"
88
99@implementation FLTWebViewFactory {
10- NSObject <FlutterBinaryMessenger >* _messenger ;
10+ NSObject <FlutterPluginRegistrar >* _registrar ;
1111}
1212
13- - (instancetype )initWithMessenger : (NSObject <FlutterBinaryMessenger >*)messenger {
13+ - (instancetype )initWithRegistrar : (NSObject <FlutterPluginRegistrar >*)registrar {
1414 self = [super init ];
1515 if (self) {
16- _messenger = messenger;
16+ _registrar = registrar;
17+ _messenger = registrar.messenger ;
1718 }
1819 return self;
1920}
@@ -28,7 +29,7 @@ - (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
2829 FLTWebViewController* webviewController = [[FLTWebViewController alloc ] initWithFrame: frame
2930 viewIdentifier: viewId
3031 arguments: args
31- binaryMessenger: _messenger ];
32+ registrar: _registrar ];
3233 return webviewController;
3334}
3435
@@ -42,17 +43,20 @@ @implementation FLTWebViewController {
4243 // The set of registered JavaScript channel names.
4344 NSMutableSet * _javaScriptChannelNames;
4445 FLTWKNavigationDelegate* _navigationDelegate;
46+ NSObject <FlutterPluginRegistrar>* _registrar;
4547}
4648
4749- (instancetype )initWithFrame : (CGRect)frame
4850 viewIdentifier : (int64_t )viewId
4951 arguments : (id _Nullable)args
50- binaryMessenger : (NSObject <FlutterBinaryMessenger >*)messenger {
52+ registrar : (NSObject <FlutterPluginRegistrar >*)registrar {
5153 if ([super init ]) {
5254 _viewId = viewId;
55+ _registrar = registrar;
5356
5457 NSString * channelName = [NSString stringWithFormat: @" plugins.flutter.io/webview_%lld " , viewId];
55- _channel = [FlutterMethodChannel methodChannelWithName: channelName binaryMessenger: messenger];
58+ _channel = [FlutterMethodChannel methodChannelWithName: channelName
59+ binaryMessenger: registrar.messenger];
5660 _javaScriptChannelNames = [[NSMutableSet alloc ] init ];
5761
5862 WKUserContentController * userContentController = [[WKUserContentController alloc ] init ];
@@ -77,7 +81,11 @@ - (instancetype)initWithFrame:(CGRect)frame
7781
7882 NSString * initialUrl = args[@" initialUrl" ];
7983 if ([initialUrl isKindOfClass: [NSString class ]]) {
80- [self loadUrl: initialUrl];
84+ if ([initialUrl rangeOfString: @" ://" ].location == NSNotFound ) {
85+ [self loadAssetFile: initialUrl];
86+ } else {
87+ [self loadUrl: initialUrl];
88+ }
8189 }
8290 }
8391 return self;
@@ -92,6 +100,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
92100 [self onUpdateSettings: call result: result];
93101 } else if ([[call method ] isEqualToString: @" loadUrl" ]) {
94102 [self onLoadUrl: call result: result];
103+ } else if ([[call method ] isEqualToString: @" loadAssetFile" ]) {
104+ [self onLoadAssetFile: call result: result];
95105 } else if ([[call method ] isEqualToString: @" canGoBack" ]) {
96106 [self onCanGoBack: call result: result];
97107 } else if ([[call method ] isEqualToString: @" canGoForward" ]) {
@@ -133,6 +143,17 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
133143 }
134144}
135145
146+ - (void )onLoadAssetFile : (FlutterMethodCall*)call result : (FlutterResult)result {
147+ NSString * url = [call arguments ];
148+ if (![self loadAssetFile: url]) {
149+ result ([FlutterError errorWithCode: @" loadAssetFile_failed"
150+ message: @" Failed parsing the URL"
151+ details: [NSString stringWithFormat: @" URL was: '%@ '" , url]]);
152+ } else {
153+ result (nil );
154+ }
155+ }
156+
136157- (void )onCanGoBack : (FlutterMethodCall*)call result : (FlutterResult)result {
137158 BOOL canGoBack = [_webView canGoBack ];
138159 result ([NSNumber numberWithBool: canGoBack]);
@@ -289,6 +310,20 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
289310 return true ;
290311}
291312
313+ - (bool )loadAssetFile : (NSString *)url {
314+ NSString * key = [_registrar lookupKeyForAsset: url];
315+ NSURL * nsUrl = [[NSBundle mainBundle ] URLForResource: key withExtension: nil ];
316+ if (!nsUrl) {
317+ return false ;
318+ }
319+ if (@available (iOS 9.0 , *)) {
320+ [_webView loadFileURL: nsUrl allowingReadAccessToURL: [NSURL URLWithString: @" file:///" ]];
321+ } else {
322+ return false ;
323+ }
324+ return true ;
325+ }
326+
292327- (void )registerJavaScriptChannels : (NSSet *)channelNames
293328 controller : (WKUserContentController *)userContentController {
294329 for (NSString * channelName in channelNames) {
0 commit comments