Tôi đã viết một tiện ích mở rộng có tính đến tất cả các trường hợp có thể xảy ra:
- Nếu quyền truy cập được cho phép, thì mã
onAccessHasBeenGranted
sẽ được chạy.
- Nếu quyền truy cập không được xác định, thì
requestAuthorization(_:)
sẽ được gọi.
- Nếu người dùng đã từ chối quyền truy cập thư viện ảnh ứng dụng của bạn, thì người dùng sẽ được hiển thị một cửa sổ đề nghị chuyển đến cài đặt và cho phép truy cập. Trong cửa sổ này, các nút "Hủy" và "Cài đặt" sẽ có sẵn cho anh ta. Khi anh ấy nhấn nút "cài đặt", cài đặt ứng dụng của bạn sẽ mở ra.
Ví dụ sử dụng:
PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: {
})
Mã phần mở rộng:
import Photos
import UIKit
public extension PHPhotoLibrary {
static func execute(controller: UIViewController,
onAccessHasBeenGranted: @escaping () -> Void,
onAccessHasBeenDenied: (() -> Void)? = nil) {
let onDeniedOrRestricted = onAccessHasBeenDenied ?? {
let alert = UIAlertController(
title: "We were unable to load your album groups. Sorry!",
message: "You can enable access in Privacy Settings",
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Settings", style: .default, handler: { _ in
if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(settingsURL)
}
}))
controller.present(alert, animated: true)
}
let status = PHPhotoLibrary.authorizationStatus()
switch status {
case .notDetermined:
onNotDetermined(onDeniedOrRestricted, onAccessHasBeenGranted)
case .denied, .restricted:
onDeniedOrRestricted()
case .authorized:
onAccessHasBeenGranted()
@unknown default:
fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
}
}
}
private func onNotDetermined(_ onDeniedOrRestricted: @escaping (()->Void), _ onAuthorized: @escaping (()->Void)) {
PHPhotoLibrary.requestAuthorization({ status in
switch status {
case .notDetermined:
onNotDetermined(onDeniedOrRestricted, onAuthorized)
case .denied, .restricted:
onDeniedOrRestricted()
case .authorized:
onAuthorized()
@unknown default:
fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
}
})
}