macos - 如何将下载的文件(音频、文档)自动保存到 mac os x 沙盒应用程序中用户的下载文件夹?

标签 macos appstore-sandbox

在我的 Mac OS X 应用程序中,我尝试将下载的文件保存到应用程序的目录(即 HomeDirectory()/Documents),但 App Store 拒绝了我的应用程序,说用户无法轻松访问您下载的文件(即不打开应用程序)。然后我尝试通过在权利中添加读/写权限将下载的文件写入 ~/Downloads 文件夹,但 App Store 再次拒绝应用程序说

Your application accesses the following location(s):

~/Download

The majority of developers encountering this issue are opening files in Read/Write mode instead of Read-Only mode, in which case it should be changed to Read-Only.

Other common reasons for this issue include:

  • creating or writing files in the above location(s), which are not valid locations for files to be written as stated in documentation.

  • writing to the above location(s) without using a valid app-id as a container for the written files.



现在的问题是 App Store 不允许我将文件保存在 App 的目录或系统的文件夹中(即下载)。另外我不想每次都使用 NSSavePanel。我想静默下载文件。我应该在哪里保存我的文件?

最佳答案

在安全范围书签、用户选择的读写权限和 NSOpenPanel 的帮助下,我能够读取/写入用户选择的文件夹。

以下是我遵循的步骤,

  • 添加
    <key>com.apple.security.app-sandbox</key>
    <true/>
    
    <key>com.apple.security.files.bookmarks.app-scope</key>
    <true/>
    
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
    

    在权利文件中。
  • 要求用户使用 NSOpenPanel 选择(或创建并选择)我的应用程序想要访问(读/写)的所需文件夹。
  • 当用户选择文件夹时,我使用 NSURLBookmarkCreationWithSecurityScope 在 NSUserDefaults 中创建了所选文件夹路径的书签作为书签路径。
    NSOpenPanel *openDlg = [NSOpenPanel openPanel];
    
    [openDlg setCanChooseDirectories:YES];
    
    [openDlg setCanCreateDirectories:YES];
    
    [openDlg setAllowsMultipleSelection:FALSE];
    
    [openDlg setPrompt:@"Select"];
    
    if ( [openDlg runModal] == NSModalResponseOK )
    {
    
        NSURL *url = openDlg.URL;
    
        NSError *error = nil;
    
        NSData *bookmark = [url 
                      bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
                      includingResourceValuesForKeys:nil
                                  relativeToURL:nil
                                          error:&error];
    
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
        [userDefaults setObject:bookmark forKey:@"DOWNLOAD_FOLDER_BOOKMARK_PATH"];
    
        [userDefaults synchronize];
    
    }
    
  • 在 NSUserDefaults 中保存书签路径后,您可以稍后使用 NSURLBookmarkResolutionWithSecurityScope 访问保存的路径。
     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
     NSData * bookmarkedPathData = [userDefaults objectForKey:@"DOWNLOAD_FOLDER_BOOKMARK_PATH"];
    
     NSURL* urlFromBookmark = [NSURL URLByResolvingBookmarkData:bookmarkedPathData 
     options:NSURLBookmarkResolutionWithSecurityScope
                                                     relativeToURL:nil
                                               bookmarkDataIsStale:nil
                                                             error:&error];
    
  • 获得保存的书签 URL 后,您可以使用该 URL 执行读取、写入操作。在读取/写入 URL 之前,请使用 [urlFromBookmark startAccessingSecurityScopedResource]; 启动范围.并在完成读/写操作后使用 [saveFolder stopAccessingSecurityScopedResource]; 停止范围

  • 注意:我确实尝试直接写入 Documents、Downloads、Desktop 而不在这些目录中创建文件夹,但 Apple 拒绝了该应用程序,并说

    Your application access the following locations 'Downloads'.



    然后,我没有直接写入这些目录(文档、下载、桌面),而是要求用户选择(创建和选择)一个文件夹,然后使用 Security-Scope-Bookmark 对用户选择的文件夹执行读/写操作。

    希望这可以帮助某人。

    关于macos - 如何将下载的文件(音频、文档)自动保存到 mac os x 沙盒应用程序中用户的下载文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54147042/

    相关文章:

    c++ - OS X 上的 printf 和 %llu 对比 %lu

    macos - 如何在 Mac OS X 上使用 cocoa 更改卷名称

    objective-c - 沙箱和 NSTask

    swift - 沙盒时无法终止其他应用程序

    ios - 有没有办法报告 Apple 文档中的错误?

    macos - 单击时,Swift 中的托盘图标会变灰。

    macos - 如何在 Lion 的沙盒应用程序中发送分布式通知?

    objective-c - 无法创建安全范围的书签

    swift - 沙盒应用 : How to create applicationScriptsDirectory if it doesn't exist?

    macos - objective-c : How to change option in "Security & Privacy" via terminal