Nex*_*xus 6 mobile ios ionic-framework cordova-ios
我有一个基于Angular 1.6和Ionic v1的cordova应用程序.我在iOS上面临一个可怕的问题,我甚至不知道出了什么问题.我将解释这个问题以及到目前为止我所尝试的内容,希望有人会对此有所了解.
问题
我们有一个简单的屏幕,你可以填写一些文字并添加附件.对于附件,您可以:
然后,您可以保存记录,该记录将所有内容存储在文件系统上.或者上传到服务器,再次将记录存储在您的设备上.
问题是,当我从库或任何其他来源选择文件时,应用程序很快意外崩溃.我可以添加附件并保存/上传,但是当我离开时,应用程序崩溃了.这只发生在iOS上.没有错误,没有警告,没有可调试的输出,只是崩溃.我检查了iPhone上的崩溃日志,显然主线程被阻塞超过5秒.这导致看门狗违规异常被抛出.很难说是什么导致这个线程锁定,不知道.
我正在使用运行iOS 12.1的iPhone 8.值得一提的是,该应用程序在模拟器上工作正常,没有错误或崩溃.
我迄今为止所做的
一切起初,我认为我的代码可能出了问题.所以我逐行检查了每个代码文件,重构了我的JS代码并提高了代码质量.确保promises按预期工作,解决JSLint/TSLint警告等问题.
我已将所有cordova插件更新到最新版本.同时删除了两个平台并添加了最新版本.他们都没有帮助.所以我想也许我错过了配置怪癖等等.通过github文档和SO线程挖掘,找不到任何有用的东西.我尝试过的其他一些事情:
他们都没有工作.我已经在这个问题上苦苦挣扎了两个星期了.
奇怪的部分
令我困惑的是,当我定位我的本地开发机器时,也就是说,当我将API调用的基本URL设置为指向我的本地IIS时,应用程序运行得非常好.没有错误/错误,没有崩溃.
但是当我瞄准我们的远程服务器时,当我尝试使用附件(相机,iCloud等)时,应用程序崩溃了.我不知道我在这里缺少什么.我的机器和远程服务器之间没有区别.两者都运行完全相同的软件,相同的配置,并且移动应用程序是相同的构建,在同一设备上运行.
所以我可以肯定地说,这个问题与我的应用程序代码或Cordova及其插件无关.在定位我的本地IIS时,相同的构建工作完美.
我的应用程序已经投入生产,现在需要修复.这让我很生气,我已经尝试了所有我能想到的东西,但仍然没有运气.有没有人有类似的问题?任何帮助表示赞赏.
我没有权限分享我的代码,就像我说的那样,代码没有任何问题,在针对我的本地IIS时,它的工作原理非常好.但是供您参考,这里有一些关于我的项目的信息.
Config.xml中的首选项
<preference name="SplashScreen" value="screen" />
<preference name="windows-target-version" value="10.0" />
<preference name="AndroidPersistentFileLocation" value="Internal" />
<preference name="iosPersistentFileLocation" value="Library" />
<preference name="webviewbounce" value="false" />
<preference name="UIWebViewBounce" value="false" />
<preference name="DisallowOverscroll" value="true" />
<preference name="BackupWebStorage" value="local" />
Run Code Online (Sandbox Code Playgroud)
Cordova插件
<plugin name="cordova-plugin-geolocation" spec="^2.4.3">
<variable name="GEOLOCATION_USAGE_DESCRIPTION" value="Location access allows you to capture your geolocation information on to your records." />
</plugin>
<plugin name="cordova-plugin-device" spec="^1.1.7" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.3" />
<plugin name="cordova-plugin-app-icon-changer" spec="^1.0.0" />
<plugin name="es6-promise-plugin" spec="^4.2.2" />
<plugin name="cordova-plugin-ios-camera-permissions" spec="^1.2.0">
<variable name="CAMERA_USAGE_DESCRIPTION" value="Camera access allows you to capture and attach photos that you take to your records." />
<variable name="MICROPHONE_USAGE_DESCRIPTION" value="Microphone access allows you to capture voice information to your records." />
<variable name="PHOTOLIBRARY_ADD_USAGE_DESCRIPTION" value="Photo library access allows you to upload your photos and media files to your records." />
<variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="Photo library access allows you to upload your photos and media files to your records." />
</plugin>
<plugin name="cordova-plugin-android-fingerprint-auth" spec="^1.4.1" />
<plugin name="cordova-plugin-inappbrowser" spec="^3.0.0" />
<plugin name="cordova-plugin-filechooser" spec="1.1.0" />
<plugin name="cordova-plugin-crosswalk-webview" spec="2.4.0">
<variable name="XWALK_VERSION" value="23+" />
<variable name="XWALK_LITEVERSION" value="xwalk_core_library_canary:17+" />
<variable name="XWALK_COMMANDLINE" value="--disable-pull-to-refresh-effect" />
<variable name="XWALK_MODE" value="embedded" />
<variable name="XWALK_MULTIPLEAPK" value="true" />
</plugin>
<plugin name="cordova-plugin-statusbar" spec="2.4.2" />
<plugin name="cordova-plugin-add-swift-support" spec="1.7.2" />
<plugin name="cordova-plugin-touch-id" spec="3.4.0">
<variable name="FACEID_USAGE_DESCRIPTION" value="OnRecord would like to access your touch ID to let you log in securely." />
</plugin>
<plugin name="cordova-plugin-media-playback" spec="1.0.2-dev5" />
<plugin name="cordova-plugin-documentpicker" spec="1.0.0" />
<plugin name="cordova-plugin-file" spec="6.0.1" />
<plugin name="cordova-plugin-file-transfer" spec="1.7.1" />
<plugin name="cordova-plugin-media-capture" spec="3.0.2" />
<plugin name="cordova-plugin-camera" spec="4.0.3" />
Run Code Online (Sandbox Code Playgroud)
index.html中的Content-Security-Policy
<meta http-equiv="Content-Security-Policy" content="default-src 'self' gap://ready ms-appdata file://* *; img-src 'self' content: android-webview-video-poster: data: *; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://maps.googleapis.com https://maps.gstatic.com; media-src *; connect-src *">
Run Code Online (Sandbox Code Playgroud)
应用传输安全策略
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
<key>NSAllowsLocalNetworking</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>your.domain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>1.0</string>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
Run Code Online (Sandbox Code Playgroud)
隐私说明(权限)
<key>NSFaceIDUsageDescription</key>
<string>This app would like to access your touch ID to let you log in securely.</string>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app would like to access your location to let you track your records.</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs microphone access</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs write-access to photo library</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs read/write-access photo library access</string>
Run Code Online (Sandbox Code Playgroud)
如果您需要更多信息或任何进一步说明,请与我们联系.我试图尽可能地描述这个问题.回顾一下:
该应用程序在定位我的本地计算机时运行良好,但在定位远程服务器时崩溃.有什么问题,这应该与我的应用程序无关.相机插件,从不同来源选择文件等在设备本地发生,它与我的基本API地址有什么关系?!确实非常奇怪.
更新:澄清
在更多测试运行之后,我已经找出导致应用程序崩溃的原因.虽然目前还不清楚,但从UX的角度来看,iOS上会发生这种情况:
一旦我使用相机插件(cordova-camera),应用程序很快就会崩溃.如果我从相机胶卷/库中选择一个文件,或者拍照等等都没关系.我只需打开相机或库,取消并导航即可.该应用程序崩溃.很明显它与相机插件有关.
令我烦恼的是,正如我之前提到的,当我通过更改基本URL地址来定位本地IIS时,应用程序运行正常.我不明白为什么这与相机使用有关,因为它发生在设备本地.我现在推测的是,可能是因为远程URL使用HTTPS导致应用程序抛出异常.但我在Xcode中没有收到任何警告/错误,所以谁知道呢.
当然,问题不在于cordova-ios,相机插件,我的JS代码或任何安全配置(App Transport Security和Content-Security-Policy).因为应用程序在我的IIS定位时工作正常.我想我在这里遗漏了一些东西.
我终于找到了导致iOS应用程序崩溃的原因.问题出在我们的代码中,但它仍然与Cordova有关,特别是File和Camera插件.
我们的项目中有一个TypeScript类,很久以前就是由其他人开发的.该类处理文件插件和本机文件系统的数据访问.我们使用它来在设备上存储JSON对象,这种方法工作正常,但仅适用于保存一两个文件等小的情况.您从服务器获取一些数据,对于每个记录,我们在文件系统上创建一个JSON文件并存储它.当我们在循环中使用它时出现问题.假设您从服务器返回100条记录,并在循环内调用save方法来存储记录.
这工作正常,但在使用Camera插件(或有时像iCloud Document Picker等其他插件)后,应用程序立即崩溃.我猜测文件插件或写入操作导致内存泄漏,或者应用程序内存不足,随后访问Camera插件导致应用程序崩溃.我不太清楚为什么Android上的一切都运行正常,可能是因为Cordova引擎和Android文件系统不同.
然而,没有必要在文件系统上存储JSON数据.所以我重新构建了使用LocalStorage的项目.它快得多,它也解决了这个问题.iOS上没有崩溃!可能是用于写入文件系统的代码可以更改以解决问题,但无论如何都没有必要.
我很高兴我终于想到了这一点,但调试Cordova插件并发现内存泄漏是一场血腥的噩梦.唯一剩下的就是用像SQLite这样更可靠的东西替换LocalStorage.因为操作系统可以决定在内存/空间不足时清除数据,而我们无法控制它.现在,它完全没问题.我一直在尝试使用Ionic存储模块,因为它使用SQLite并允许存储JSON或键/值对.但是我无法在Angular 1中使用这个模块,这是一个无赖,因为我可以使用其他Ionic Native模块.案件结案.
归档时间: |
|
查看次数: |
222 次 |
最近记录: |