7
7
#import " JavaScriptChannelHandler.h"
8
8
9
9
@implementation FLTWebViewFactory {
10
- NSObject <FlutterBinaryMessenger >* _messenger ;
10
+ NSObject <FlutterPluginRegistrar >* _registrar ;
11
11
}
12
12
13
- - (instancetype )initWithMessenger : (NSObject <FlutterBinaryMessenger >*)messenger {
13
+ - (instancetype )initWithRegistrar : (NSObject <FlutterPluginRegistrar >*)registrar {
14
14
self = [super init ];
15
15
if (self) {
16
- _messenger = messenger;
16
+ _registrar = registrar;
17
+ _messenger = registrar.messenger ;
17
18
}
18
19
return self;
19
20
}
@@ -28,7 +29,7 @@ - (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
28
29
FLTWebViewController* webviewController = [[FLTWebViewController alloc ] initWithFrame: frame
29
30
viewIdentifier: viewId
30
31
arguments: args
31
- binaryMessenger: _messenger ];
32
+ registrar: _registrar ];
32
33
return webviewController;
33
34
}
34
35
@@ -42,17 +43,20 @@ @implementation FLTWebViewController {
42
43
// The set of registered JavaScript channel names.
43
44
NSMutableSet * _javaScriptChannelNames;
44
45
FLTWKNavigationDelegate* _navigationDelegate;
46
+ NSObject <FlutterPluginRegistrar>* _registrar;
45
47
}
46
48
47
49
- (instancetype )initWithFrame : (CGRect )frame
48
50
viewIdentifier : (int64_t )viewId
49
51
arguments : (id _Nullable)args
50
- binaryMessenger : (NSObject <FlutterBinaryMessenger >*)messenger {
52
+ registrar : (NSObject <FlutterPluginRegistrar >*)registrar {
51
53
if ([super init ]) {
52
54
_viewId = viewId;
55
+ _registrar = registrar;
53
56
54
57
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];
56
60
_javaScriptChannelNames = [[NSMutableSet alloc ] init ];
57
61
58
62
WKUserContentController * userContentController = [[WKUserContentController alloc ] init ];
@@ -77,7 +81,11 @@ - (instancetype)initWithFrame:(CGRect)frame
77
81
78
82
NSString * initialUrl = args[@" initialUrl" ];
79
83
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
+ }
81
89
}
82
90
}
83
91
return self;
@@ -92,6 +100,8 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
92
100
[self onUpdateSettings: call result: result];
93
101
} else if ([[call method ] isEqualToString: @" loadUrl" ]) {
94
102
[self onLoadUrl: call result: result];
103
+ } else if ([[call method ] isEqualToString: @" loadAssetFile" ]) {
104
+ [self onLoadAssetFile: call result: result];
95
105
} else if ([[call method ] isEqualToString: @" canGoBack" ]) {
96
106
[self onCanGoBack: call result: result];
97
107
} else if ([[call method ] isEqualToString: @" canGoForward" ]) {
@@ -133,6 +143,17 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
133
143
}
134
144
}
135
145
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
+
136
157
- (void )onCanGoBack : (FlutterMethodCall*)call result : (FlutterResult)result {
137
158
BOOL canGoBack = [_webView canGoBack ];
138
159
result ([NSNumber numberWithBool: canGoBack]);
@@ -289,6 +310,20 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
289
310
return true ;
290
311
}
291
312
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
+
292
327
- (void )registerJavaScriptChannels : (NSSet *)channelNames
293
328
controller : (WKUserContentController *)userContentController {
294
329
for (NSString * channelName in channelNames) {
0 commit comments