一揭蜒、獲取權(quán)限
1.1、獲取相冊(cè)權(quán)限(是否是首次獲取)
需要在info.plist增加相冊(cè)隱私權(quán)限:NSPhotoLibraryUsageDescription
/// 檢查相冊(cè)存取權(quán)限,如有必要?jiǎng)t向系統(tǒng)申請(qǐng)
/// iOS14之后使用之前的獲取狀態(tài)請(qǐng)求(limited和authorized都會(huì)返回authorized)
/// status:用戶設(shè)置的權(quán)限
/// firstDetermined:是否是首次設(shè)置權(quán)限
class func checkAuthorizationStatus(_ handler: @escaping (_ status: PHAuthorizationStatus,_ firstDetermined: Bool) -> Void) {
var authorizationStatus = PHPhotoLibrary.authorizationStatus()
if #available(iOS 14, *) {
authorizationStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite)
}
if authorizationStatus == .notDetermined {
if #available(iOS 14, *) {
PHPhotoLibrary.requestAuthorization(for: .readWrite) { (status) in
handler(status, true)
}
} else {
PHPhotoLibrary.requestAuthorization { (status) in
handler(status, true)
}
}
} else {
handler(authorizationStatus, false)
}
}
1.2剔桨、獲取相機(jī)權(quán)限
需要在info.plist增加相機(jī)隱私權(quán)限:NSCameraUsageDescription
func requestCamera() {
AVCaptureDevice.requestAccess(for: .video) { (cameraGranted) in
if cameraGranted {
print("允許APP訪問(wèn)相機(jī)")
} else {
print("拒絕APP訪問(wèn)相機(jī)")
}
}
}
1.3屉更、獲取麥克風(fēng)權(quán)限
需要在info.plist增加麥克風(fēng)隱私權(quán)限:NSMicrophoneUsageDescription
func requestAudio(cameraAllowed: Bool) {
AVCaptureDevice.requestAccess(for: .audio) { (audioGranted) in
if audioGranted {
print("允許APP訪問(wèn)麥克風(fēng)")
} else {
print("拒絕APP訪問(wèn)麥克風(fēng)")
}
}
}
二、資源類型相關(guān)API
2.1洒缀、判斷資源是否是iCloud
/*
判斷是否是iCloud照片
asset:資源對(duì)象
reseult: true為本地資源瑰谜,false為iCloud資源
*/
@objc open class func judgeAssetis(inLocalAblum asset: PHAsset?) -> Bool {
var result = false
if let pAsset = asset {
if #available(iOS 10.0, *) {
let resourceArray = PHAssetResource.assetResources(for: pAsset)
if resourceArray.count > 0 {
if let iCloud: Bool = resourceArray.first?.value(forKey: "locallyAvailable") as? Bool, iCloud == true {
return true
}
}
}
let option = PHImageRequestOptions()
/// 不允許網(wǎng)絡(luò)請(qǐng)求(iCloud資源獲取失敗)
option.isNetworkAccessAllowed = false
/// 設(shè)置為同步請(qǐng)求
option.isSynchronous = true
if let asset = asset {
PHCachingImageManager.default().requestImageData(for: asset, options: option, resultHandler: { imageData, _, _, _ in
result = imageData != nil ? true : false
})
}
return result
}
return true
}
2.2、照片下載
// 下載照片原圖
@objc open class func requestImageData(for asset: PHAsset, options: PHImageRequestOptions?, resultHandler: @escaping (Data?, String?, UIImage.Orientation, [AnyHashable: Any]?) -> Void, progressHandler:@escaping (Double) -> Void) -> PHImageRequestID {
// Prepare the options to pass when fetching the (photo, or video preview) image.
var requestOptions = options
if requestOptions == nil {
requestOptions = PHImageRequestOptions()
/// 照片質(zhì)量
requestOptions?.deliveryMode = .highQualityFormat
/// 是否允許網(wǎng)絡(luò)下載
requestOptions?.isNetworkAccessAllowed = true
}
let progressHandler: PHAssetVideoProgressHandler = { (progress, error, stop, info) in
if let b = info?[PHImageCancelledKey] as? NSNumber, b.boolValue {
return
}
if error != nil {
return
}
progressHandler(progress)
}
requestOptions?.progressHandler = progressHandler
return PHImageManager.default().requestImageData(for: asset, options: requestOptions, resultHandler: resultHandler)
}
2.3帝洪、視頻下載
/// 獲取視頻資源
/// - asset: 資源元數(shù)據(jù)
/// - options: 下載參數(shù)
/// - resultHandler: 返回結(jié)果
/// - progressHandler: 下載進(jìn)度
open class func requestAVAssetAsset(forVideo asset: PHAsset, options: PHVideoRequestOptions?, resultHandler: @escaping (AVAsset?, AVAudioMix?, [AnyHashable: Any]?) -> Void, progressHandler:@escaping (Double) -> Void) -> PHImageRequestID {
var requestOptions = options
if requestOptions == nil {
requestOptions = PHVideoRequestOptions()
requestOptions?.deliveryMode = .automatic
requestOptions?.isNetworkAccessAllowed = true
}
let progressHandler: PHAssetVideoProgressHandler = { (progress, error, stop, info) in
if error != nil {
return
}
progressHandler(progress)
}
requestOptions?.progressHandler = progressHandler
return PHImageManager.default().requestAVAsset(forVideo: asset, options: requestOptions, resultHandler: resultHandler)
}
相冊(cè)相關(guān)的內(nèi)容后續(xù)持續(xù)更新(相簿似舵、照片集、iCloud資源下載進(jìn)度等等)葱峡,如果大家有什么疑問(wèn)和建議歡迎一起談?wù)摗?/p>