代码之家  ›  专栏  ›  技术社区  ›  Mahadev Mandale

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

  •  3
  • Mahadev Mandale  · 技术社区  · 6 年前

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

    应用程序访问以下位置:

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

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

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

    • 在没有使用有效的应用程序id作为已写入文件的容器的情况下写入上述位置。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mahadev Mandale    6 年前

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

    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/>
      

      在授权文件中。

    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];
      
      }
      
    4. 在NSUserDefaults中保存书签路径后,以后可以使用nsurlbookmarksolutionwithsecurityscope访问保存的路径。

       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];
      
    5. 一旦你得到了保存的书签URL,你就可以使用该URL执行读写操作。在读取/写入URL之前,请使用 [urlFromBookmark startAccessingSecurityScopedResource]; [saveFolder stopAccessingSecurityScopedResource];

    注意:我曾尝试直接写到文档、下载、桌面,但没有在这些目录中创建文件夹,但苹果拒绝了这个应用程序

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

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

    希望这对别人有帮助。