###### tags: `第14屆IT邦鐵人賽文章` # 【在 iOS 開發路上的大小事2-Day14】PhotoKit 好像很好玩 (3) 在上一篇,有講到 PHFetchOptions、PHPhotoLibraryChangeObserver、PHImageManager 在這一篇,會講到 PHAsset、PHAssetResource ## PHAsset PHAsset 記錄著一張照片/影片的各項資訊,像是建立時間、變動時間、媒體型態、拍攝位置、收藏狀態等 讓我們一起來看一下 PHAsset 究竟記錄著哪些資訊 ```swift @available(iOS 8, *) open class PHAsset : PHObject { // enum,顯示媒體給使用者的方式 @available(iOS 11, *) open var playbackStyle: PHAsset.PlaybackStyle { get } // enum,媒體種類 @available(iOS 8, *) open var mediaType: PHAssetMediaType { get } // enum,媒體子種類 @available(iOS 8, *) open var mediaSubtypes: PHAssetMediaSubtype { get } // 媒體的寬度 @available(iOS 8, *) open var pixelWidth: Int { get } // 媒體的高度 @available(iOS 8, *) open var pixelHeight: Int { get } // 媒體的建立時間 @available(iOS 8, *) open var creationDate: Date? { get } // 媒體的變動時間 @available(iOS 8, *) open var modificationDate: Date? { get } // 拍攝媒體的位置 @available(iOS 8, *) open var location: CLLocation? { get } // 影片媒體的時間長度 @available(iOS 8, *) open var duration: TimeInterval { get } // 媒體是否隱藏 @available(iOS 8, *) open var isHidden: Bool { get } // 媒體是否收藏 @available(iOS 8, *) open var isFavorite: Bool { get } // 連拍照片的標示符 @available(iOS 8, *) open var burstIdentifier: String? { get } // enum,連拍照片的種類 @available(iOS 8, *) open var burstSelectionTypes: PHAssetBurstSelectionType { get } // 是否為連拍照片的代表性照片 @available(iOS 8, *) open var representsBurst: Bool { get } // enum,媒體來源種類 @available(iOS 9, *) open var sourceType: PHAssetSourceType { get } // 調整格式的標示符 @available(iOS 15, *) unowned(unsafe) open var adjustmentFormatIdentifier: NSString? { get } @available(iOS 8, *) open func canPerform(_ editOperation: PHAssetEditOperation) -> Bool @available(iOS 8, *) open class func fetchAssets(in assetCollection: PHAssetCollection, options: PHFetchOptions?) -> PHFetchResult<PHAsset> @available(iOS 8, *) open class func fetchAssets(withLocalIdentifiers identifiers: [String], options: PHFetchOptions?) -> PHFetchResult<PHAsset> @available(iOS 8, *) open class func fetchKeyAssets(in assetCollection: PHAssetCollection, options: PHFetchOptions?) -> PHFetchResult<PHAsset>? @available(iOS 8, *) open class func fetchAssets(withBurstIdentifier burstIdentifier: String, options: PHFetchOptions?) -> PHFetchResult<PHAsset> @available(iOS 8, *) open class func fetchAssets(with options: PHFetchOptions?) -> PHFetchResult<PHAsset> @available(iOS 8, *) open class func fetchAssets(with mediaType: PHAssetMediaType, options: PHFetchOptions?) -> PHFetchResult<PHAsset> } ``` ### PHAsset.PlaybackStyle PHAsset.PlaybackStyle:顯示媒體給使用者的方式 ```swift @available(iOS 11, iOS 8, *) public enum PlaybackStyle : Int { // 不支援或是未定義的媒體類型 @available(iOS 8, *) case unsupported = 0 // 照片 @available(iOS 8, *) case image = 1 // 動畫圖片 @available(iOS 8, *) case imageAnimated = 2 // 原況照片 @available(iOS 8, *) case livePhoto = 3 // 影片 @available(iOS 8, *) case video = 4 // 循環播放的影片 @available(iOS 8, *) case videoLooping = 5 } ``` ### PHAssetMediaType PHAssetMediaType:媒體種類 ```swift @available(iOS 8, iOS 8, *) public enum PHAssetMediaType : Int { // 未知 @available(iOS 8, *) case unknown = 0 // 照片 @available(iOS 8, *) case image = 1 // 影片 @available(iOS 8, *) case video = 2 // 音檔 @available(iOS 8, *) case audio = 3 } ``` ### PHAssetMediaSubtype PHAssetMediaSubtype:媒體子種類 ```swift @available(iOS 8, iOS 8, *) public struct PHAssetMediaSubtype : OptionSet { public init(rawValue: UInt) // 照片子類別 // 全景照片 @available(iOS 8, *) public static var photoPanorama: PHAssetMediaSubtype { get } // HDR 照片 @available(iOS 8, *) public static var photoHDR: PHAssetMediaSubtype { get } // 螢幕截圖 @available(iOS 9, *) public static var photoScreenshot: PHAssetMediaSubtype { get } // 原況照片 @available(iOS 9.1, *) public static var photoLive: PHAssetMediaSubtype { get } // 人像模式照片 @available(iOS 10.2, *) public static var photoDepthEffect: PHAssetMediaSubtype { get } // 影片子類別 // 網路串流影片 @available(iOS 8, *) public static var videoStreamed: PHAssetMediaSubtype { get } // 高幀率影片 @available(iOS 8, *) public static var videoHighFrameRate: PHAssetMediaSubtype { get } // 縮時影片 @available(iOS 8, *) public static var videoTimelapse: PHAssetMediaSubtype { get } // 電影模式影片 @available(iOS 15, *) public static var videoCinematic: PHAssetMediaSubtype { get } } ``` ### PHAssetBurstSelectionType PHAssetBurstSelectionType:連拍照片的種類 ```swift @available(iOS 8, iOS 8, *) public struct PHAssetBurstSelectionType : OptionSet { public init(rawValue: UInt) // 系統自動選擇的 @available(iOS 8, *) public static var autoPick: PHAssetBurstSelectionType { get } // 使用者自己選擇的 @available(iOS 8, *) public static var userPick: PHAssetBurstSelectionType { get } } ``` ## PHAssetResource PHAssetResource 是在 Photo Library 中的底層資料,與 PHAsset 是相互關聯的 ```swift @available(iOS 9, *) open class PHAssetResource : NSObject { // 媒體資源種類 @available(iOS 9, *) open var type: PHAssetResourceType { get } // 系統為本地資產對象關聯的唯一標識符 @available(iOS 9, *) open var assetLocalIdentifier: String { get } // 照片或影片資料的統一類型標識符 @available(iOS 9, *) open var uniformTypeIdentifier: String { get } // 建立或是匯入時的原始檔名 @available(iOS 9, *) open var originalFilename: String { get } @available(iOS 9, *) open class func assetResources(for asset: PHAsset) -> [PHAssetResource] @available(iOS 9.1, *) open class func assetResources(for livePhoto: PHLivePhoto) -> [PHAssetResource] } ``` ### PHAssetResourceType ```swift @available(iOS 9, iOS 8, *) public enum PHAssetResourceType : Int { // 原始照片 (未修改過的) @available(iOS 8, *) case photo = 1 // 原始影片 (未修改過的) @available(iOS 8, *) case video = 2 // 原始音檔 (未修改過的) @available(iOS 8, *) case audio = 3 // 非主要的照片 // Ex:其他相機傳來的照片,可能同時具有 JPEG 跟 RAW 檔 // JPEG 為主要照片,RAW 為備用照片 @available(iOS 8, *) case alternatePhoto = 4 // 原始照片 (修改過的) @available(iOS 8, *) case fullSizePhoto = 5 // 原始影片 (修改過的) @available(iOS 8, *) case fullSizeVideo = 6 // 紀錄編輯時的資料 @available(iOS 8, *) case adjustmentData = 7 // 未更改的照片,用來回復最近的編輯狀態 @available(iOS 8, *) case adjustmentBasePhoto = 8 // 原況照片 (未修改過的) @available(iOS 9.1, *) case pairedVideo = 9 // 原況照片 (修改過的) @available(iOS 10, *) case fullSizePairedVideo = 10 // 未更改的原況照片,用來回復最近的編輯狀態 @available(iOS 10, *) case adjustmentBasePairedVideo = 11 // 未更改的影片,用來回復最近的編輯狀態 @available(iOS 13, *) case adjustmentBaseVideo = 12 } ``` 下一篇,再來介紹要如何應用~ ## 參考資料 > https://developer.apple.com/documentation/photokit > https://www.jianshu.com/p/3ac116ffffcc