在沙盒应用中使用FSEvents

6

我正在尝试在我的沙盒应用程序中使用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
用户是否已经通过FSEvent选择了您要监视的路径?如果没有,您将无法访问它,因此也无法监视它。 - Mecki
你是我的救星!我一直在调用 [myURL startAccessingSecurityScopedResource][myURL stopAccessingSecurityScopedResource],但是移除最后一个调用就解决了我的问题。请将您的评论作为答案添加,这样我就可以将其标记为已解决 :-) - Nickkk
@Nickkk:你可能还是应该在适当的时候调用它,只是不要在开始监视后立即调用。dealloc可能是一个不错的选择。 - Peter Hosey
1个回答

3

如果用户没有选择您要通过FSEvent监视的路径,那么您将无法访问它,因此也无法监视它。只有在您被允许访问时,才能监视路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接