0

내 OS X 앱은 사용자가 선택한 디렉토리에 지속적으로 액세스해야합니다. App Sandbox를 켜기 전에 UI에는 데이터 모델에 바인딩하는 value이있는 NSPathControl이있었습니다. 모델의 데이터 유형은 NSData이고 바인딩은 NSKeyedUnarchiveFromData 값 변환기를 사용합니다. 그것은 훌륭하게 작동했습니다.샌드 박스 응용 프로그램에서 NSPathControl에 NSWRL을 plist에 바인딩하는 방법은 무엇입니까?

NSURL의 보안 범위가 없기 때문에 앱 샌드 박싱을 사용 설정하면 분명히 실패합니다. 이를 해결하기 위해 아래 그림과 같이 바인딩의 변압기 NSKeyedUnarchiveFromData을 자체 변압기로 교체했습니다.

불행히도 은 항상이 올바르게 작동하지 않습니다. 때로는 (사용자로 행동하는) NSPathControl에서 파일을 선택할 때 transformedValue:은 전달 된 NSData 인수가 nil이더라도 nil을 반환합니다. 즉, NSURL은 북마크 데이터를 확인하지 않습니다. 여기에 무슨 일이 일어나는 지 아는 사람이 있습니까? 오류가 발생하면 URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:에 의해 반환 된 오류는

오류 도메인 = NSCocoaErrorDomain 코드 = 259 "올바른 형식이 아니기 때문에 파일을 열 수 없습니다."

@implementation URLFromBookmarkDataTransformer 

+ (BOOL)allowsReverseTransformation { 
    return YES; 
} 

+ (Class)transformedValueClass { 
    return [NSURL class]; 
} 

- (id)transformedValue:(id)value { 
    if (value == nil) { 
     return nil; 
    } 
    NSAssert([value isKindOfClass:[NSData class]], @"value must be NSData"); 
    return [NSURL URLByResolvingBookmarkData:value options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:NULL error:NULL]; 
} 

- (id)reverseTransformedValue:(id)value { 
    if (value == nil) { 
     return nil; 
    } 
    NSAssert([value isKindOfClass:[NSURL class]], @"value must be NSURL"); 
    return [value bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL]; 
} 

@end 

답변

1

내가보고있는 동작의 원인은 파일럿 오류입니다. 위에서 언급 한 값 변환 자 하위 클래스는 NSURL과 책갈피 NSData간에 자연스럽게 변환됩니다. 인 타이틀먼트 파일에 com.apple.security.files.bookmarks.app-scope을 선언해야합니다.