window.open 在 iOS 上的 PhoneGap 应用程序中:不允许此应用程序查询方案文件
window.open in PhoneGap app on iOS: This app is not allowed to query for scheme file
我有一个使用 DevExpress and PhoneGap 开发的混合应用程序。
我尝试通过
打开本地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 更新。
以前用的是PhoneGap3.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:
- https://github.com/phonegap/phonegap-app-developer/issues/413
- https://issues.apache.org/jira/browse/CB-11027
===更新二===
按照下面的建议,我现在使用 https://github.com/pwlin/cordova-plugin-file-opener2,效果很好。
在iOS9你必须配置你要查询的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
第三种选择是使用hook,hook是一个脚本文件(节点,bash)被执行,你可以用它写在info.plist
http://cordova.apache.org/docs/en/latest/guide/appdev/hooks/index.html
我遇到了同样的问题...我开始使用 cordova-plugin-file-opener2 (github.com/pwlin/cordova-plugin-file-opener2) 来避免这个问题。
为了解决空格问题,我将它们从 targetPath 中删除:
targetPath = targetPath.replace(/ /g,'')
所以我的 download/open 代码是这样的:
$cordovaFileTransfer.download(url, targetPath, options, trustHosts)
.then(function(result) {
$cordovaFileOpener2.open(targetPath, mimeType)
})
我有一个使用 DevExpress and PhoneGap 开发的混合应用程序。
我尝试通过
打开本地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 更新。
以前用的是PhoneGap3.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:
- https://github.com/phonegap/phonegap-app-developer/issues/413
- https://issues.apache.org/jira/browse/CB-11027
===更新二===
按照下面的建议,我现在使用 https://github.com/pwlin/cordova-plugin-file-opener2,效果很好。
在iOS9你必须配置你要查询的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
第三种选择是使用hook,hook是一个脚本文件(节点,bash)被执行,你可以用它写在info.plist http://cordova.apache.org/docs/en/latest/guide/appdev/hooks/index.html
我遇到了同样的问题...我开始使用 cordova-plugin-file-opener2 (github.com/pwlin/cordova-plugin-file-opener2) 来避免这个问题。
为了解决空格问题,我将它们从 targetPath 中删除:
targetPath = targetPath.replace(/ /g,'')
所以我的 download/open 代码是这样的:
$cordovaFileTransfer.download(url, targetPath, options, trustHosts)
.then(function(result) {
$cordovaFileOpener2.open(targetPath, mimeType)
})