Próbuję użyć zdarzeń FSEvent w mojej aplikacji piaskownicy, aby monitorować niektóre katalogi. I wdrożone następujące klasy:Używanie zdarzeń FSEvent w aplikacji piaskowanej
@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");
}
Problem polega na tym, że „asd” nigdy nie zostanie wydrukowany (tj funkcja zwrotna nigdy nazywa). Kiedy wyłączę "Włącz aplikację Sandboxing" w Podsumowaniu mojego głównego celu w Xcode, wywoływane jest wywołanie zwrotne. czy robię coś źle? Jedynym uprawnieniem, które dałem aplikacji piaskownicy jest dostęp do odczytu i zapisu do wybranych przez użytkownika plików.
A usere wybrało ścieżkę, którą próbujesz monitorować przez FSEvent? Skoro tego nie zrobił, nie dostaniesz pozwolenia na dostęp do niego, a zatem nie będziesz go monitorować. – Mecki
Jesteś moim zbawieniem! Nazwałem '[myURL startAccessingSecurityScopedResource]' ale także '[myURL stopAccessingSecurityScopedResource]', więc usunięcie ostatniego połączenia rozwiązuje mój problem. Dodaj komentarz jako odpowiedź, więc mogę zaznaczyć to jako rozwiązane :-) – Nickkk
@Nickkk: Prawdopodobnie powinieneś to jeszcze nazwać, po prostu nie zaraz po rozpoczęciu monitorowania. 'dealloc' to prawdopodobnie dobre miejsce. –