我是这种开发的新手。我正在Visual Studio 2017中为IOS开发Xamarin Forms。我工作的公司需要该应用程序将特定 URL 的 html 内容显示到 WebView 中。我这样做了,我测试了使用不同的网址来显示内容,但是在http url中使用IP时,它不会显示任何内容。像这样的东西(显然我用X替换了真正的Ip(:
http://XX.XX.XX.XX:9090/banking/initAppn1.start((
据我所知,出于安全原因,Apple 限制在 url 中使用 IP(最重要的是,如果应用程序将部署在商店中(,并且当使用像 http 这样的不安全协议时,文档指出:"从版本 9 开始,iOS 将只允许您的应用程序与默认情况下实现最佳实践安全性的服务器进行通信。必须在 Info.plist 中设置值,以便与不安全的服务器进行通信"。 为了使特定域能够绕过文档的 ATS 要求,我在 info.plist 中执行此操作:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>MinimumOSVersion</key>
<string>6.0</string>
<key>CFBundleDisplayName</key>
<string>TestMobile</string>
<key>CFBundleIdentifier</key>
<string>com.yourcompany.TestMobile</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleIconFiles</key>
<array>
<string>Icon-60@2x.png</string>
<string>Icon-76.png</string>
<string>Icon-76@2x.png</string>
<string>Default.png</string>
<string>Default@2x.png</string>
<string>Default-568h@2x.png</string>
<string>Default-Portrait.png</string>
<string>Default-Portrait@2x.png</string>
<string>Icon-Small-40.png</string>
<string>Icon-Small-40@2x.png</string>
<string>Icon-Small.png</string>
<string>Icon-Small@2x.png</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen.storyboard</string>
<key>CFBundleShortVersionString</key>
<string></string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>XXX.XX.XX.XX:9090</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
</dict>
</plist>
我什么都不显示!之后,我尝试删除域中的端口,仅使用IP地址,但我也不工作。
之后,我尝试允许这样的任意加载:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
什么都显示出来!
目前,出于基础结构原因,客户端不提供带有 IP 的 URL 的域名,但 IP 仅用于测试。
有人告诉我,他在 url 中使用 IP 开发了类似的应用程序,并且应用程序有效。
顺便说一下,在浏览器中使用 url 效果很好!
请需要您的帮助!谢谢
我找到了解决方案。一方面,如果应用程序将在应用商店中发布,则不得使用IP,因为它会因IPv6兼容性而被拒绝,这是我的情况,否则,它可以仅将IP用于内部分发。另一方面,通过使用不安全的URL(Http(,您必须将NSAppTransportSecurity与NSExceptionDomains配置到info.plist中,并且URL中没有端口,根据文档:https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html
所以,我使用了没有端口的域名和NSExceptionDomain,仅此而已,它奏效了。谢谢!
通过使用:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
您将禁用 ATS,它将在应用程序审核过程中拒绝您的应用程序,而无需提供有效的理由。
正如您所说,正确的方法是使用NSExceptionDomains字典,该字典填充了无法通过HTTPS协议访问的URL。 禁用 Web 视图的 ATS 的另一种方法是使用密钥:
NSAllowsArbitraryLoadsInWebContent
如果启用,则会禁用从 Web 视图发出的请求的所有 ATS 限制。这使你的应用可以使用可以显示任意内容的嵌入式浏览器,而无需为其他 URL 禁用 ATS。
参考
我上下搜索答案。 原来是高度和宽度要求
"与大多数其他 Xamarin.Forms 视图不同,WebView 要求在包含在 StackLayout 或 RelativeLayout 中时指定 HeightRequest 和 WidthRequest。如果无法指定这些属性,则 Web 视图将不会呈现。