0

我有一个使用DevExpressPhoneGap开发的混合应用程序。

我尝试通过打开本地 jpeg 图像

window.open('file:///var/mobile/Containers/Data/.../image.jpg', '_system');

但它在 iPhone 和 iPad(最新的 iOS 9 版本)上(不再)工作,失败并出现错误error: "This app is not allowed to query for scheme file"

(该应用程序预先通过 Phonegap 方法将图像下载FileTransfer.download到它通过window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, ...)方法获得的文件夹中。)

它在 Android 上运行良好,几周前在 iPhone 上也运行良好。由于 DevExtreme 的更新,我认为这可能与 PhoneGap 更新有关。

之前,我使用PhoneGap 3.7.0,现在我使用cli-5.2.0

我已经找到了这个问题(https://www.devexpress.com/Support/Center/Question/Details/Q486439),它是类似的,但它已经 2 岁了,似乎并没有解决我的问题。

使用 GapDebug,我在日志中看到了这一点:

<Warning>: THREAD WARNING: ['InAppBrowser'] took '38.211914' ms. Plugin should use a background thread.
<Warning>: THREAD WARNING: ['File'] took '26.509033' ms. Plugin should use a background thread.
<Warning>: -canOpenURL: failed for URL: "file:///var/mobile/Containers/Data/Application/9425CCB6-77F7-4337-B37C-7DB577C2F6B4/Documents/myDocuments/a96e7238-a502-49e6-bcd3-186937afc3cb/camera_1458208164206.jpg" - error: "This app is not allowed to query for scheme file"

这是某种权限问题,但是要在 config.xml 中添加什么?

这是我的 config.xml:

<widget xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0" id="com.devexpress.apptemplate" version="1.0" versionCode="1">
  <name>ApplicationTemplate</name>
  <preference name="phonegap-version" value="cli-5.2.0" />
  <preference name="permissions" value="none" />
  <preference name="prerendered-icon" value="true" />
  <preference name="android-windowSoftInputMode" value="adjustResize" />
  <preference name="SplashScreen" value="splash" />
  <preference name="SplashScreenDelay" value="60000" />
  <preference name="AutoHideSplashScreen" value="false" />
  <preference name="DisallowOverscroll" value="true" />
  <preference name="StatusBarOverlaysWebView" value="false" />
  <preference name="StatusBarBackgroundColor" value="#000000" />
  <preference name="KeyboardDisplayRequiresUserAction" value="false" />
  <feature name="http://api.phonegap.com/1.0/network" />
  <gap:plugin name="com.devexpress.plugins.devextremeaddon" version="1.0.1" />
  <gap:plugin name="cordova-plugin-ios-longpress-fix" version="1.1.0" source="npm" />
  <gap:plugin name="org.apache.cordova.camera" version="0.3.6" />
  <gap:plugin name="org.apache.cordova.file" version="1.3.3" />
  <gap:plugin name="org.apache.cordova.file-transfer" version="0.5.0" />
  <gap:plugin name="org.apache.cordova.inappbrowser" version="0.6.0" />
  <gap:plugin name="org.apache.cordova.media-capture" version="0.3.6" />
  <gap:plugin name="org.apache.cordova.media" version="0.2.16" />
  <gap:plugin name="org.apache.cordova.network-information" version="0.2.15" />
  <gap:plugin name="cordova-plugin-statusbar" version="2.1.0" source="npm" onload="true" />
  <gap:plugin name="org.apache.cordova.splashscreen" version="1.0.0" onload="true" />
  <access origin="*" subdomains="true"/>
  <gap:plugin name="cordova-plugin-whitelist" source="npm"/>
  <allow-navigation href="*" />
  <allow-intent href="*" />
</widget>

我什至添加了这两行

  <allow-navigation href="*" />
  <allow-intent href="*" />

根据https://github.com/apache/cordova-plugin-whitelist并没有帮助。

我看到另一个混合框架 Ionic 在他们的文档http://docs.ionic.io/docs/cordova-whitelist中也提到,较新的 Phonegap 版本(例如 CLI 版本)可能存在权限问题,以及上述<allow-navigation href="*" />应该使用 - 但是在我的情况下它似乎没有帮助。

=== 更新 ===

我在 Phonegap 和 Cordova 的 github 上创建了两张票:

=== 更新 2 ===

如下所示,我现在使用https://github.com/pwlin/cordova-plugin-file-opener2代替,效果很好。

4

2 回答 2

2

在 iOS 9 上,您必须配置要查询的 url(知道是否可以打开它们)。

为此,您必须编辑 info.plist 并LSApplicationQueriesSchemes使用要查询的方案添加键和字符串数组

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>file</string>
 <string>whatsapp</string>
 <string>...</string>
</array> 

当您使用cordova时,您可以通过几种不同的方式来做到这一点。

您可以在platforms/ios 中打开Xcode 项目并编辑info.plist 文件,但在某些情况下Xcode 项目会被删除并重新创建,您所做的更改将会丢失。

另一种选择是创建一个简单的 cordova 插件,它只写在 info.plist 上。为此,您必须使用 plugin.xml 上的配置文件标签

<config-file target="*-Info.plist" parent="LSApplicationQueriesSchemes">
    <array>
        <string>file</string> 
    </array>
</config-file>

http://cordova.apache.org/docs/en/latest/plugin_ref/spec.html#platform

第三种选择是使用钩子,钩子是执行的脚本文件(节点、bash),你可以用它写在info.plist http://cordova.apache.org/docs/en/latest /guide/appdev/hooks/index.html

于 2016-04-08T08:53:40.607 回答
1

我遇到了同样的问题......我开始使用cordova-plugin-file-opener2(github.com/pwlin/cordova-plugin-file-opener2)来避免这个问题。

为了解决空格问题,我将它们从 targetPath 中删除:

targetPath = targetPath.replace(/ /g,'')

所以我的下载/打开代码是这样的:

$cordovaFileTransfer.download(url, targetPath, options, trustHosts)
  .then(function(result) {
    $cordovaFileOpener2.open(targetPath, mimeType)
  })
于 2016-04-08T14:29:37.753 回答