Невозможно загрузить локальный HTML-файл в WKWebView только на устройстве (работает на симуляторе) - PullRequest
1 голос
/ 17 октября 2019

Локальный код ниже загружает в WKWebView локальный HTML-файл (из контейнера приложения, а не из пакета приложения).

- (void)loadIndexConteneurWithHash:(NSString *)hash
{
    NSString *fileName = @"index.html";
    NSString *subpath = hash ? [NSString stringWithFormat:@"%@#%@", fileName, hash] : fileName;
    NSString *rootContainerDirectoryPath = [NSFileUtility pathRelativeToContentDirectoryForSubpath:@"/www/v2"];

    NSURL *URL = [NSURL URLWithString:subpath relativeToURL:[NSURL fileURLWithPath:rootContainerDirectoryPath]];

    [[NSURLCache sharedURLCache] removeAllCachedResponses];

    [self.webView loadFileURL:URL allowingReadAccessToURL:URL];



    // This below has the same effect (works on simulator and not on device)

    // NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f];

    // [self.webView performSelectorOnMainThread:@selector(loadRequest:) withObject:request waitUntilDone:true];
}

URL-адрес файла на устройстве: file:///var/mobile/Containers/Data/Application/3CF58895-866D-400A-B0E0-4CA98BF143F7/Library/Application%20Support/<my.app.id>/LocalContents/www/v2/indexConteneur.html

И на симуляторе: file:///Users/<me>/Library/Developer/CoreSimulator/Devices/4A5B9713-6589-4DCA-ABBD-F4FF1246AE43/data/Containers/Data/Application/717B54FD-1344-41D3-8B53-FC0767FFE892/Library/Application%20Support/<my.app.id>/LocalContents/www/v2/indexConteneur.html

Этот код отлично работает на любом симуляторе, который я пробовал ( ios 12 / ios 13).

Однако он не загружает файл HTML на устройство. Когда я использую отладчик Safari, я вижу, что веб-просмотр включен "about: blank".

У меня нет ошибок во время выполнения, просто кажется, что он прекращает выполнение loadFileURL в автоматическом режиме.

Что я мог сделать, чтобы решить / исследовать эту проблему?

EDIT 1

Ни didFailNavigation, ни didFinishNavigation не вызываются на устройстве ...

EDIT 2

Добавление этого кода:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSLog(@"%@ exists? %d",URL.absoluteString,[fileManager fileExistsAtPath:URL.absoluteString]);

дает это на устройстве: 2019-10-17 18:42:48.955588+0200 gall-app[881:230671] /var/mobile/Containers/Data/Application/3CF58895-866D-400A-B0E0-4CA98BF143F7/Library/Application%20Support/<my.app.id>/LocalContents/www/v2/indexConteneur.html exists? 1

Таким образом, он существует в ожидаемом месте. Я также загрузил контейнер приложения с устройства с XCode и вижу файл, где он должен быть.

EDIT 3

После дальнейшего тестирования кажется, что [self.webView loadFileURL:... не работаетна ios 12 (симулятор включен), но работает на ios 13 ...

Возможно, между ними есть какое-то различие в правилах безопасности?

В моем info.plist у меня есть:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

И мое веб-представление инициализируется с помощью этого кода:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.webView.UIDelegate = self;
    self.webView.navigationDelegate = self;

    self.webView.configuration.preferences.javaScriptEnabled = YES;
    self.webView.configuration.preferences.javaScriptCanOpenWindowsAutomatically = YES;

    [self.webView.configuration.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];
    [self.webView.configuration setValue:@YES forKey:@"allowUniversalAccessFromFileURLs"];

    [self addUserScriptToUserContentController:self.webView.configuration.userContentController];

1 Ответ

2 голосов
/ 18 октября 2019

ОК, я нашел, «почему» это не работает. Я изменил это:

[self.webView loadFileURL:URL allowingReadAccessToURL:URL];

на это:

[self.webView loadFileURL:URL.absoluteURL allowingReadAccessToURL:rootAppURL];

с rootAppURL, равным:

NSString *rootappPath = [NSFileUtility pathRelativeToContentDirectoryForSubpath:@"/www"];
NSURL *rootAppURL = [NSURL fileURLWithPath:rootappPath isDirectory:YES];

И теперь он работает на ios <13 </p>

...