2012-06-05 5 views
5

저는 다른 곳에서 다운로드 한 파일을 저장할 위치를 사용자에게 묻는 sandboxed Mac App Store 앱을 개발 중입니다.startAccessingSecurityScopedResource가 성공을 결코 돌려주지 않습니다.

NSOpenPanel* openPanel = [NSOpenPanel openPanel]; 
[openPanel setAllowsMultipleSelection:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setResolvesAliases:YES]; 
NSInteger result = [openPanel runModal]; 
NSArray* urls = [openPanel URLs]; 
NSURL* folderURL = [urls objectAtIndex:0]; 
NSError* error; 
NSData* bookmakeData = [folderURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
          includingResourceValuesForKeys:nil 
              relativeToURL:nil 
                error:&error]; 
_saveFolderBookmark = bookmakeData; 

을하고이 폴더에 파일을 이동하는 데 시간이 올 때,이 코드가 있습니다 : (일부 오류 검사를 제거) 나는 사용자의 폴더를 얻기 위해이 코드를

BOOL isStale; 
NSError* error; 
NSURL* saveFolder = [NSURL URLByResolvingBookmarkData:_saveFolderBookmark 
               options:NSURLBookmarkCreationWithSecurityScope 
             relativeToURL:nil 
            bookmarkDataIsStale:&isStale 
               error:&error]; 
BOOL success = [saveFolder startAccessingSecurityScopedResource]; 

// Move the file somewhere else 
NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; 
NSInteger operationTag; 
BOOL copied = [workspace performFileOperation:NSWorkspaceMoveOperation 
             source:[[self getDocumentsFolder] path] 
            destination:[saveFolder path] 
             files:[NSArray arrayWithObject:filename] 
              tag:&operationTag]; 
[saveFolder stopAccessingSecurityScopedResource]; 

NSAserDefaults에 북마크 데이터가 저장되어있는 상태에서 NSApenPanel에서 ULR을 얻은 직후 나 나중에 실행하여 startAccessingSecurityScopedResource가 성공을 반환하지 않는다고 말하는 코드가 많습니다. 타이틀먼트 파일에서

, 다른 항목 사이에, 나는이 :이 코드와 아무 잘못이

<key>com.apple.security.files.bookmarks.app-scope</key> 
<true/> 

있습니까?

+0

콘솔 메시지가 표시됩니까? 또한 코드 서명을 다시 확인하여 올바르게 구성되었는지 확인하십시오. – gaige

+0

예를 들어, 열린 패널이 끝난 후'urls' 배열이 어디에서 왔는지는 명확하지 않습니다. – gaige

+0

오류 검사를 제거 할 때 URL을 가져 오는 행을 편집 할 수있었습니다. 나는 그것을 다시 돌려 놓았다. 콘솔에 startAccessingSecurityScopedResource를 호출하는 행과 관련된 메시지가 없습니다. –

답변

8

이것은 매우 쉽습니다. NSURLBookmarkResolutionWithSecurityScope 대신 NSURLBookmarkCreationWithSecurityScope로 해결 중입니다. 그 라인을 바꾸면 제대로 작동합니다.

(URL에 이미 액세스 할 때 북마크를 만들면 동일한 세션에서 작동하지 않을 수 있습니다.이 경우에는 전화하지 않아도되기 때문입니다.하지만 나중에 실행해야합니다. 그 이유는 요점입니다.)

+0

이제는 분명히 지적했습니다. 왜 두 개의 다른 상수가 있는지 궁금해 할 것입니다. 감사! –

+2

역사를 보면 의미가 있습니다. 10.6의 BookmarkCreation 및 BookmarkResolution 플래그의 원래 세트에는 멋지게 일치하는 쌍이 없으므로 완전히 독립적 인 비트 마스크 값 세트였으며 예를 들어 NSURLBookmarkCreationMinimalBookmark와 NSURLBookmarkResolutionWithoutUI 사이에 혼동을 일으킬 여지가 없었습니다. 그러나 컴파일러가 경고 할 수있는 방법을 추가했다면 좋을 것입니다. 그렇지 않습니까? – abarnert

0

위와 같은 올바른 해결책이 제시되었지만 동일한 증상 (startAccessingSecurityScopedResource 결코 반환하지 않음)을 가진 사람들을 위해 다른 가능성을 추가 할 것입니다. YES. Powerbox에서 반환 한 실제 URL을 사용하고 있는지 확인하십시오.이 URL은 액세스하려는 실제 리소스의 URL과 다를 수 있습니다. 예를 들어, Powerbox는 URL을 경로로 반환합니다.이 경로는 startAccessingSecurityScopedResource과 함께 사용하여 해당 디렉토리 아래의 특정 파일에 액세스합니다.

관련 문제