###### 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