2013-02-19 2 views
5

샌드 박스 응용 프로그램에서 FSEvents를 사용하여 일부 디렉토리를 모니터하려고합니다. 나는 다음과 같은 클래스 구현 :샌드 박스 응용 프로그램에서 FSEvents 사용

@implementation SNTracker 

- (id)initWithPaths:(NSArray *)paths { 
    self=[super init]; 
    if (self) { 
     trackedPaths=paths; 
     CFTimeInterval latency=1.0; 
     FSEventStreamContext context={0,(__bridge void *)self,NULL,NULL,NULL}; 
     FSEventStreamRef eeventStream=FSEventStreamCreate(kCFAllocatorDefault,&callback,&context,(__bridge CFArrayRef)trackedPaths,kFSEventStreamEventIdSinceNow,latency,kFSEventStreamCreateFlagUseCFTypes|kFSEventStreamCreateFlagWatchRoot|kFSEventStreamCreateFlagFileEvents); 
     FSEventStreamScheduleWithRunLoop(eeventStream,[[NSRunLoop mainRunLoop] getCFRunLoop],kCFRunLoopDefaultMode); 
     FSEventStreamStart(eeventStream); 
    } 
    return self; 
} 

static void callback(ConstFSEventStreamRef streamRef,void *clientCallBackInfo,size_t numEvents,void *eventPaths,const FSEventStreamEventFlags eventFlags[],const FSEventStreamEventId eventIds[]) { 
    NSLog(@"asd"); 
} 

문제는 "ASD는"인쇄 결코 극복한다는 것이다 (즉 콜백 함수가 호출되지 않습니다). Xcode의 내 주요 대상 요약에서 "앱 샌드 박스 사용"을 비활성화하면 콜백이 호출됩니다. 내가 뭔가 잘못하고 있는거야? 샌드 박스 응용 프로그램에 부여한 유일한 권한은 사용자가 선택한 파일에 대한 읽기/쓰기 액세스 권한입니다.

+1

그리고 usere가 FSEvent를 통해 모니터링하려는 경로를 선택 했습니까? 그가하지 않으면, 당신은 그것에 접근하는 것을 허락하지 않을 것이고 따라서 또한 그것을 모니터하지 않을 것입니다. – Mecki

+0

너는 나의 구원이야! '[myURL startAccessingSecurityScopedResource]'뿐만 아니라'[myURL stopAccessingSecurityScopedResource]'도 호출 했으므로 마지막 호출을 제거하면 문제가 해결됩니다. 귀하의 의견을 답으로 추가하여 해결해 드릴 수 있습니다 :-) – Nickkk

+0

@Nickkk : 모니터링을 시작한 직후에 결국은 여전히 ​​전화해야합니다. 'dealloc'은 아마도 좋은 장소 일 것입니다. –

답변

2

그리고 usere가 FSEvent를 통해 모니터링하려는 경로를 선택 했습니까? 그가하지 않으면, 당신은 그것에 접근하는 것을 허락하지 않을 것이고 따라서 또한 그것을 모니터하지 않을 것입니다. 경로는 사용자가 액세스 할 수있는 경우에만 모니터 할 수 있습니다.

관련 문제