-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
130 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
# Loading Live Photos | ||
|
||
Load and cache Live Photos from network sources using Kingfisher. | ||
|
||
## Overview | ||
|
||
Kingfisher provides a seamless way to load Live Photos, which consist of a still image and a video, from network sources. This guide will walk you through the process of utilizing Kingfisher's Live Photo support. | ||
|
||
## Live Photo Data Preparation | ||
|
||
Before loading a Live Photo with Kingfisher, you need to prepare and host the data. Kingfisher can download and cache the live photo data from the network (usually your server or a CDN). This section demonstrates how to get the necessary data from a `PHAsset`. | ||
|
||
If you've already set up the data and prepared the necessary URLs for the live photo components, you can skip to the next section to learn how to load it. | ||
|
||
Assuming you have a valid `PHAsset` from the Photos framework, here's a sample of how to extract its data: | ||
|
||
```swift | ||
let asset: PHAsset = // ... your PHAsset | ||
if !asset.mediaSubtypes.contains(.photoLive) { | ||
print("Not a live photo") | ||
return | ||
} | ||
|
||
let resources = PHAssetResource.assetResources(for: asset) | ||
var allData = [Data]() | ||
|
||
let group = DispatchGroup() | ||
group.notify(queue: .main) { | ||
allData.forEach { data in | ||
// Upload data to your server | ||
serverRequest.upload(data) | ||
} | ||
} | ||
|
||
resources.forEach { resource in | ||
group.enter() | ||
var data = Data() | ||
PHAssetResourceManager.default().requestData(for: resource, options: nil) { chunk in | ||
data.append(chunk) | ||
} completionHandler: { error in | ||
defer { group.leave() } | ||
if let error = error { | ||
print("Error: \(error)") | ||
return | ||
} | ||
allData.append(data) | ||
} | ||
} | ||
``` | ||
|
||
Important notes: | ||
- This is a basic example showing how to retrieve data from a live photo asset. | ||
- Use [`PHAssetResource.type`]((https://developer.apple.com/documentation/photokit/phassetresource/1623987-type)) to get more information about each live photo resource. Typically, resources with `.photo` and `.pairedVideo` types are necessary for a minimal Live Photo. | ||
- Do not modify the metadata or actual data of the resources, as this may cause problems when loading in Kingfisher later. | ||
- When serving the files, it's recommended to include the file extensions (`.heic` for the still image, and `.mov` for the video) in the URL. While not mandatory, this helps Kingfisher identify the file type more accurately. | ||
- You can use [`PHAssetResource.originalFilename`](https://developer.apple.com/documentation/photokit/phassetresource/1623985-originalfilename) to get and preserve the original file extension. | ||
|
||
|
||
## Loading Live Photos | ||
|
||
### Step 1: Import Required Frameworks and Set Up PHLivePhotoView | ||
|
||
```swift | ||
import Kingfisher | ||
import PhotosUI | ||
|
||
let livePhotoView = PHLivePhotoView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) | ||
view.addSubview(livePhotoView) | ||
``` | ||
|
||
### Step 2: Prepare URLs | ||
|
||
```swift | ||
let imageURL = URL(string: "https://example.com/image.heic")! | ||
let videoURL = URL(string: "https://example.com/video.mov")! | ||
let urls = [imageURL, videoURL] | ||
``` | ||
|
||
### Step 3: Load the Live Photo | ||
|
||
```swift | ||
livePhotoView.kf.setImage(with: urls) { result in | ||
switch result { | ||
case .success(let retrieveResult): | ||
print("Live photo loaded: \(retrieveResult.livePhoto)") | ||
print("Cache type: \(retrieveResult.loadingInfo.cacheType)") | ||
case .failure(let error): | ||
print("Error: \(error)") | ||
} | ||
} | ||
``` | ||
|
||
The loaded live photo will be stored in the disk cache of Kingfisher to boost future loading requests. | ||
|
||
## Notes | ||
|
||
- Verify that the provided URLs are valid and accessible. | ||
- Loading may take time, especially for resources fetched over the network. | ||
- Certain `KingfisherOptionsInfo` options, such as custom processors, are not supported for Live Photos. | ||
- To load a Live Photo, its data must be cached on disk at least during the loading process. If you prefer not to retain the Live Photo data on disk, you can set a short disk cache expiration using options like `.diskCacheExpiration(.seconds(10))`, or manually clear the disk cache regularly after using. | ||
|
||
## Conclusion | ||
|
||
By following these steps, you can efficiently load and cache Live Photos in your iOS applications using Kingfisher, enhancing the user experience with smooth integration of this dynamic content type. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters