Ios 无法将UIImage保存到Swift 5 XCode 11.6中的摄影机卷
我正在尝试将生成的UIImage保存到相机卷 我在Info.plist中有必要的隐私字符串 我尝试了两种方法 PHPhotoLibrary面临的错误是Ios 无法将UIImage保存到Swift 5 XCode 11.6中的摄影机卷,ios,swift,uiimage,phphotolibrary,Ios,Swift,Uiimage,Phphotolibrary,我正在尝试将生成的UIImage保存到相机卷 我在Info.plist中有必要的隐私字符串 我尝试了两种方法 PHPhotoLibrary面临的错误是 Error Domain=com.apple.accounts Code=7 "(null) 我尝试过的代码 UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil); 二是, PHPhotoLibrary.shared().savePhoto(image: image!, albu
Error Domain=com.apple.accounts Code=7 "(null)
我尝试过的代码
UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil);
二是,
PHPhotoLibrary.shared().savePhoto(image: image!, albumName: "AlbumName", completion: { (asset) in
if asset != nil
{
print("error")
}
})
func savePhoto(image:UIImage, albumName:String, completion:((PHAsset?)->())? = nil) {
func save() {
if let album = PHPhotoLibrary.shared().findAlbum(albumName: albumName) {
PHPhotoLibrary.shared().saveImage(image: image, album: album, completion: completion)
} else {
PHPhotoLibrary.shared().createAlbum(albumName: albumName, completion: { (collection) in
if let collection = collection {
PHPhotoLibrary.shared().saveImage(image: image, album: collection, completion: completion)
} else {
completion?(nil)
}
})
}
}
if PHPhotoLibrary.authorizationStatus() == .authorized {
save()
} else {
PHPhotoLibrary.requestAuthorization({ (status) in
if status == .authorized {
save()
}
})
}
}
// MARK: - Private
fileprivate func findAlbum(albumName: String) -> PHAssetCollection? {
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
let fetchResult : PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)
guard let photoAlbum = fetchResult.firstObject else {
return nil
}
return photoAlbum
}
fileprivate func createAlbum(albumName: String, completion: @escaping (PHAssetCollection?)->()) {
var albumPlaceholder: PHObjectPlaceholder?
PHPhotoLibrary.shared().performChanges({
let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: albumName)
albumPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection
}, completionHandler: { success, error in
if success {
guard let placeholder = albumPlaceholder else {
completion(nil)
return
}
let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
guard let album = fetchResult.firstObject else {
completion(nil)
return
}
completion(album)
} else {
completion(nil)
}
})
}
fileprivate func saveImage(image: UIImage, album: PHAssetCollection, completion:((PHAsset?)->())? = nil) {
var placeholder: PHObjectPlaceholder?
PHPhotoLibrary.shared().performChanges({
let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album),
let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else { return }
placeholder = photoPlaceholder
let fastEnumeration = NSArray(array: [photoPlaceholder] as [PHObjectPlaceholder])
albumChangeRequest.addAssets(fastEnumeration)
}, completionHandler: { success, error in
guard let placeholder = placeholder else {
completion?(nil)
return
}
if success {
let assets:PHFetchResult<PHAsset> = PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
let asset:PHAsset? = assets.firstObject
completion?(asset)
} else {
completion?(nil)
}
})
}
PHPhotoLibrary.shared().savePhoto(图像:image!,相册名称:“相册名称”,完成:{(资产)in
如果资产!=零
{
打印(“错误”)
}
})
func savePhoto(图像:UIImage,相册名称:String,完成:((相集?->())?=nil){
func save(){
如果let album=PHPhotoLibrary.shared().findAlbum(albumName:albumName){
PHPhotoLibrary.shared().saveImage(图像:图像,相册:相册,完成:完成)
}否则{
PHPhotoLibrary.shared().createAlbum(albumName:albumName,完成:{(集合)在中)
如果let collection=collection{
PHPhotoLibrary.shared().saveImage(图像:图像,相册:收藏,完成:完成)
}否则{
完成?(无)
}
})
}
}
如果PHPhotoLibrary.authorizationStatus()==.authorized{
保存()
}否则{
PHPhotoLibrary.requestAuthorization({(状态)在
如果状态==。已授权{
保存()
}
})
}
}
//马克:二等兵
fileprivate func findAlbum(相册名称:字符串)->PHAssetCollection?{
让fetchOptions=PHFetchOptions()
fetchOptions.predicate=NSPredicate(格式:“title=%@”,albumName)
让fetchResult:PHFetchResult=PHAssetCollection.fetchAssetCollections(带:。相册,子类型:。任意,选项:fetchOptions)
guard let photoAlbum=fetchResult.firstObject else{
归零
}
返回相册
}
fileprivate func createAlbum(albumName:String,完成:@escaping(PHAssetCollection?)->()){
var albumPlaceholder:PHObjectPlaceholder?
PHPhotoLibrary.shared().performChanges({
让createAlbumRequest=PhaseSetCollectionChangeRequest.creationRequestForAssetCollection(标题:albumName)
albumPlaceholder=createAlbumRequest.placeholderForCreatedAssetCollection
},completionHandler:{成功,出现错误
如果成功{
guard let占位符=相册占位符else{
完成(无)
返回
}
让fetchResult=PHAssetCollection.fetchAssetCollections(带localIdentifier:[placeholder.localIdentifier],选项:nil)
guard let album=fetchResult.firstObject else{
完成(无)
返回
}
完成(专辑)
}否则{
完成(无)
}
})
}
fileprivate func saveImage(图像:UIImage,相册:PHAssetCollection,完成:((PHAsset?->())?=nil){
变量占位符:对象占位符?
PHPhotoLibrary.shared().performChanges({
让createAssetRequest=PHAssetChangeRequest.creationRequestForAsset(from:image)
guard let albumChangeRequest=PhaseSetCollectionChangeRequest(对于:album),
让photoPlaceholder=createAssetRequest.PlaceholderForCreateAsset else{return}
占位符=照片占位符
让fastEnumeration=NSArray(数组:[photoPlaceholder]作为[PHObjectPlaceholder])
albumChangeRequest.addAssets(fastEnumeration)
},completionHandler:{成功,出现错误
guard let占位符=占位符else{
完成?(无)
返回
}
如果成功{
let assets:PHFetchResult=PHAsset.fetchAssets(带localIdentifier:[占位符.localIdentifier],选项:nil)
let asset:PHAsset?=assets.firstObject
完成?(资产)
}否则{
完成?(无)
}
})
}
你能帮我弄清楚这件事吗
比尔
埃尔德姆我已经弄明白了
问题是我一直在创建QR图像,它是用CIFilter is CIImage创建的
它返回错误代码=-1
您需要从CGImage而不是CIImage创建UIImage
if let output = filter.outputImage?.transformed(by: transform) {
let context = CIContext()
guard let cgImage = context.createCGImage(output, from: output.extent) else { return nil }
return UIImage(cgImage: cgImage)
}尝试将代码移出保存方法。顺便说一句,在获取内容之前,使用register(:)方法观察照片库的更改。用户授予对应用程序照片库的访问权限后,照片会发送更改消息,以更改您之前检索到的任何空提取结果,通知您这些提取的库内容现在可用。