Cordova InAppBrowser 卡在加载中

Cordova InAppBrowser stuck on loading

我试图让 InAppBrowser 在我的 iOS 设备上显示托管在 Cordova Local Webserver 中的本地文件。 然而,它只是出现了一个空白页面,底部有 "Loading..." 栏。

我四处寻找解决方案,但它们似乎都回到了白名单和内容安全策略,我已经分别将其包含在我的 config.xml 和 index.html 中。

config.xml

...
<access origin="*" />
<allow-intent href="*" />
<allow-navigation href="*" />
....

index.html

...
<meta http-equiv="Content-Security-Policy" content="default-src * gap://ready file:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.gstatic.com https://*.googleapis.com;">
...

我尝试使用

打开文件
// url is "http://localhost:8080/local-filesystem/Users/<user>/Library/Developer/CoreSimulator/Devices/E22F3966-CA8B-43E4-890B-EB078C437F54/data/Containers/Data/Application/146AFBF3-5CFF-47D1-9D51-85CFC5676761/Documents/NoCloud/Download/00P1J00000UGDF9UAP_test.pdf"
cordova.InAppBrowser.open(url, '_blank', 'location=yes');

模式打开,但只有 "Loading..." 栏显示完成和导航按钮。 (这也是deviceready之后的全部)

我也可以使用 Safari 检查实例,但实例似乎没有加载任何内容(about:blank)。

我什至尝试过

cordova.InAppBrowser.open('http://google.com', '_blank', 'location=yes');

这也卡在加载中。

如果我使用“_self”而不是“_blank”,所有内容都会加载,但它会接管我应用程序的 Cordova Webview 实例,这不是我想要的。使用“_system”打开系统浏览器,但不允许我显示来自 Cordova 本地 Web 服务器的文件。

任何人都可以指出我在 iOS 上使用 InAppBrowser 通过模态显示我的本地文件或网页的正确方向吗?

我正在使用:

科尔多瓦 7.0.1

cordova-plugin-whitelist 1.0.0 "Whitelist"

cordova-plugin-inappbrowser 1.7.1 "InAppBrowser"

感谢您的帮助!

经过一周多的调试和寻找答案后,我通过文档和插件代码找到了解决问题的方法:

首先,要显示任何网页,我从这个问题中找到了与该用户相同的解决方案:

why does inAppBrowser open a blank new webview which i cant close

+ (void)acquireLock:(void (^)(NSInteger lockToken))block
{
if (gCurrentLockToken == 0) {
    gCurrentLockToken = ++gNextLockToken;
    VerboseLog(@"Gave lock %d", gCurrentLockToken);
    block(gCurrentLockToken);
} else {
    if (gPendingSetUserAgentBlocks == nil) {
        gPendingSetUserAgentBlocks = [[NSMutableArray alloc] initWithCapacity:4];
    }
    VerboseLog(@"Waiting for lock");
    [gPendingSetUserAgentBlocks addObject:block];
}
}

gCurrentLockToken 已经是来自应用程序实例的 1,因此 InAppBrowser 从未加载 url。我找不到 Cordova config.xml 的任何首选项来更改此流程,但上面的 link 提供了一种解决方法。


其次,要在 Cordova 本地 Web 服务器中显示文件,我必须遵循文档:

https://www.npmjs.com/package/local-webserver

In order to limit access to your app, requests are restricted to localhost and are protected with an auth token. This should effectively restrict access to the server to your app.

这方面的文档不是很详尽,但在我的 iOS 中的 Cordova 应用程序中,身份验证令牌作为参数传递到应用程序的 url document.location.search 中。所以我的 JS 归结为:

cordova.InAppBrowser.open(url + document.location.search, '_blank', 'location=yes'); 

我还从其插件代码中删除了 InAppBrowser 的 pdf 检查逻辑以消除其控制台输出,并且它按预期工作

cordova-plugin-inappbrowser 1.7.1 "InAppBrowser"