56 lines
1.8 KiB
Swift
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:
|
|
"未授予权限,无法将小程序码保存到相册"
|
|
}
|
|
}
|
|
}
|