###### tags: `第14屆IT邦鐵人賽文章` # 【在 iOS 開發路上的大小事2-Day15】PhotoKit 好像很好玩 (4) 在上一篇,有講到 PHAsset、PHAssetResource 在這一篇,會講到該如何應用 ## 取得檔名 首先是檔名的取得,一般要取得檔名的話,會透過 PHAssetResource 取得 像是下面這樣,將要取得檔名的 PHAsset 傳入 PHAssetResource,進而取得檔名 ```swift let resource = PHAssetResource.assetResources(for: asset) let filename = resource.first?.originalFilename ?? "" ``` 那有沒有辦法可以直接透過 PHAsset 來取得檔名呢?答案是有的! 我們可以透過下面這個方法,直接透過 PHAsset 來取得檔名 ```swift import PhotoKit var asset: PHAsset! asset.value(forKey: "filename") ``` 這個是透過 key-value 的方式取得,感覺有點不是很直觀,讓我們來改寫一下 透過對 PHAsset 進行 extension,像是下面這樣 ```swift import PhotoKit extension PHAsset { var fileName: String { get { return self.value(forKey: "filename") as! String } } } ``` 這樣用的時候,就可以看起來直觀一點了 ```swift import PhotoKit var asset: PHAsset! asset.fileName ``` ## 請求照片、影片、原況照片 ### 照片 ```swift let imageManager = PHImageManager.default() let photosImageRequestOptions = PHImageRequestOptions() photosImageRequestOptions.deliveryMode = .highQualityFormat // 高畫質 photosImageRequestOptions.isNetworkAccessAllowed = true // 是否允許從 iCloud 下載 imageManager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: photosImageRequestOptions) { image, _ in guard let results = image else { return } DispatchQueue.main.async { // 如果有要處理 UI 的話,寫在這裡 } } ``` ### 影片 ```swift let imageManager = PHImageManager.default() let videoRequestOptions = PHVideoRequestOptions() videoRequestOptions.deliveryMode = .highQualityFormat // 高畫質 videoRequestOptions.isNetworkAccessAllowed = true // 是否允許從 iCloud 下載 imageManager.requestPlayerItem(forVideo: asset, options: videoRequestOptions) { playerItem, info in DispatchQueue.main.async { // 如果有要處理 UI 的話,寫在這裡 } } ``` ### 原況照片 ```swift let imageManager = PHImageManager.default() let livePhotoImageRequestOptions = PHLivePhotoRequestOptions() livePhotoImageRequestOptions.deliveryMode = .highQualityFormat // 高畫質 livePhotoImageRequestOptions.isNetworkAccessAllowed = true // 是否允許從 iCloud 下載 imageManager.requestLivePhoto(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: livePhotoImageRequestOptions) { livePhoto, info in guard let results = livePhoto else { return } DispatchQueue.main.async { // 如果有要處理 UI 的話,寫在這裡 } } ``` ## 修改 Asset 狀態 不論是要進行收藏、刪除或是其他操作,都會需要透過下面這個 Function 來操作 ```swift @available(iOS 8, *) open func performChanges(_ changeBlock: @escaping () -> Void, completionHandler: ((Bool, Error?) -> Void)? = nil) ``` 這邊示範如何修改收藏狀態跟刪除 ### 修改收藏狀態 ```swift PHPhotoLibrary.shared().performChanges { let request = PHAssetChangeRequest(for: self.asset) request.isFavorite = !self.asset.isFavorite print("該張照片修改後的收藏狀態:\(request.isFavorite)") } completionHandler: { success, error in // 如果有要處理 UI 的話,寫在這裡 if success { print("收藏狀態修改成功") } else { print("收藏狀態修改失敗, Error Message:\(String(describing: error?.localizedDescription))") } } ``` ### 刪除 ```swift PHPhotoLibrary.shared().performChanges { PHAssetChangeRequest.deleteAssets([self.asset] as NSArray) } completionHandler: { success, error in DispatchQueue.main.async { if success { PHPhotoLibrary.shared().unregisterChangeObserver(self) print("刪除成功") self.navigationController!.popViewController(animated: true) } else { print("刪除失敗, Error Message:\(String(describing: error?.localizedDescription))") } } } ``` ## 總結 PhotoKit 還有很多東西可以玩 這裡主要是以自己的 App 來做簡單介紹,並補充一些相關用法、資訊 如果想了解更多 PhotoKit 的奧秘的話,可以參考 [Apple Developer Documentation](https://developer.apple.com/documentation/photokit) 這裡也附上 [GitHub 連結](https://github.com/leoho0722/PhotoKitDemo),之後可能還會再新增其他功能上去 有興趣的話,就關注吧~~~