SAPUI5 Cordova iOS 应用程序 Ajax 调用不起作用(无限挂起)
Posted
技术标签:
【中文标题】SAPUI5 Cordova iOS 应用程序 Ajax 调用不起作用(无限挂起)【英文标题】:SAPUI5 Cordova iOS app Ajax calls not working (hang infinitely) 【发布时间】:2018-05-09 08:16:58 【问题描述】:我目前正在为 ios 构建一个 SAPUI5 Cordova 应用程序。我正在使用 Cordova 8、iOS 11.0.3 和 xcode 9.2 问题是我的 Ajax 调用似乎都没有工作(它们无限期挂起,甚至没有返回错误代码)。这似乎是一个常见问题,因为已经有很多围绕这个问题的线程,但是这些线程中提出的解决方案似乎都不适用于我的应用程序。 到目前为止,我已经尝试了以下方法:
在 index.html 的 meta 标签中设置 CSP:
<meta http-equiv="Content-Security-Policy" content="default-src * data: gap: https: 'unsafe-inline' 'unsafe-eval'; style-src 'unsafe-inline' *; media-src * 'unsafe-inline'; connect-src * 'unsafe-inline'" />
在 xcode 项目的 info.plist 文件中设置 App Transport Security 设置:
导入cordova-whitelist-plugin并设置访问源、allow-intent和allow-navigation到*:
<?xml version='1.0' encoding='utf-8'?>
<widget id="opensap.myapp.eventapp" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>eventapp2</name>
<description />
<author email="dev@sap.com" href="http://www.sap.com">SAP Product and Innovation</author>
<content src="webapp/index.html" />
<plugin name="cordova-plugin-device" spec="^2.0.2" />
<plugin name="cordova-plugin-network-information" spec="^2.0.1" />
<plugin name="cordova-plugin-battery-status" spec="^2.0.2" />
<plugin name="cordova-plugin-geolocation" spec="^2.4.3" />
<plugin name="cordova-plugin-dialogs" spec="^2.0.1" />
<plugin name="cordova-plugin-vibration" spec="^3.1.0" />
<plugin name="cordova-plugin-splashscreen" spec="^3.0.0" />
<plugin name="cordova-plugin-console" spec="^1.1.0" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-navigation href="*" requires-certificate-transparency="false" requires-forward-secrecy="false" />
<platform name="android">
<icon density="ldpi" src="res/icon/icon_android_36.png" />
<icon density="mdpi" src="res/icon/icon_android_48.png" />
<icon density="hdpi" src="res/icon/icon_android_72.png" />
<icon density="xhdpi" src="res/icon/icon_android_96.png" />
<splash density="land-ldpi" src="res/screen/android/splash-land-ldpi.png" />
<splash density="port-ldpi" src="res/screen/android/splash-port-ldpi.png" />
<splash density="land-mdpi" src="res/screen/android/splash-land-mdpi.png" />
<splash density="port-mdpi" src="res/screen/android/splash-port-mdpi.png" />
<splash density="land-hdpi" src="res/screen/android/splash-land-hdpi.png" />
<splash density="port-hdpi" src="res/screen/android/splash-port-hdpi.png" />
<splash density="land-xhdpi" src="res/screen/android/splash-land-xhdpi.png" />
<splash density="port-xhdpi" src="res/screen/android/splash-port-xhdpi.png" />
</platform>
<platform name="ios">
<icon src="res/icon/icon_ios_57.png" />
<icon src="res/icon/icon_ios_72.png" />
<icon src="res/icon/icon_ios_114.png" />
<icon src="res/icon/icon_ios_144.png" />
<splash src="res/screen/ios/Default~iphone.png" />
<splash src="res/screen/ios/Default@2x~iphone.png" />
<splash src="res/screen/ios/Default-Portrait~ipad.png" />
<splash src="res/screen/ios/Default-Portrait@2x~ipad.png" />
<splash src="res/screen/ios/Default-Landscape~ipad.png" />
<splash src="res/screen/ios/Default-Landscape@2x~ipad.png" />
<splash src="res/screen/ios/Default-568h@2x~iphone.png" />
<splash src="res/screen/ios/Default-667h.png" />
<splash src="res/screen/ios/Default-736h.png" />
</platform>
<platform name="windows" />
<platform name="android">
<preference name="Fullscreen" value="false" />
<preference name="Orientation" value="default" />
<preference name="ShowTitle" value="false" />
<preference name="LogLevel" value="VERBOSE" />
<preference name="LoadUrlTimeout" value="80000" />
<preference name="UrlScheme" value="" />
<preference name="android-minSdkVersion" value="16" />
</platform>
<preference name="sap-development-version" value="0.0.1" />
<preference name="hybridapprevision" value="1" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="5000" />
<icon src="res/icon/icon_512.png" />
<plugin name="com.unarin.cordova.beacon" spec="https://github.com/petermetz/cordova-plugin-ibeacon.git" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.3" />
<engine name="android" spec="^6.2.3" />
<engine name="ios" spec="^4.5.4" />
关于如何让它发挥作用的任何提示或建议?
编辑:尝试在域级别设置异常,但这也不起作用:
【问题讨论】:
【参考方案1】:尝试将被叫域添加到您的 info.plist 在 Exception domain 部分并禁用 CertificateTransparency,并设置 TLS1.0。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourdomain.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
【讨论】:
感谢您的快速回复!我尝试了您的建议,但在调用网络服务时仍然没有得到任何响应。我用当前 info.plist 设置的新屏幕截图更新了我的初始帖子。 嗯,如果您从应用程序外部(从网络浏览器)调用网络服务,它会正确响应吗? 没错,在 Android 上,ajax 调用工作得非常好。但是,我注意到我的 CordovaLib.xcodeproj/Cordova 文件夹中还有一个 info.plist 文件(到目前为止,我在 Resources/config 文件夹中的 eventsapp2-Info.plist 中进行了更改)。该 info.plist 文件以红色列出,我似乎无法对该文件进行更改。 嗯,你可以试试缓存错误,但我注意到它已经解决了。看看这里https://www.mgcwebsites.co.uk/solved-jquery-ajax-request-not-working-iphones/ $.ajaxSetup( cache: false ); 是的,我尝试在 $.ajaxSetup 和我的 Ajax 调用的标头中将缓存设置为 false,但它仍然不起作用。以上是关于SAPUI5 Cordova iOS 应用程序 Ajax 调用不起作用(无限挂起)的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Cordova 文件传输插件上传到 SAP Content Server
如何在iOS 8上的Cordova / PhoneGap应用程序中隐藏键盘表格附件栏? [重复]