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

运行cordova准备ios时什么都没发生

Apache Cordova for ios环境配置

如何在iOS 8上的Cordova / PhoneGap应用程序中隐藏键盘表格附件栏? [重复]

Google地图自动填充功能在Cordova iOS上使用WKWebView失败

cordova(ex phonegap)tel: not working in ios5中的链接