如何将下载的文件(音频,文档)自动保存到Mac OS X沙盒应用程序中用户的“下载”文件夹中?

时间:2019-01-11 12:57:31

标签: macos appstore-sandbox

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

  

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

     

〜/下载

     

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

     

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

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

  •   
  • 在不使用有效的app-id作为写入文件的容器的情况下写入上述位置。

  •   

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

1 个答案:

答案 0 :(得分:0)

借助“安全范围书签”,用户选择的读写权限和NSOpenPanel,我能够对用户选择的文件夹进行读写。

下面是我遵循的步骤,

  1. 已添加

    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];
    
    }
    

    在权利文件中。

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

  3. 当用户选择文件夹时,我使用NSURLBookmarkCreationWithSecurityScope在NSUserDefaults中将所选文件夹路径的书签创建为书签路径。

     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];
    
  4. 将标记的路径保存在NSUserDefaults中之后,以后可以使用NSURLBookmarkResolutionWithSecurityScope访问保存的路径。

    [urlFromBookmark startAccessingSecurityScopedResource];
  5. 一旦获得了保存的带有书签的URL,就可以使用该URL进行读写操作。在从URL读/写URL之前,请使用[saveFolder stopAccessingSecurityScopedResource];开始作用域。在完成读/写操作后,使用{{1}}

  6. 停止作用域

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

  

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

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

希望这对某人有帮助。