0

XPC サービス (以下のコード) で FSEventStream を使用すると大きな問題が発生します。サービスが開始され、ストリームが作成されますが、コールバック関数は呼び出されません。まったく同じコードをメイン アプリケーションにコピーして実行すると、問題なく動作します。XPC サービスで動作しない理由は何ですか? 両方の部分で AppSandbox を無効にしようとしましたが、何も変わりませんでした。これに関するヘルプは大歓迎です。

コード:

- (void)initEventNotificationStreamForPath:(NSString *)path {

NPDLOG(@"Starting up FS event listener for path: %@", path);

NSArray *pathsToWatch = @[path];

FSEventStreamContext context;
context.info = (__bridge void *)self;
context.version = 0;
context.retain = NULL;
context.release = NULL;
context.copyDescription = NULL;

NSTimeInterval latency = 1.0;

_eventStream = FSEventStreamCreate(NULL, &eventNotificationCallback, &context, (__bridge CFArrayRef)pathsToWatch, kFSEventStreamEventIdSinceNow,      //[lastEventID unsignedLongLongValue],
        (CFAbsoluteTime)latency, (kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagFileEvents | kFSEventStreamCreateFlagWatchRoot));

if(_eventStream) {

    NPDLOG(@"Scheduling event stream on runloop");

    FSEventStreamScheduleWithRunLoop(_eventStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

    if(!FSEventStreamStart(_eventStream)) {
        NPDLOG(@"Could NOT start event stream listener!!!");
    }
    else {

        CFStringRef description = FSEventStreamCopyDescription(_eventStream);

        NPDLOG(@"Stream description: %@", description);

        CFRelease(description);
    }
}
else {
    NPDLOG(@"Could NOT create event stream listener!!!");
}
}

私のコールバック関数:

void eventNotificationCallback(ConstFSEventStreamRef streamRef, void *userData, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) {


//[((__bridge NPScannerServiceAgent *)userData).remoteObject didUpdateFilesAtPaths:(__bridge NSArray *)eventPaths];

printf("CALLBACK CALLED!!!\n");

NSLog(@"GOT FS CHANGE NOTIFICATION FROM %@", (__bridge NPScannerServiceAgent *)userData);

size_t i;

for(i = 0; i < numEvents; i++) {

    NSLog(@"Modified path: %@, flags: %d", [(__bridge NSArray *)eventPaths objectAtIndex: i], eventFlags[i]);
}
}
4

1 に答える 1