I am working on an Iphone app and I can enumerate assets using the Assetslibrary and load them into a table view. The user can delete a row (a picture / video) in the app but how do I UPDATE the Iphone photo album directly from my app? Otherwise on refreshing, the tableview will reload the previously deleted asset.
问题:
回答1:
Possible duplication of https://stackoverflow.com/a/11058934/300292. Simple answer: you can't. The Photos app is the only place you can delete assets. Which is probably a good thing--you wouldn't want any willy-nilly app to be able to delete all your photos, would you?
回答2:
in ios8 deleting photos is possible using the Photos Framework
Please check the documentation of Photos Framework
For deleting assets refer to PHAssetChangeRequest
+ (void)deleteAssets:(id<NSFastEnumeration>)assets
where assets
is an array of PHAsset
objects to be deleted.
+
For deleting collections refer to PHAssetCollectionChangeRequest
+ (void)deleteAssetCollections:(id<NSFastEnumeration>)assetCollections
https://developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassets
https://developer.apple.com/documentation/photos/phassetcollectionchangerequest/1619453-deleteassetcollections
回答3:
As Ted said, this is now possible in iOS 8 using the Photos service. It's pretty clean actually. You need to submit a change request to the photolibrary. Here's an example.
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest deleteAssets:arrayOfPHAssets];
} completionHandler:^(BOOL success, NSError *error) {
NSLog(@"Finished deleting asset. %@", (success ? @"Success." : error));
}];
Make sure you've imported Photos, and gotten authorization from the user. (Which you probably did to show the image already)
PHAssetchangeRequest - deleteAssets https://developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassets PHPhotoLibrary Class - authorizationStatus https://developer.apple.com/documentation/photos/phphotolibrary/1620745-authorizationstatus
回答4:
It late but for other users it will help.
As we know only the photos app can delete images. In such situation, i retrieved all images from photos via alassets, viewed them in custom gallery, given user a option to select multiple images from assets to save them in phone directory. Next i am using my app gallery instead of photos gallery. I have given the option in the app to import images from photos to app gallery (which is a document directory folder of images) at any time in the app.
回答5:
Adding an answer to an old question here, because we are often asked for Screenshot prevention as part of a Data-Loss-Prevention (DLP) solution. You can (a) register for screenshot notifications and (b) ask the user to delete when it occurs, but there's no way to do it silently or secretly. Here's a full working code example:
func applicationDidBecomeActive(application: UIApplication) {
registerForScreenShotNotifications()
}
func registerForScreenShotNotifications() {
NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationUserDidTakeScreenshotNotification, object: nil, queue: NSOperationQueue.mainQueue()) { (notification) in
print("Yep they took a screenshot \(notification)")
let assetToDelete = self.getLastImage()
if let assetToDelete = assetToDelete
{
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
PHAssetChangeRequest.deleteAssets([assetToDelete])
}, completionHandler: { (success, error) in
print("Success \(success) - Error \(error)")
})
}
}
}
// NOTE : You should ask for permission to access photos before this
func getLastImage() -> PHAsset? {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]
let fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions)
let newestAsset = fetchResult.lastObject
return newestAsset as! PHAsset?
}
The result is this: