6

新しく撮影したスクリーンショットを開く機能を持つアプリケーションを構築しています。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]];

ありがとう

4

2 に答える 2

12

ユーザーの許可を求めずにアクセスできるのは、音楽、映画、写真、およびダウンロード フォルダーのみです。 資格

デスクトップフォルダへのアクセスを許可するには、ユーザーに依頼する必要があります。次に、Security-Scoped Bookmarksと呼ばれるメカニズムを使用します。詳細については、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]);

それで、それはそれです。

于 2012-08-28T08:41:20.473 に答える
5

アクセスを許可した後、実際のホームフォルダーへのパスも取得する必要があります。他のすべてのファイル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];
于 2012-10-18T02:31:36.587 に答える