2010-01-31 5 views
10

Gibt es eine Möglichkeit, ein Bild zu löschen, das von UIImagePickerController in meine App geladen wird?Ein Foto aus der Fotobibliothek des Benutzers löschen?

Ich möchte in der Lage sein, das Bild aus der Fotobibliothek des Benutzers zu löschen, wenn der Benutzer eine bestimmte Aktion ausführt.

Ich fordere den Benutzer auf, ein Bild aus seiner Bibliothek auszuwählen, dann wird es in meine App geladen, zu diesem Zeitpunkt führt die App einige shnozzy-Animationen durch und löscht dann das Bild.

Bitte helfen!

Antwort

15

Apple gestattet Ihnen nicht, aus der Fotobibliothek über eine API zu löschen. Der Benutzer muss tatsächlich zur Fotos App gehen und sie manuell löschen. Apple ermöglicht es Ihnen, auf die Foto-Bibliothek schreiben:

ein Standbild zu speichern, um die Gesicherte Fotos Album des Benutzers, verwenden Sie die UIImageWriteToSavedPhotosAlbum Funktion. Um einen Film im Album Gespeicherte Fotos des Benutzers zu speichern, verwenden Sie die Funktion UISaveVideoAtPathToSavedPhotosAlbum .

Aber zum Löschen und Bearbeiten/Überschreiben eines vorhandenen Fotos hat Apple gerade nichts dergleichen.

+0

Können wir nicht fordern Sie eine Löschung Fotos Framework? Ich denke, ja, wir können. –

+0

PHAssetChangeRequest.deleteAssets ([AssetToDelete]) –

+0

https://developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassets –

10

Tatsächlich können Sie Fotos löschen, die von Ihrer App gespeichert wurden (gespeichert in der Fotobibliothek mit dem Aufruf von UIImageWriteToSavedPhotosAlbum API).

Die dokumentierte API [ALAsset setImageData:metadata:completionBlock:] funktioniert.

1). Fügen Sie Ihrem Projekt ein Bild "photo.jpg" hinzu

2). Speichern Sie ein Bild in der Asset-Bibliothek:

ALAssetsLibrary *lib = [ALAssetsLibrary new]; 
UIImage *image = [UIImage imageNamed:@"photo.jpg"]; 
[lib writeImageToSavedPhotosAlbum:image.CGImage metadata:@{} completionBlock:^(NSURL *assetURL, NSError *error) { 
    NSLog(@"Write image %@ to asset library. (Error %@)", assetURL, error); 
}]; 

3). Gehe zur Standardgalerie, du wirst photo.jpg in deinem Album "Gespeicherte Fotos" finden.

4). Löschen Sie dieses Bild aus der Objektbibliothek:

ALAssetsLibrary *lib = [ALAssetsLibrary new]; 
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
    [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) { 
     if(asset.isEditable) { 
      [asset setImageData:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { 
       NSLog(@"Asset url %@ should be deleted. (Error %@)", assetURL, error); 
      }]; 
     } 
    }]; 
} failureBlock:^(NSError *error) { 

}]; 

5). Gehe zur Standardgalerie, du wirst feststellen, dass photo.jpg bereits gelöscht wurde.

+0

Es funktioniert :). Die Funktion setImageData: metaData: completionBlock wird verwendet, um ein Bild zu ersetzen und nicht gemäß den Apple-Dokumenten zu löschen. Sind Sie sicher, dass es keine Probleme mit dem AppStore geben wird? – Sukhrob

+1

Ich habe bereits eine App im Apple Store, dies ist eine öffentliche API, kein Problem im App-Review-Prozess. – evanchin

+0

Das hat auch für mich funktioniert. Vielen Dank! –

0

Ja, wir können ein Foto löschen. Wir können PHAssetChangeRequest für diesen Vorgang verwenden.

Von Apple:

Eine Anforderung zu erstellen, löschen, ändern Metadaten oder den Inhalt eines Fotos Asset bearbeiten, für die Verwendung in einem Foto-Bibliothek Änderungsblock.

class func deleteAssets(_ assets: NSFastEnumeration) 

wo Vermögenswerte: Ein Array von PHAsset Objekte gelöscht werden.

PHAssetChangeRequest.deleteAssets([assetToDelete]) 

So können Sie den obigen Code verwenden, um Assets zu löschen.

unten ist schnell 3-Code,

PHPhotoLibrary.shared().performChanges({ 
      let imageAssetToDelete = PHAsset.fetchAssets(withALAssetURLs: imageUrls as! [URL], options: nil) 
      PHAssetChangeRequest.deleteAssets(imageAssetToDelete) 
     }, completionHandler: {success, error in 
      print(success ? "Success" : error) 
     })