【问题标题】:Cordova InAppBrowser stuck on loadingCordova InAppBrowser 卡在加载中
【发布时间】:2017-11-12 16:15:45
【问题描述】:

我正在尝试让 InAppBrowser 在我的 iOS 设备上显示托管在 Cordova Local Webserver 中的本地文件。 但是,它只是出现了一个空白页面,底部有“正在加载...”栏。

我已经四处寻找解决方案,但它们似乎都回到了白名单和内容安全策略,我已经分别包含在我的 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');

模式打开,但只有“正在加载...”栏显示完成和导航按钮。 (这也是在deviceready之后)

我也可以使用 Safari 检查实例,但似乎没有任何内容加载到实例上(关于:空白)。

我什至尝试过

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 “白名单”

cordova-plugin-inappbrowser 1.7.1 "InAppBrowser"

感谢您的帮助!

【问题讨论】:

    标签: ios cordova inappbrowser


    【解决方案1】:

    在调试这个并寻找一个多星期的答案后,我通过文档和插件代码找到了我的问题的解决方案:

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

    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 更改此流程的任何偏好,但上面的链接提供了一种解决方法。


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

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

    为了限制对您的应用程序的访问,请求被限制在本地主机上,并受到身份验证令牌的保护。 这应该有效地限制您的应用对服务器的访问。

    这方面的文档不是很详尽,但在我在 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"

    【讨论】:

    • 抱歉,我刚接触 ionic 和使用 Cordova 插件等。我遇到了和你完全相同的问题。要解决您的问题,您必须直接修改插件代码吗?这可以作为插件的 PR 提交吗?
    • @Andy 这是很久以前的事了,但根据我现在所了解的(更多)我当时遇到的问题,问题是 URL 已将查询参数传递给允许当前 webview 显示的 url。因此,我的解决方案是将相同的查询参数传递到新的 webview 以绕过 CSP 问题。希望有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多