Cordova 可以在 iOS“文件”应用程序中读/写文件吗?

Posted

技术标签:

【中文标题】Cordova 可以在 iOS“文件”应用程序中读/写文件吗?【英文标题】:Can Cordova read/write files in the iOS "Files" app? 【发布时间】:2019-03-27 07:58:01 【问题描述】:

有谁知道是否可以通过 Cordova 访问 ios“文件”应用程序数据?即,我想将我的应用程序添加到文件应用程序中的“位置”列表中,然后读取/写入这些文件。这可能吗?

谢谢!

【问题讨论】:

我还没有看到任何现有的与 Files 应用程序一起使用的插件,所以目前唯一的方法是编写你的插件,该插件将与来自 objectiveC/swift 的 Files 应用程序一起使用,然后使用该插件。以下是有关与文件应用程序 medium.com/if-let-swift-programming/… 和 appcoda.com/files-app-integration 集成的链接 我不确定你是否需要一个插件来解决这个问题,难道不是用文件插件将文件写入正确的位置吗?对于 iOS ~/Documents/ - per npmjs.com/package/cordova-plugin-file 不,我试过了。 “文件”应用程序中不显示任何内容。我专门写信给 Documents/NoCloud/,但如果是这样,我认为它会是一样的。 @user2943799,你运气好吗?我正在尝试完成同样的事情...... @Joncom,不,很遗憾不是。据我所知,没有提供这种访问权限的插件。 【参考方案1】:

您必须在 Xcode 的 Capabilities 下设置 iCloud。不要忘记为您的 App Identifier 设置容器。

也许这个选项将来会对你有所帮助:

LSSupportsOpeningDocumentsInPlace

【讨论】:

这和来自@Bochi 的UIFileSharingEnabled 是我们所需要的。【参考方案2】:

我也遇到了这个问题并解决了。这是我所做的: 为了让文件应用程序访问我的应用程序数据,我必须打开 info.plist 文件(只需在您的 iOS 平台文件夹中搜索“info.plist”)并添加以下 sn-p:

<key>UIFileSharingEnabled</key>
<true/>

现在,当您在 xcode 中单击 Ressources > info.plist 文件时,您应该有以下条目:

Screenshot Data Access

在您的设备上构建您的应用后,文件应用应允许您访问“我的(设备)”并列出您使用 cordova 文件插件创建的所有文件夹和文件。

【讨论】:

我有一个下载到 iPhone 的 .txt 文件。我可以使用“在我的 iPhone”下的 iPhone 文件图标找到 .txt 文件。我有一个使用cordova-plugin-file 的离子应用程序。我尝试使用插件 readAsText() 读取 .txt。您提到的关键 - UIFileSharingEnabled - 当我添加到 Xcode 显示应用程序支持 iTune 文件共享不支持在您的屏幕截图显示的位置打开文档?我将两者都添加到了我的 Xcode 项目中,但仍然无法访问“在我的 iPhone 上”的 .txt 文件。你用的是什么插件,你是怎么用的? 我在 xcode 10.1 中使用了没有离子的 cordova。添加 sn-p 后,“我的 ipad”位置被添加到我的“文件”应用程序中。然后我使用cordova.plugin.file 在cordova.file.documentsDirectory 中创建目录。从那里开始,我花了一些时间将数组数据正确解析为字符串,但最终它奏效了。不过,使用预定义的虚拟字符串,您应该不会遇到这种麻烦。 这和来自@hydrococcus 的LSSupportsOpeningDocumentsInPlace 是我们所需要的【参考方案3】:

Cordova-plugin-file 实现了一个文件 API,允许对驻留在设备上的文件进行读/写访问。

iOS Persistent storage location

在 iOS 设备上存储持久文件有两个有效位置:Documents 目录和 Library 目录。该插件的早期版本仅将持久文件存储在 Documents 目录中。这具有使应用程序的所有文件在 iTunes 中可见的副作用,这通常是意料之外的,特别是对于处理大量小文件的应用程序,而不是生成用于导出的完整文档,这是该目录的预期目的。

现在可以选择是否将文件存储在文档或库目录中,并在您的应用程序的config.xml file 中提供首选项。为此,请将这两行之一添加到config.xml

<preference name="iosPersistentFileLocation" value="Library" />
<preference name="iosPersistentFileLocation" value="Compatibility" />

Write to File

一旦有了 FileEntry 对象,就可以通过调用createWriter 来写入文件,这会在成功回调中返回一个 FileWriter 对象。调用 FileWriter 的 write 方法写入文件。

function writeFile(fileEntry, dataObj) 
    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function (fileWriter) 

        fileWriter.onwriteend = function() 
            console.log("Successful file write...");
            readFile(fileEntry);
        ;

        fileWriter.onerror = function (e) 
            console.log("Failed file write: " + e.toString());
        ;

        // If data object is not passed in,
        // create a new Blob instead.
        if (!dataObj) 
            dataObj = new Blob(['some file data'],  type: 'text/plain' );
        

        fileWriter.write(dataObj);
    );

Read a file

您还需要一个 FileEntry 对象来读取现有文件。使用 FileEntry 的文件属性获取文件引用,然后创建一个新的 FileReader 对象。您可以使用readAsText 之类的方法来启动读取操作。当读取操作完成后,this.result 存储读取操作的结果。

function readFile(fileEntry) 

    fileEntry.file(function (file) 
        var reader = new FileReader();

        reader.onloadend = function() 
            console.log("Successful file read: " + this.result);
            displayFileData(fileEntry.fullPath + ": " + this.result);
        ;

        reader.readAsText(file);

    , onErrorReadFile);

【讨论】:

嗨@user5377037,这与存储文件以便它们出现在“文件”应用程序中的问题有什么关系?您是否建议图书馆中的文件将在那里可用? 我不认为你理解这个问题。是的,我知道如何使用 Cordova 读取/写入文件,这不是问题。但是 iOS 带有一个名为“文件”的应用程序——问题是如何与该应用程序交互——即让我的应用程序的文件出现在该应用程序中。

以上是关于Cordova 可以在 iOS“文件”应用程序中读/写文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Cordova/Phonegap 应用程序创建一个可以由另一个应用程序 (ios) 打开的文件?

我可以通过 IOS 中的 phonegap/cordova 在 www 目录中创建一个文件夹吗?

从 Cordova 和 iOS 打开 MS Office 文件

使用cordova文件插件时如何从iOS导出文件?

使用 cordova 文件传输将图像/视频保存到 IOS 中的画廊

在 iOs 和 Android 的 PhoneGap/Cordova-app 中播放视频