2012-08-28 41 views
3

我正在構建一個具有打開新近截屏的功能的應用程序。我想用Mac App Store發佈它。不幸的是,它需要被沙箱化。在沙盒應用程序中訪問桌面

要找到新的截圖,我運行一個NSMetaDataQuery。它返回一些條目,但不幸的是,我不能得到他們的URL,因爲他們在桌面上(離開我的應用程序的沙箱)。

我該如何解決這個問題?

下面是一些代碼

query = [[NSMetadataQuery alloc] init]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdated:) name:NSMetadataQueryDidStartGatheringNotification object:query]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdated:) name:NSMetadataQueryDidUpdateNotification object:query]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryUpdated:) name:NSMetadataQueryDidFinishGatheringNotification object:query]; 

[query setDelegate:self]; 
[query setPredicate:[NSPredicate predicateWithFormat:@"kMDItemIsScreenCapture = 1"]]; 
[query startQuery]; 

numberOfScreenshots = [query resultCount]; 
[self uploadToAmazonS3:[[[query results]objectAtIndex:([query resultCount]-1)]valueForAttribute:NSMetadataItemURLKey]]; 

感謝

回答

11

,而不要求用戶權限,您只能訪問音樂,電影,圖片和下載文件夾中。 Entitlements

您必須要求用戶授予您訪問桌面文件夾的權限。然後使用名爲安全範圍書籤的機制,在AppSandboxDesignGuide中閱讀有關它的更多信息。

  1. 使用NSOpenPanel選擇目錄。
  2. 保存書籤以供將來使用,例如在NSUserDefaults中。
  3. 可以訪問

1和2

NSOpenPanel *openPanel = [[NSOpenPanel alloc] init]; 
    [openPanel setCanChooseFiles:NO]; 
    [openPanel setCanChooseDirectories:YES]; 
    [openPanel setCanCreateDirectories:YES]; 

    [openPanel beginWithCompletionHandler:^(NSInteger result){ 
     if (result == NSFileHandlingPanelOKButton) { 
      for (NSURL *fileURL in [openPanel URLs]) { 
       NSString *filename = [fileURL path]; 
       [[NSUserDefaults standardUserDefaults] setObject:filename forKey:@"PathToFolder"]; 

       NSError *error = nil; 
       NSData *bookmark = [fileURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
        includingResourceValuesForKeys:nil 
             relativeToURL:nil 
               error:&error]; 
       if (error) { 
        NSLog(@"Error creating bookmark for URL (%@): %@", fileURL, error); 
        [NSApp presentError:error]; 
       } else { 
        [[NSUserDefaults standardUserDefaults] setObject:bookmark forKey:@"PathToFolder"]; 
        [[NSUserDefaults standardUserDefaults] synchronize]; 
       } 
       break; 
      } 
     }   
}]; 

3.

NSError *error = nil; 
    NSData *bookmark = [[NSUserDefaults standardUserDefaults] objectForKey:@"PathToFolder"]; 
    bookmarkedURL = [NSURL URLByResolvingBookmarkData:bookmark options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:nil error:&error]; 
    BOOL ok = [bookmarkedURL startAccessingSecurityScopedResource]; 
    NSLog(@"Accessed ok: %d %@", ok, [bookmarkedURL relativePath]); 

所以,這是前人的精力它。

4

獲得訪問權限後,您還需要獲取真正的主文件夾路徑 - 所有其他文件API只提供沙盒文件夾的路徑,即使在訪問真實的文件夾時也是如此。爲了解決這個煩人的問題,Apple建議您這樣做以獲得真正的主文件夾:

#include <sys/types.h> 
#include <pwd.h> 

const char *home = getpwuid(getuid())->pw_dir; 
NSString *path = [[NSFileManager defaultManager] 
        stringWithFileSystemRepresentation:home 
        length:strlen(home)]; 
NSString *realHomeDirectory = [[NSURL fileURLWithPath:path isDirectory:YES] path];