2013-02-19 32 views
5

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.

+1

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

+0

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

+0

@Nickkk: Prawdopodobnie powinieneś to jeszcze nazwać, po prostu nie zaraz po rozpoczęciu monitorowania. 'dealloc' to prawdopodobnie dobre miejsce. –

Odpowiedz

2

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ć. Ścieżka może być monitorowana tylko pod warunkiem, że masz do niej dostęp.