Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Closed
Prev Previous commit
Next Next commit
Update FlutterWebView.m
  • Loading branch information
Wian-TMC authored Jan 28, 2021
commit 4df38792f744d1ed026a1ae06fcc709888eda2bf
94 changes: 89 additions & 5 deletions packages/webview_flutter/ios/Classes/FlutterWebView.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@

@implementation FLTWebViewFactory {
NSObject<FlutterBinaryMessenger>* _messenger;
NSObject<FlutterPluginRegistrar>* _registrar;
}

- (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
- (instancetype)initWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
self = [super init];
if (self) {
_messenger = messenger;
_registrar = registrar;
_messenger = registrar.messenger;
}
return self;
}
Expand All @@ -28,7 +30,7 @@ - (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
FLTWebViewController* webviewController = [[FLTWebViewController alloc] initWithFrame:frame
viewIdentifier:viewId
arguments:args
binaryMessenger:_messenger];
registrar:_registrar];
return webviewController;
}

Expand Down Expand Up @@ -64,17 +66,20 @@ @implementation FLTWebViewController {
// The set of registered JavaScript channel names.
NSMutableSet* _javaScriptChannelNames;
FLTWKNavigationDelegate* _navigationDelegate;
NSObject<FlutterPluginRegistrar>* _registrar;
}

- (instancetype)initWithFrame:(CGRect)frame
viewIdentifier:(int64_t)viewId
arguments:(id _Nullable)args
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
registrar:(nonnull NSObject<FlutterPluginRegistrar>*)registrar {
if (self = [super init]) {
_viewId = viewId;

_registrar = registrar;
NSString* channelName = [NSString stringWithFormat:@"plugins.flutter.io/webview_%lld", viewId];
_channel = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:messenger];
_channel = [FlutterMethodChannel methodChannelWithName:channelName
binaryMessenger:_registrar.messenger];
_javaScriptChannelNames = [[NSMutableSet alloc] init];

WKUserContentController* userContentController = [[WKUserContentController alloc] init];
Expand Down Expand Up @@ -128,6 +133,10 @@ - (void)onMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
[self onUpdateSettings:call result:result];
} else if ([[call method] isEqualToString:@"loadUrl"]) {
[self onLoadUrl:call result:result];
} else if ([[call method] isEqualToString:@"loadAssetHtmlFile"]) {
[self onLoadAssetHtmlFile:call result:result];
} else if ([[call method] isEqualToString:@"loadLocalHtmlFile"]) {
[self onLoadLocalHtmlFile:call result:result];
} else if ([[call method] isEqualToString:@"canGoBack"]) {
[self onCanGoBack:call result:result];
} else if ([[call method] isEqualToString:@"canGoForward"]) {
Expand Down Expand Up @@ -183,6 +192,29 @@ - (void)onLoadUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
}
}

- (void)onLoadAssetHtmlFile:(FlutterMethodCall*)call result:(FlutterResult)result {
NSString* url = [call arguments];
if (![self loadAssetHtmlFile:url]) {
result([FlutterError errorWithCode:@"loadAssetHtmlFile_failed"
message:@"Failed parsing the URL"
details:[NSString stringWithFormat:@"URL was: '%@'", url]]);
} else {
result(nil);
}
}

- (void)onLoadLocalHtmlFile:(FlutterMethodCall*)call result:(FlutterResult)result {
NSString* url = [call arguments];
if (![self loadLocalHtmlFile:url]) {
result([FlutterError errorWithCode:@"loadAssetHtmlFile_failed"
message:@"Failed parsing the URL"
details:[NSString stringWithFormat:@"URL was: '%@'", url]]);
} else {
result(nil);
}
}


- (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result {
BOOL canGoBack = [_webView canGoBack];
result([NSNumber numberWithBool:canGoBack]);
Expand Down Expand Up @@ -415,6 +447,58 @@ - (bool)loadUrl:(NSString*)url withHeaders:(NSDictionary<NSString*, NSString*>*)
return true;
}

- (bool)loadAssetHtmlFile:(NSString*)url {
NSArray* array = [url componentsSeparatedByString:@"?"];
NSString* pathString = [array objectAtIndex:0];
NSLog(@"%@%@", @"pathString: ", pathString);
NSString* key = [_registrar lookupKeyForAsset:pathString];
NSURL* baseURL = [[NSBundle mainBundle] URLForResource:key withExtension:nil];
if (!baseURL) {
return false;
}
NSURL* newUrl = baseURL;
if ([array count] > 1) {
NSString* queryString = [array objectAtIndex:1];
NSLog(@"%@%@", @"queryString: ", queryString);
NSString* queryPart = [NSString stringWithFormat:@"%@%@", @"?", queryString];
NSLog(@"%@%@", @"queryPart: ", queryPart);
newUrl = [NSURL URLWithString:queryPart relativeToURL:baseURL];
}
if (@available(iOS 9.0, *)) {
[_webView loadFileURL:newUrl allowingReadAccessToURL:[NSURL URLWithString:@"file:///"]];
} else {
return false;
}
return true;
}

- (bool)loadLocalHtmlFile:(NSString*)url {
NSArray* array = [url componentsSeparatedByString:@"?"];
NSString* pathString = [array objectAtIndex:0];
NSLog(@"%@%@", @"pathString: ", pathString);
NSString* key = [_registrar lookupKeyForAsset:pathString];
NSURL* baseURL = [[NSBundle mainBundle] URLForResource:key withExtension:nil];
if (!baseURL) {
[_webView loadFileURL:[NSURL fileURLWithPath:pathString]
allowingReadAccessToURL:[NSURL fileURLWithPath:pathString]];
return true;
}
NSURL* newUrl = baseURL;
if ([array count] > 1) {
NSString* queryString = [array objectAtIndex:1];
NSLog(@"%@%@", @"queryString: ", queryString);
NSString* queryPart = [NSString stringWithFormat:@"%@%@", @"?", queryString];
NSLog(@"%@%@", @"queryPart: ", queryPart);
newUrl = [NSURL URLWithString:queryPart relativeToURL:baseURL];
}
if (@available(iOS 9.0, *)) {
[_webView loadFileURL:newUrl allowingReadAccessToURL:[NSURL URLWithString:@"file:///"]];
} else {
return false;
}
return true;
}

- (void)registerJavaScriptChannels:(NSSet*)channelNames
controller:(WKUserContentController*)userContentController {
for (NSString* channelName in channelNames) {
Expand Down