Swift 具有用户选择的文件读写权限的MacOS应用被Mac app Store拒绝,因为SQLite在写入数据库时会创建临时文件

Swift 具有用户选择的文件读写权限的MacOS应用被Mac app Store拒绝,因为SQLite在写入数据库时会创建临时文件,swift,xcode,macos,sqlite,mac-app-store,Swift,Xcode,Macos,Sqlite,Mac App Store,我有一个MacOS应用程序,我想放在Mac应用程序商店上,所以它必须是沙盒。使用该应用程序,用户创建多个SQLite数据库文件,存储他们创建的信息,这有点类似于Excel电子表格文件,但我在应用程序中利用SQLite来创建、读取和编辑文件。他们将这些文件存储在mac上的Documents文件夹中。我为此添加了一个权限:com.apple.security.files.user-selected.read-write。 应用程序可以很好地读取这些数据库文件,但如果我尝试写入它们,它就会失败 根据M

我有一个MacOS应用程序,我想放在Mac应用程序商店上,所以它必须是沙盒。使用该应用程序,用户创建多个SQLite数据库文件,存储他们创建的信息,这有点类似于Excel电子表格文件,但我在应用程序中利用SQLite来创建、读取和编辑文件。他们将这些文件存储在mac上的Documents文件夹中。我为此添加了一个权限:com.apple.security.files.user-selected.read-write。 应用程序可以很好地读取这些数据库文件,但如果我尝试写入它们,它就会失败

根据Mac Console应用程序的日志,错误为:

沙盒:MyApp Helpe(16378)拒绝(1)文件写入创建 /Users/steve/Documents/myFile1.sqlite-journal

违反:拒绝(1)文件写入创建/Users/steve/Documents/myFile1.sqlite-journal

所以它失败了,因为SQLite在幕后创建了一个临时文件,其名称与所访问的文件相同,但通过在其上附加“-journal”来更改扩展名。因此,如果用户打开一个名为myFile1.sqlite的文件,该文件将打开并读取良好,但如果他们尝试写入该文件,sqlite将创建一个名为myFile1.sqlite-journal的临时文件作为过程的一部分,然后将其删除。但是,由于用户没有打开或保存名为myFile1.sqlite-journal的文件,该文件不在沙箱中,因此被拒绝

我在Finder中创建了一个名为myFile1.sqlite-journal的空文件,并从我的应用程序中打开了它(从而将其作为用户选择的文件添加到沙盒中),从而确认了这是一个问题,然后可以写入myFile1.sqlite

这是一个已知的问题,通过使用“相关项目”,似乎每个文档都有一个解决方案:

下面是相关文本,但这是我的第一个mac应用程序,这些说明非常清楚。和他们鬼混了好几天,仍然不知道我该做什么。下面提到了扩展,但sqlite没有设置扩展。您只需使用您想要的任何扩展(比如.sqlite)。有人能解释一下我需要添加到info.plist的属性吗

相关项目:

应用程序沙盒的相关项目功能允许您的应用程序 访问与用户选择的文件具有相同名称但 不同的扩展。此功能由两部分组成:一个 应用程序的Info.plist文件中的相关扩展名和代码 告诉沙箱你在做什么

这有两种常见的情况:

情景1:(与我的问题无关)

场景2:您的应用程序需要能够打开或保存多个相关的 具有相同名称和不同扩展名的文件(例如,到 自动打开与电影文件同名的字幕文件, 或允许使用SQLite日志文件)

要访问该辅助文件,请创建符合 NSFilePresenter协议。此对象应提供主 文件的URL作为其primaryPresentedItemURL属性,并应提供 辅助文件的URL作为其presentedItemURL属性

用户打开主文件后,您的文件演示器对象应 在NSFileCoordinator类上调用addFilePresenter:class方法 注册自己

注意:对于SQLite日志文件,从10.8.2开始, 日志文件、预写日志文件和共享内存文件 如果打开SQLite,则会自动添加到相关项目列表中 数据库,因此不需要此步骤。

在这两种情况下,您必须对应用程序的 Info.plist文件。你的应用程序应该已经声明了一个文档类型 (CbundleDocumentTypes)数组,用于声明应用程序的文件类型 可以打开

对于该数组中的每个文件类型字典,如果该文件类型 出于打开和保存目的,被视为可能相关的类型, 添加布尔值为YES的键NSIsRelatedItemType


如果我没有权限,我甚至无法读取sqlite数据库。数据库位于用户的documents文件夹中,而不是应用程序中。这是因为他们可以创建多个db文件,类似于多个excel电子表格或word文档!?为什么要将它们放在那里?应用程序的一部分用途是使用其他人创建的db文件。Excel电子表格或word文档是一个很好的类比。MS可以将它们存储在Excel/Word中,但那真的很糟糕。@user965972在这个问题上我绞尽脑汁太久了,包括去苹果开发者支持论坛,似乎没有办法做到这一点。所以我放弃了,使用了不同的解决方案。在我看来没有那么好,但它很有效,也不太坏。我将sqlite文件存储在应用程序数据本身中。这是MacOS允许的。因此,每个Sqlite文件都是在应用程序内部创建的。要共享它,用户必须导出它,另一个用户导入它(我使用下载文件夹导入/导出到/从)。然后用户可以创建、更新和删除他们想要的任何文件,只要它在应用程序中。