diff --git a/src/ios/PhotoLibraryService.swift b/src/ios/PhotoLibraryService.swift index 9d259da6..5df1fe97 100644 --- a/src/ios/PhotoLibraryService.swift +++ b/src/ios/PhotoLibraryService.swift @@ -513,37 +513,60 @@ final class PhotoLibraryService { return } - let assetsLibrary = ALAssetsLibrary() + func fetchAssets(_ assetUrl: URL) { + let fetchResult = PHAsset.fetchAssets(withALAssetURLs: [assetUrl], options: nil) + var libraryItem: NSDictionary? = nil + if fetchResult.count == 1 { + let asset = fetchResult.firstObject + if let asset = asset { + libraryItem = self.assetToLibraryItem(asset: asset, useOriginalFileNames: false, includeAlbumData: true) + } + } + completion(libraryItem, nil) + } func saveImage(_ photoAlbum: PHAssetCollection) { - assetsLibrary.writeImageData(toSavedPhotosAlbum: sourceData, metadata: nil) { (assetUrl: URL?, error: Error?) in - if error != nil { - completion(nil, "Could not write image to album: \(String(describing: error))") - return + if #available(iOS 9.0, *) { + let imageUrl: URL? = URL(string:url) + + PHPhotoLibrary.shared().performChanges({ + let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: imageUrl!)! + let albumChangeRequest = PHAssetCollectionChangeRequest(for: photoAlbum) + let placeHolder = assetRequest.placeholderForCreatedAsset + albumChangeRequest?.addAssets([placeHolder!] as NSArray) + }) { (isSuccess, error) in + if isSuccess { + fetchAssets(imageUrl!) + } else { + completion(nil, "Could not write video to album: \(String(describing: error)") + } } - guard let assetUrl = assetUrl else { - completion(nil, "Writing image to album resulted empty asset") - return - } + } else { + let assetsLibrary = ALAssetsLibrary() + + assetsLibrary.writeImageData(toSavedPhotosAlbum: sourceData, metadata: nil) { (assetUrl: URL?, error: Error?) in - self.putMediaToAlbum(assetsLibrary, url: assetUrl, album: album, completion: { (error) in if error != nil { - completion(nil, error) - } else { - let fetchResult = PHAsset.fetchAssets(withALAssetURLs: [assetUrl], options: nil) - var libraryItem: NSDictionary? = nil - if fetchResult.count == 1 { - let asset = fetchResult.firstObject - if let asset = asset { - libraryItem = self.assetToLibraryItem(asset: asset, useOriginalFileNames: false, includeAlbumData: true) - } - } - completion(libraryItem, nil) + completion(nil, "Could not write image to album: \(String(describing: error))") + return } - }) + guard let assetUrl = assetUrl else { + completion(nil, "Writing image to album resulted empty asset") + return + } + + self.putMediaToAlbum(assetsLibrary, url: assetUrl, album: album, completion: { (error) in + if error != nil { + completion(nil, error) + } else { + fetchAssets(assetUrl) + } + }) + + } } } @@ -572,8 +595,6 @@ final class PhotoLibraryService { return } - let assetsLibrary = ALAssetsLibrary() - func saveVideo(_ photoAlbum: PHAssetCollection) { // TODO: new way, seems not supports dataURL @@ -583,33 +604,51 @@ final class PhotoLibraryService { // } // UISaveVideoAtPathToSavedPhotosAlbum(videoURL.relativePath!, nil, nil, nil) - if !assetsLibrary.videoAtPathIs(compatibleWithSavedPhotosAlbum: videoURL) { + if #available(iOS 9.0, *) { + PHPhotoLibrary.shared().performChanges({ + let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL)! + let albumChangeRequest = PHAssetCollectionChangeRequest(for: photoAlbum) + let placeHolder = assetRequest.placeholderForCreatedAsset + albumChangeRequest?.addAssets([placeHolder!] as NSArray) + }) { (isSuccess, error) in + if isSuccess { + completion(videoURL, nil) + } else { + completion(nil, "Could not write video to album: \(String(describing: error)") + } + } - // TODO: try to convert to MP4 as described here?: http://stackoverflow.com/a/39329155/1691132 + } else { + let assetsLibrary = ALAssetsLibrary() - completion(nil, "Provided video is not compatible with Saved Photo album") - return - } + if !assetsLibrary.videoAtPathIs(compatibleWithSavedPhotosAlbum: videoURL) { - assetsLibrary.writeVideoAtPath(toSavedPhotosAlbum: videoURL) { (assetUrl: URL?, error: Error?) in + // TODO: try to convert to MP4 as described here?: http://stackoverflow.com/a/39329155/1691132 - if error != nil { - completion(nil, "Could not write video to album: \(String(describing: error))") + completion(nil, "Provided video is not compatible with Saved Photo album") return } - guard let assetUrl = assetUrl else { - completion(nil, "Writing video to album resulted empty asset") - return - } + assetsLibrary.writeVideoAtPath(toSavedPhotosAlbum: videoURL) { (assetUrl: URL?, error: Error?) in - self.putMediaToAlbum(assetsLibrary, url: assetUrl, album: album, completion: { (error) in if error != nil { - completion(nil, error) - } else { - completion(assetUrl, nil) + completion(nil, "Could not write video to album: \(String(describing: error))") + return } - }) + + guard let assetUrl = assetUrl else { + completion(nil, "Writing video to album resulted empty asset") + return + } + + self.putMediaToAlbum(assetsLibrary, url: assetUrl, album: album, completion: { (error) in + if error != nil { + completion(nil, error) + } else { + completion(assetUrl, nil) + } + }) + } } }