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

Mah*_*ale 5 macos appstore-sandbox

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

您的应用程序访问以下位置:

〜/下载

大多数遇到此问题的开发人员都是以读/写模式而不是只读模式打开文件,在这种情况下应将其更改为只读。

此问题的其他常见原因包括:

  • 在上述位置创建或写入文件,这些位置不是文档中所述的写入文件的有效位置。

  • 写入上述位置而不使用有效的应用程序 ID 作为写入文件的容器。

现在的问题是应用程序商店既不允许我将文件保存在应用程序目录中,也不允许我将文件保存在系统文件夹(即下载)中。另外我不想每次都使用 NSSavePanel 。我想默默地下载文件。我应该在哪里保存我的文件?

Mah*_*ale 3

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

以下是我遵循的步骤,

  1. 添加

    <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/>
    
    Run Code Online (Sandbox Code Playgroud)

    在权利文件中。

  2. 要求用户选择(或创建并选择)我的应用程序想要使用 NSOpenPanel 访问(读/写)的所需文件夹。

  3. 当用户选择文件夹时,我使用 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];
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将添加书签的路径保存在 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];
    
    Run Code Online (Sandbox Code Playgroud)
  5. 获得保存的书签 URL 后,您可以使用该 URL 执行读取、写入操作。在从 URL 读取/写入 URL 之前,请使用 启动范围[urlFromBookmark startAccessingSecurityScopedResource];。完成读/写操作后,使用停止范围[saveFolder stopAccessingSecurityScopedResource];

注意:我确实尝试直接写入文档、下载、桌面,而不在这些目录中创建文件夹,但苹果拒绝了该应用程序,说

您的应用程序访问以下位置“下载”。

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

希望这对某人有帮助。