Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 80 additions & 41 deletions src/ios/PhotoLibraryService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
})

}
}
}

Expand Down Expand Up @@ -572,8 +595,6 @@ final class PhotoLibraryService {
return
}

let assetsLibrary = ALAssetsLibrary()

func saveVideo(_ photoAlbum: PHAssetCollection) {

// TODO: new way, seems not supports dataURL
Expand All @@ -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)
}
})
}
}

}
Expand Down