Files
suixinkan_uikit/suixinkan/Features/ScenicQueue/Services/ScenicQueueQRCodeSaver.swift
2026-07-07 15:32:25 +08:00

56 lines
1.8 KiB
Swift

//
// ScenicQueueQRCodeSaver.swift
// suixinkan
//
import Foundation
import Photos
import UIKit
///
enum ScenicQueueQRCodeSaver {
///
static func saveImage(from urlString: String) async throws {
guard let url = URL(string: urlString) else {
throw ScenicQueueQRCodeSaverError.invalidURL
}
let (data, _) = try await URLSession.shared.data(from: url)
guard let image = UIImage(data: data) else {
throw ScenicQueueQRCodeSaverError.invalidImage
}
try await saveToPhotoLibrary(image)
}
private static func saveToPhotoLibrary(_ image: UIImage) async throws {
let status = PHPhotoLibrary.authorizationStatus(for: .addOnly)
if status == .notDetermined {
_ = await PHPhotoLibrary.requestAuthorization(for: .addOnly)
}
guard PHPhotoLibrary.authorizationStatus(for: .addOnly) == .authorized
|| PHPhotoLibrary.authorizationStatus(for: .addOnly) == .limited else {
throw ScenicQueueQRCodeSaverError.denied
}
try await PHPhotoLibrary.shared().performChanges {
PHAssetChangeRequest.creationRequestForAsset(from: image)
}
}
}
///
enum ScenicQueueQRCodeSaverError: LocalizedError {
case invalidURL
case invalidImage
case denied
var errorDescription: String? {
switch self {
case .invalidURL:
"服务端返回的二维码地址无效"
case .invalidImage:
"下载或保存二维码失败,请检查网络与存储权限"
case .denied:
"未授予权限,无法将小程序码保存到相册"
}
}
}