2013-02-19 14 views
5

Ich versuche, FSEvents in meiner Sandbox-App zu verwenden, um einige Verzeichnisse zu überwachen. Ich habe folgende Klasse implementiert:Verwenden Sie FSEvents in Sandkasten-App

@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"); 
} 

Das Problem ist, dass „asd“ nie gedruckt wird (das heißt Funktion der Rückruf aufgerufen wird nie). Wenn ich "App Sandboxing aktivieren" in der Zusammenfassung meines Hauptziels in Xcode deaktiviere, wird der Rückruf aufgerufen. Mache ich etwas falsch? Die einzige Berechtigung, die ich der Sandbox-App gegeben habe, ist der Lese-Schreib-Zugriff auf benutzerdefinierte Dateien.

+1

Und der Benutzer hat den Pfad ausgewählt, den Sie über FSEvent überwachen möchten? Denn wenn er es nicht getan hat, ist es nicht erlaubt, darauf zuzugreifen und es somit auch nicht zu überwachen. – Mecki

+0

Du bist meine Rettung! Ich rief '[myURL startAccessingSecurityScopedResource]' 'aber auch' [myURL stopAccessingSecurityScopedResource] '' auf, so dass das Entfernen des letzten Anrufs mein Problem löst. Bitte füge deinen Kommentar als Antwort hinzu, damit ich es als gelöst ankreuzen kann :-) – Nickkk

+0

@Nickkk: Du solltest das wahrscheinlich irgendwann noch anrufen, einfach nicht richtig nachdem du mit dem Monitoring angefangen hast. 'dealloc' ist wahrscheinlich ein guter Ort. –

Antwort

2

Und der Benutzer hat den Pfad ausgewählt, den Sie über FSEvent überwachen möchten? Denn wenn er es nicht getan hat, ist es nicht erlaubt, darauf zuzugreifen und es somit auch nicht zu überwachen. Ein Pfad kann nur überwacht werden, solange Sie darauf zugreifen dürfen.