私はiPhoneアプリに取り組んでおり、Assetslibraryを使用してアセットを列挙し、それらをテーブルビューにロードできます。ユーザーはアプリの行(写真/ビデオ)を削除できますが、iPhoneのフォトアルバムをアプリから直接更新するにはどうすればよいですか?それ以外の場合、更新時に、テーブルビューは以前に削除されたアセットを再読み込みします。
5 に答える
iOS8では、PhotosFrameworkを使用して写真を削除できます
PhotosFrameworkのドキュメントを確認してください
アセットの削除については、PHAssetChangeRequestを参照してください
+ (void)deleteAssets:(id<NSFastEnumeration>)assets
ここで、は削除するオブジェクトassets
の配列です。PHAsset
+
コレクションの削除については、PHAssetCollectionChangeRequestを参照してください。
+ (void)deleteAssetCollections:(id<NSFastEnumeration>)assetCollections
https://developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassets
https://developer.apple.com/documentation/photos/phassetcollectionchangerequest/1619453-deleteassetcollections
Tedが言ったように、これはiOS8でPhotosサービスを使用して可能になりました。実はかなりきれいです。フォトライブラリに変更リクエストを送信する必要があります。これが例です。
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest deleteAssets:arrayOfPHAssets];
} completionHandler:^(BOOL success, NSError *error) {
NSLog(@"Finished deleting asset. %@", (success ? @"Success." : error));
}];
写真をインポートし、ユーザーから承認を得ていることを確認してください。(おそらく、すでに画像を表示するために行ったものです)
PHAssetchangeRequest-deleteAssetshttps : //developer.apple.com/documentation/photos/phassetchangerequest/1624062-deleteassetsPHPhotoLibraryクラス -authorizationStatushttps: //developer.apple.com/documentation/photos/phphotolibrary/1620745-authorizationstatus
遅くなりますが、他のユーザーにとっては役に立ちます。
私たちが知っているように、写真アプリだけが画像を削除できます。このような状況では、アラセットを介して写真からすべての画像を取得し、カスタムギャラリーで表示し、アセットから複数の画像を選択して電話帳に保存するオプションをユーザーに提供しました。次に、写真ギャラリーの代わりにアプリギャラリーを使用しています。アプリ内でいつでも写真からアプリギャラリー(画像のドキュメントディレクトリフォルダー)に画像をインポートするオプションをアプリに指定しました。
データ損失防止(DLP)ソリューションの一部としてスクリーンショット防止を求められることが多いため、ここに古い質問への回答を追加します。(a)スクリーンショット通知に登録し、(b)発生時に削除するようにユーザーに依頼することはできますが、黙ってまたは密かに行う方法はありません。完全に機能するコード例を次に示します。
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?
}
結果は次のとおりです。
https://stackoverflow.com/a/11058934/300292の重複の可能性。簡単な答え:できません。写真アプリは、アセットを削除できる唯一の場所です。これはおそらく良いことです。意地悪なアプリですべての写真を削除できるようにしたくないのではないでしょうか。