Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将UIImage保存到Swift 5 XCode 11.6中的摄影机卷_Ios_Swift_Uiimage_Phphotolibrary - Fatal编程技术网

Ios 无法将UIImage保存到Swift 5 XCode 11.6中的摄影机卷

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

我正在尝试将生成的UIImage保存到相机卷

我在Info.plist中有必要的隐私字符串

我尝试了两种方法

PHPhotoLibrary面临的错误是

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(:)方法观察照片库的更改。用户授予对应用程序照片库的访问权限后,照片会发送更改消息,以更改您之前检索到的任何空提取结果,通知您这些提取的库内容现在可用。