我是这种发展的新手。我正在Visual Studio 2017中为IOS开发Xamarin表单。公司我的工作需要应用程序将特定URL的html内容显示到WebView中。我这样做了,我测试了使用不同的网址,显示内容很好,但是当在http网址中使用IP时,它并没有显示任何内容。像这样的东西(显然我用X&#39替换了真正的Ip):
http://XX.XX.XX.XX:9090/banking/initAppn1.start()
据我所知,出于安全原因,Apple限制在网址中使用IP(最重要的是如果app将在商店中部署),并且当使用不安全的协议(如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仅用于测试。
有人告诉我,他在网址和应用程序中使用IP开发了类似的应用程序。
顺便说一句,在浏览器中使用url工作得很完美!
请你帮忙!感谢
答案 0 :(得分:0)
我找到了解决方案。一方面,如果应用程序将在应用程序商店中发布,则不得使用IP,因为它会因IPv6兼容而被拒绝,这是我的情况,否则,它只能用于内部分发。另一方面,通过使用不安全的URL(Http),您必须将带有NSExceptionDomains的NSAppTransportSecurity配置到info.plist中,URL中没有端口,如文档所述:https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html
所以,我使用的域名没有端口和NSExceptionDomains,而且这一切都有效。谢谢!
答案 1 :(得分:0)
使用:
Initialize()
您将禁用ATS,它会在App Review过程中拒绝您的申请,但没有合理的理由。
正如您所说,正确的方法是使用填充了无法通过HTTPS协议访问的URL的NSExceptionDomains字典。 禁用Web视图的ATS的另一种方法是使用密钥:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果启用,则禁用对Web视图发出的请求的所有ATS限制。这使您的应用程序可以使用可以显示任意内容的嵌入式浏览器,而无需为其他URL禁用ATS。
答案 2 :(得分:0)
我在高低两下搜寻答案。原来是高度和宽度的要求
“与大多数其他Xamarin.Forms视图不同,WebView要求在包含在StackLayout或RelativeLayout中时指定HeightRequest和WidthRequest。如果未能指定这些属性,则WebView将不会呈现。”