2015-05-09 9 views
6

In Objective-C gibt es eine Photos Framework a.k.a. PhotoKit, die iOS-Entwicklern den Zugriff auf die Fotobibliothek auf iPhone und iPad ermöglicht und die Bilder/Videos zusammen mit ihre Metadaten.Programmgesteuerter Zugriff auf die Bilderbibliothek unter Mac OS X: PhotoKit/Photos Framework für Mac

Wie würden Mac-Entwickler eine ähnliche Aufgabe ausführen? Es scheint, dass PhotoKit nur in iOS 8.0 verfügbar ist. Gibt es ein Äquivalent zum Photos Framework für Mac OS X?

+0

https://developer.apple. com/library/mac/dokumentation/MediaLibrary/Referenz/MediaLibraryFrameworkReference/index.html #/apple_ref/doc/uid/TP40012956 – matt

+0

Danke matt! Das macht den Trick! –

+0

Die oben erwähnte Webseite von PhotoKit sagt, dass es auch für "macOS 10.11+" verfügbar ist. – Gabriel

Antwort

10

Die Media Library Framework ist der Ort zu gehen.

Verbrauch:

@import MediaLibrary; 

- (void) awakeFromNib 
{ 
    NSDictionary *options = @{ 
    MLMediaLoadSourceTypesKey: @(MLMediaSourceTypeImage), 
    MLMediaLoadIncludeSourcesKey: @[MLMediaSourcePhotosIdentifier] 
    }; 

    MLMediaLibrary *mediaLibrary = [[MLMediaLibrary alloc] initWithOptions:options]; 
    self.mediaLibrary = mediaLibrary; 

    [mediaLibrary addObserver:self 
       forKeyPath:@"mediaSources" 
        options:0 
        context:(__bridge void *)@"mediaLibraryLoaded"]; 

    [mediaLibrary mediaSources]; // returns nil and starts asynchronous loading 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context 
{ 
    if (context == (__bridge void *)@"mediaLibraryLoaded") { 
     // Media Library is loaded now, we can access mediaSources 
     MLMediaSource *mediaSource = [self.mediaLibrary.mediaSources objectForKey:@"com.apple.Photos"]; 
    } 
} 

Das Konzept hinter der Bibliothek ist, dass Sie es fordern Sie ein Attribut eines Objekts zu lesen, die eine leere Referenz zurückgibt. Dann abonnieren Sie dieses Attribut mit einem Schlüssel-Wert-Beobachter und Sie warten, bis es geladen ist. Dann können Sie das nächste Kind mit dem gleichen Prinzip abrufen und so weiter ...

+0

Ich habe Schwierigkeiten, Zugriff auf die einzelnen Fotos aus diesem Codebeispiel zu bekommen. Jede Änderung, die Sie zur Verwendung der MLMediaSource durchführen könnten? Die Dokumentation ist [wirklich schlecht] (http://stackoverflow.com/q/34835821/1418688) ... – Nerrolken

+0

Ich stimme zu, die Dokumentation ist nicht klar und Sie müssen Dinge mit dem Debugger ausprobieren, um herauszufinden, wie gehen Sie zu den MLMediaObjects ... –

+0

wie auf Fotos Bibliothek Bilder von Pfad zugreifen? Die Bibliothek für Beispielfotos befindet sich in /Users/admin/Desktop/xyz.photoslibrary. –

4

Basierend auf Pierre F Antwort I-Code erweitern für URLs für alle Fotos anzuzeigen:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    NSDictionary *options = @{ 
           MLMediaLoadSourceTypesKey: @(MLMediaSourceTypeImage), 
           MLMediaLoadIncludeSourcesKey: @[MLMediaSourcePhotosIdentifier] 
           }; 

    self.mediaLibrary = [[MLMediaLibrary alloc] initWithOptions:options]; 

    [self.mediaLibrary addObserver:self 
         forKeyPath:@"mediaSources" 
          options:0 
          context:(__bridge void *)@"mediaLibraryLoaded"]; 

    [self.mediaLibrary.mediaSources objectForKey:MLMediaSourcePhotosIdentifier]; 
} 


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context 
{ 
    MLMediaSource *mediaSource = [self.mediaLibrary.mediaSources objectForKey:MLMediaSourcePhotosIdentifier]; 

    if (context == (__bridge void *)@"mediaLibraryLoaded") 
    { 
     [mediaSource addObserver:self 
          forKeyPath:@"rootMediaGroup" 
           options:0 
           context:(__bridge void *)@"rootMediaGroupLoaded"]; 

     [mediaSource rootMediaGroup]; 
    } 
    else if (context == (__bridge void *)@"rootMediaGroupLoaded") 
    { 
     MLMediaGroup *albums = [mediaSource mediaGroupForIdentifier:@"TopLevelAlbums"]; 

     for (MLMediaGroup *album in albums.childGroups) 
     { 
      NSString *albumIdentifier = [album.attributes objectForKey:@"identifier"]; 

      if ([albumIdentifier isEqualTo:@"allPhotosAlbum"]) 
      { 
       self.allPhotosAlbum = album; 

       [album addObserver:self 
         forKeyPath:@"mediaObjects" 
          options:0 
          context:@"mediaObjects"]; 

       [album mediaObjects]; 

       break; 
      } 
     } 
    } 
    else if (context == (__bridge void *)@"mediaObjects") 
    { 
     NSArray * mediaObjects = self.allPhotosAlbum.mediaObjects; 

     for(MLMediaObject * mediaObject in mediaObjects) 
     { 
      NSURL * url = mediaObject.URL; 

      NSLog(url.path); 
     } 
    } 
} 
+0

Das sieht fantastisch aus, ich werde es ausprobieren, sobald ich nach Hause komme! Ich bin neugierig, haben Sie irgendwelche Ideen, wie Sie den GPS-Standort von einem MLMediaObject bekommen können? Ich habe [eine Frage dazu] (http://stackoverflow.com/q/34932712/1418688) gerade geöffnet, und es gibt überraschend wenig Informationen über das Medienbibliothek-Framework im Allgemeinen. – Nerrolken

+0

Übrigens, ich habe versucht, Ihre Antwort auf meine andere Frage zu akzeptieren, aber sie scheint gelöscht worden zu sein? Wenn du es mit diesem Code erneut versendest, werde ich dir heute Abend das Kopfgeld gutschreiben! :) – Nerrolken

+0

Ich habe versucht, Ihrem Beispiel zu folgen, aber was ist @keypath? Xcode (7.2.1) beschwert sich, und Google war zu keiner Hilfe :( –