2013-02-19 67 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 2013-02-19 12:46:40

+0

你是我的救恩!我正在调用'[myURL startAccessingSecurityScopedResource]',还有'[myURL stopAccessingSecurityScopedResource]',所以删除最后一次调用解决了我的问题。请添加您的评论作为答案,所以我可以打勾它解决:-) – Nickkk 2013-02-19 13:35:24

+0

@Nickkk:你可能应该仍然打电话给你,最后只是不正确的,你开始监测后。 'dealloc'可能是一个好地方。 – 2013-02-19 19:17:56

回答

2

并且usere已经选择了你想要通过FSEvent监视的路径吗?因为如果他没有,你将不会被允许访问它,因此也不会监控它。只有您可以访问路径,才能监控路径。