Skip to content

Commit 812f1b8

Browse files
author
Andrei Bosco
committed
Applying changes by flutter#1247 and adapting them to work with webview_flutter 0.3.9 (iOS code: not tested)
1 parent eb95686 commit 812f1b8

File tree

3 files changed

+45
-11
lines changed

3 files changed

+45
-11
lines changed

packages/webview_flutter/ios/Classes/FlutterWebView.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ NS_ASSUME_NONNULL_BEGIN
1212
- (instancetype)initWithFrame:(CGRect)frame
1313
viewIdentifier:(int64_t)viewId
1414
arguments:(id _Nullable)args
15-
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger;
15+
registrar:(NSObject<FlutterPluginRegistrar>*)registrar;
1616

1717
- (UIView*)view;
1818
@end
1919

2020
@interface FLTWebViewFactory : NSObject <FlutterPlatformViewFactory>
21-
- (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger;
21+
- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar;
2222
@end
2323

2424
NS_ASSUME_NONNULL_END

packages/webview_flutter/ios/Classes/FlutterWebView.m

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
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) {

packages/webview_flutter/ios/Classes/WebViewFlutterPlugin.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
@implementation FLTWebViewFlutterPlugin
66

77
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
8-
FLTWebViewFactory* webviewFactory =
9-
[[FLTWebViewFactory alloc] initWithMessenger:registrar.messenger];
8+
FLTWebViewFactory* webviewFactory = [[FLTWebViewFactory alloc] initWithRegistrar:registrar];
109
[registrar registerViewFactory:webviewFactory withId:@"plugins.flutter.io/webview"];
1110
[FLTCookieManager registerWithRegistrar:registrar];
1211
}

0 commit comments

Comments
 (0)