Cordova - 内部超链接始终在Safari

时间:2016-06-16 18:02:32

标签: iphone cordova

我对Cordova很新,所以可能我不完全理解它的目的。让我从我想要实现的目标开始。

我们有一个拥有移动支持的asp.net网站,我基本上只是试图用iPhone应用程序包装。该站点当然在IIS服务器上运行,所以我只想要一个瘦的包装器来启动站点,并删除地址栏,导航等。我的理解是你可以通过Cordova混合方法实现这一点。

我按照教程,让网站在xCode iPhone模拟器中启动,它就像我想要的那样出现。

我遇到的问题是网站中的超链接在Safari浏览器中启动目标页面。从我的所有谷歌搜索,似乎这是大多数人的相反问题。似乎大多数人都在与应用程序内部打开的外部网站斗争,这基本上将他们锁定在应用程序之外。我只是想在应用程序中从我自己的网站上的Page1转到Page2。

我能用最简单的网站重现这个问题,所以我会发布相关的比特。在此示例中,单击“第2页”将在Safari中打开。

Asp.net网站:

Page1.html

<html>
    <a href="page2.html">Page 2</a>
</html>

Page2.html

<html>
    Page 2
</html>

科尔多瓦:

的index.html

<!DOCTYPE html>
<html>
    <head>
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    </head>
    <body>
        Cordova site
    </body>
    <script>
        window.location = "http://192.168.1.157:8081/Page1.html";
    </script>
</html>

config.xml中

<?xml version='1.0' encoding='utf-8'?>
<widget id="vsisolutions.testsite" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>Test Site</name>
    <description>
        A sample Apache Cordova application that responds to the deviceready event.
    </description>
    <author email="dev@cordova.apache.org" href="http://cordova.io">
        Apache Cordova Team
    </author>
    <content src="index.html" />
    <plugin name="cordova-plugin-whitelist" spec="1" />
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <allow-navigation href="http://192.168.1.157:8081/*" />
    <allow-navigation href="*" />
    <platform name="android">
        <allow-intent href="market:*" />
    </platform>
    <platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
    </platform>
    <engine name="ios" spec="~4.1.1" />
    <plugin name="com.msopentech.authdialog" spec="~0.1.6" />
</widget>

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

我发现在Cordova中,WKWebView插件(也可能出现在UIWebView中)询问任何其他插件,看看他们是否可以在链接上使用URL。这是由CDVIntentAndNavigationFilter选择并运行逻辑,如:

- (BOOL)shouldOverrideLoadWithRequest:(NSURLRequest*)request navigationType:    (UIWebViewNavigationType)navigationType
{
   NSURL* url = [request URL];

 switch (navigationType) {
    case UIWebViewNavigationTypeLinkClicked:
        // Note that the rejection strings will *only* print if
        // it's a link click (and url is not whitelisted by <allow-*>)
        if ([self.allowIntentsWhitelist URLIsAllowed:url]) {
            // the url *is* in a <allow-intent> tag, push to the system
            [[UIApplication sharedApplication] openURL:url];
            return NO;
        }
        // fall through, to check whether you can load this in the webview
    default:
        // check whether we can internally navigate to this url
        return ([self.allowNavigationsWhitelist URLIsAllowed:url]);
    }
}

因为navigationType == UIWebViewNavigationTypeLinkClicked它通过[[UIApplication sharedApplication] openURL:url]传递给浏览器;

目前我只是发现了一个黑客,这是通过以相同的方式处理链接来覆盖这种逻辑,如下所示:

switch (navigationType) {
  case UIWebViewNavigationTypeLinkClicked:
    // Note that the rejection strings will *only* print if
    // it's a link click (and url is not whitelisted by <allow-*>)
    if ([self.allowIntentsWhitelist URLIsAllowed:url]) {
        // the url *is* in a <allow-intent> tag, push to the system
       // [[UIApplication sharedApplication] openURL:url];
        return YES;
    }
    // fall through, to check whether you can load this in the webview
  default:
    // check whether we can internally navigate to this url
    return ([self.allowNavigationsWhitelist URLIsAllowed:url]);
    }
}

这显然不太理想,我会在Cordova论坛上询问一个更好的解决方案,一旦找到它我就会在这里发布。

答案 1 :(得分:2)

这是a bug

已修复latest released version of cordova-ios 4.2.0

因此,您不必再进行任何操作,只需使用allow-navigation标记设置您希望允许在应用内导航的网址,其余部分将会在Safari中打开,因为您为所有http和https网址设置了allow-intent

答案 2 :(得分:0)

<a href="page2.html" target="_blank">Page 2</a>

这应该有用。

答案 3 :(得分:0)

只需将In[60]: df['new_datetime'] = pd.to_datetime(df['datetime'], format='%Y-%j %H:%M:%S') df Out[60]: datetime new_datetime 0 2018-24 7:10:0 2018-01-24 07:10:00 1 2018-8 12:1:20 2018-01-08 12:01:20 2 2018-44 13:55:19 2018-02-13 13:55:19 更改为附加filteredQuestions = checklistItem.map { ChecklistItemSection(named: $0.name, checklistItems: $0.checklistItems.filter { $0.showVehicle && !$0.showTrailer }) } // Add the next line if you want to remove sections without questions // .filter { $0.checkListItems.count > 0 } 即可:

allow-navigation