๐ฌ ๊ธ์ ์์ํ๋ฉฐ
Link Presentation์ <์ผ๊ธฐ> ์ฑ์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๋ Framework๋ก, Share Sheet๋ฅผ ์์๋ก ๊ตฌ์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ํ์ง๋ง title๊ณผ content๋ง์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ ์ด framework๋ฅผ ์ ์ฌ์ฉํ๋ค๊ณ ํ๊ธด ์ด๋ ต๋ค. ์ด๋ฒ์ <WanF> ํ๋ก์ ํธ์์ ๋ชจ์ ์ ๋ณด๋ฅผ ๊ณต์ ํ ๋ ๋งํฌ๋ฅผ ์ฒจ๋ถํ๊ธฐ ์ํด Link Presentation๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ค. ๊ทธ ์ ์ ๊ณต์ ๋ฌธ์์ WWDC ์์์ ํตํด Link Presentation์ ๊ผผ๊ผผํ๊ฒ ์ ๋ฆฌํ๋ ค ํ๋ค.
โ๏ธ Link Presentationd์ด๋?
๋ด์ฉ์ด ํ๋ถํ URL ๋งํฌ๋ฅผ ์ด๋ฏธ์ง ๋๋ ๋์์๊ณผ ํจ๊ป ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ฑ์ ๊ฐ์ ธ์ค๊ณ ์ ๊ณตํ๊ณ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค. ์ด ํ๋ ์์ํฌ๋ URL๋ก๋ถํฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ์ฑ์ ๋งํฌ์ ๋ด์ฉ์ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ Share Sheet ํ๊ฒฝ์ ๋งํฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
๋ฉํ ๋ฐ์ดํฐ: ๋ฐ์ดํฐ์ ๋ํ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ. ์ํ๋ฅผ ๋ณด๊ธฐ ์ํด DVD ํ์ดํ์ ๊ตฌ๋งคํ์ ๋ ํฌ์ฅ์ ๋ถ์ด์๋ ์ ๋ชฉ, ์์์๊ฐ, ๊ฐ๋ ๋ฑ์ด ๋ฉํ๋ฐ์ดํฐ์ด๋ค.
AppStore์์ ์ฑ์ ๊ณต์ ํ๋ ๋ฑ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ๊ณต์ ํ ๋ ์์ ๊ฐ์ ๋ชจ์์ ๋ง์ด ๋ณด์์ ๊ฒ์ด๋ค. ์ด๊ฒ์ Rich Link Message๋ผ ๋ถ๋ฅด๋ฉฐ Link Presentation์ ํตํด ๋ง๋ค ์ ์๋ค. ์ด ๋ฉ์ธ์ง๋ ์๋์ ๊ฐ์ด 3๊ฐ์ง ๋ชจ์์ด ์๋ค.
๐ฉ๐ป๐ป Embedding and Sharing Visually Rich Links
Link Presentation์ WWDC 2019์์ ์๊ฐ๋์๋ค. ๊ธฐ์กด Apple์ iOS 10๊ณผ macOS Sierra์์ URL์ ์๋ฆ๋ต๊ณ ๋ ์ ์ฉํ๊ฒ ๋ง๋๋ ๋ฉ์ธ์ง๋ก Rich Links๋ฅผ ์๊ฐํ๋ค. ์ดํ Apple์ iOS 13๊ณผ macOS 10.15์์ ์ต์ํ์ ์์ ๋ง์ผ๋ก๋ ๊ฐ์ ์ด์ ์ ์ ๊ณตํ๋ Link Presentation framework๋ฅผ ์๊ฐํ๋ค.
์ ๊ณต์ ์์์์๋ 3๊ฐ์ง ์ฃผ์ ๋ก ๋๋์ด Link Presentation ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์์๋ฅผ ๋ณด์ฌ์ฃผ์๋ค. ์ด ์์๋ฅผ ์ ๋ฆฌํ๋ฉฐ Link Presentation์ ์์๋ณด๊ณ ์ ํ๋ค.
1. How to present metadata given a URL (์ฃผ์ด์ง URL์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ)
2. How to easily present that metadata to the users (๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ์ฝ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ)
3. How to use fetched metadata to accelerate the presentation of the new Share Sheet experience in iOS 13 (iOS 13์์ ์๋ก์ด Share Sheet ํ๊ฒฝ์ presentation์ ๊ฐ์ํํ๊ธฐ ์ํด ๊ฐ์ ธ์จ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ)
1๏ธโฃ Retrieving metadata
๋ฌธ์์ด๋ก URL์ ๊ฐ๋จํ ๋ณด์ฌ์ค ์๋ ์์ง๋ง, URL์ ์ฌ์ฉ์ ์นํ์ ์ด์ง ์์ ์ฌ๋ฌ URL์ด ์์ ๊ฒฝ์ฐ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค. ์ฌ์ฉ์์๊ฒ URL์ title์ ์๊ตฌํ ์๋ ์์ง๋ง Link Presentation์ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๊ฒ ์ฌ์ฉ์ ์นํ์ ์ธ URL์ ๊ตฌ์ฑํ ์ ์๋ค.
์๋ก์ด Link Presentation ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด LP metadata provider ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ๋ก๋ถํฐ ํ๋ถํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ป์ ์ ์๋ค. ์ด ํด๋์ค์ URL์ ์ ๋ฌํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฏธ๋์ด์์ ๋ํ title๊ณผ ํจ๊ป LPLinkMetadata ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋จผ์ LPMetadataProvider ๋ฅผ ์์ฑํ ํ startFetchingMetadata๋ฅผ URL๊ณผ ํจ๊ป ํธ์ถํ๋ผ. completion handler๊ฐ ํธ์ถ๋ ๋ ์๋ฌ๋ฅผ ํ์ธํ ์ ์๋๋ฐ, ๋ง์ฝ ์๋ฒ๊ฐ ์๋ตํ์ง ์๊ฑฐ๋ ๋๋ ๋๋ฌด ๋๋ฆฌ๊ฑฐ๋ ์ฌ์ฉ์์ ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ๋์ง ์์๋ค๋ฉด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์คํจํ ์๋ ์๋ค. ๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
// Fetch metadata from a given URL
let metadataProvider = LPMetadataProvider()
let url = URL(string: "https://www.apple.com/ipad")!
metadataProvider.startFetchingMetadata(for: url) { metadata, error in
if error != nil {
// The fetch failed; handle the error.
return
}
// Make use of fetched metadata.
}
metadataProvider์ LinkMetadata๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ์ฃผ์ํด์ผ ํ๋ค. ๋ง์ฝ ์ฌ์ดํธ๊ฐ ์ด๋ค ๊ฒ๋ ์ง์ ํ์ง ์์์๋ฉด ๊ฒฐ๊ณผ๋ก ๋์จ ๋ฉํ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ title, icon, image๋ video ๋๋ ๊ทธ ๋ฌด์ธ๊ฐ๋ ํฌํจํ์ง ์์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฉํ๋ฐ์ดํฐ ๊ฐ์ฒด๋ secure coding ์์์ ์ง๋ ฌํ(serializable)๋ ์ ์๋ค. ์ด๋ LPMetadataProvider๊ฐ ๊ทธ ์์
์ ์ํํ๊ธฐ ์ํด ์ธํฐ๋ท์ ๋๋ฌํ๊ณ , ์ฌ์ฉ์๊ฐ ๊ทธ ์์
์ ์ํํ๊ณ ๋งค๋ฒ ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ link๋ฅผ ๋ณด์ฌ์ค ๋๋ง๋ค ๋ฐ์ดํฐ์ ์ํ ๋น์ฉ์ ์ง๋ถํ๊ฒ ํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ํ๋ค. ๋ฐ๋ผ์ ์ป์ด๋ธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฅํ ๋ก์ปฌ๋ก cache ํด์ผํ๋ค.
์ง๋ ฌํ: ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ถํ ์ ์ฅํ ์ ์๊ฑฐ๋ ์ ์ก๋ ์ ์๋, ๋๋ ์ฌ๊ตฌ์ฑํ ์ ์๋ ํ์์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ด๋ค.
๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ file URL์์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ง์ฝ ๊ฐ๋ฅํ๋ค๋ฉด ํ์ผ์ ๋ํ ๋ํ ์ธ๋ค์ผ์ ์ป๊ธฐ ์ํด ์๋ก์ด QuickLook thumbnailing API๊ฐ ์ฌ์ฉ๋์ด์ง ๊ฒ์ด๋ค.
2๏ธโฃ Presenting links
์ฐ๋ฆฌ๊ฐ ์ป์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฑ์ presentํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ๋ฐ๋ก ์์์ ๋ง๋ ๊ฐ์ฒด๋ก LPLinkView๋ฅผ ๋ง๋ค ์ ์๋ค.
// Present LPLinkMetadata in a LPLinkView
let linkView = LPLinkView(metadata: metadata)
cell.contentView.addSubview(linkView)
linkView.sizeToFit()
LPLinkView๋ ๊ณ ์ ์ size๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ๊ทธ๊ฒ์ ๋ํ ์ ํ๋ size๊ฐ ์ฃผ์ด์ง๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ด์์ ์ธ ํฌ๊ธฐ์ ๋ง๋ size๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค size๋ก ํฌ๊ธฐ๊ฐ ๋ฐฐ์น๋๋๋ผ๋ ํฉ๋ฆฌ์ ์ธ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ํ๋๋ก ๋
ธ๋ ฅํ ๊ฒ์ด๋ค.
3๏ธโฃ Accelerating the share sheet
URL์ ๊ณต์ ํ ์ฑ์ ๋ํด Share Sheet๋ ์๋์ผ๋ก link์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ sheet์ header์ ํ์ํ๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ Share Sheet๊ฐ present๋์๋ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด ์๋ฒ์ ์ฐ๊ฒฐํด์ผํ๊ธฐ ๋๋ฌธ์ title๊ณผ icon์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ณด์ฌ์ง๋ค. ๋ฐ๋ผ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ header์ ๋ฐ๋ก ๋ฐ์๋์ด ๋ํ๋์ง ์์ ์๋ ์๋ค. ๋ง์ฝ URL์ ๋ํ LPLinkMetadata ๊ฐ์ฒด๋ฅผ Share Sheet์ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋คํฌ์ํฌ ๋ก๋ฉ์์ด ์ฆ๊ฐ์ ์ผ๋ก ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ๋ํ๋๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ UIActivityItemSource์ ๊ตฌํ์ ์๋ก์ด activityViewControllerLink Metadata ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋จ์ํ ๋ฉํ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. ๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋ฉ์ธ์ง๋ฅผ ๊ณต์ ํ๋ค๋ฉด, ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ ๋ถํ์ํ ๋ก๋ฉ ์์ด ๋ถ๋๋ฝ๊ณ ์์ฃผ ๋งค๋๋ฌ์ด ๊ฒฝํ์ ์ ๊ณตํ๋ฉฐ ๋ฐ๋ก ์ ๋ฌ๋ ๊ฒ์ด๋ค.
// Provider prefetched metadata to UIActivityViewController via UIActivityItemSource
func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata? {
return self.metadata
}
๋ง์ฝ title๊ณผ image๊ฐ ๋ค์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ค๋ฉด, Share Sheet๋ฅผ ๋น ๋ฅด๊ฒ ๋์ฐ๊ธฐ ์ํด ๋๋ rich link๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ธํฐ๋ท์์ ๋ค์ ๊ฐ์ ธ์ฌ ํ์๋ ์๋ค. ๋์ LPLinkMetadata์ field๋ค์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ก ์ฑ์๋ผ. ๊ทธ๋ฌ๋ฉด LPLinkMetadata ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ต์ํ ์๋ URL ๋ฐ URL field๋ค์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ํด๋ผ.
// Provide custim metadata to UIActivityViewController via UIActivityItemSource.
func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata? {
let metadata = LPLinkMetadata()
metadata.originalURL = URL(string: "https://www.example.com/apple-pie")
metadata.url = metadata.originalURL
metadata.title = "The Greatest Apple Pie In The World"
metadata.imageProvider = NSItemProvider.init(contentsOf:
Bundle.main.url(forResource: "apple-pie", withExtension: "jpg"))
return metadata
}
โจ ํต์ฌ ํค์๋ 3
1. ์์์ URLs์ ๋ํ ๋ ๋ง์ ๋ด์ฉ์ ์ ๊ณตํ๊ธฐ ์ํด LP metadata provider๋ฅผ ์ฌ์ฉํ์ฌ URL์ ๋ํ ํ๋ถํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
2. LP link view๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆ๋ต๊ณ ์์คํ
๊ณผ ์ผ๊ด์ฑ์๋ ๋ฐฉ์์ผ๋ก ์ฑ์ links๋ฅผ ํ์ํ ์ ์๋ค(present).
3. prefetchํ๊ฑฐ๋ ๊ธฐ์กด์ LPLinkMetadata๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ Share Sheet ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋์ธ ์ ์๋ค(accelerate).
๐ง๐ปโ๏ธ ๊ธ์ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
SNS๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ฌ๋๋ค์ Link Presentation์ ์ ๋ง ๋ง์ด ๋ณด์์ ๊ฒ์ด๋ค. ๋ ๋ํ ์นดํก์ผ๋ก ์ฌ๋ฌ ๋ฏธ๋์ด๋ฅผ ์ ์กํ๋ฉด์ Link Presentation ํํ๋ฅผ ๋ง์ด ๋ณด์์๋ค. ํ์ง๋ง ๊ทธ ํํ๊ฐ ์ด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๋ <์ผ๊ธฐ>๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ์์๋ ์์ง ๋ชปํ๋ค. ์ด๋ ๊ฒ Link Presentation์ ์ ๋ฆฌํด๋ณด๋ ํ์คํ๊ฒ ์ด ํ๋ ์์ํฌ์ ์ฉ๋๋ฅผ ์ ์ ์์๋ค. ๋ iOS๋ฅผ ์์ํ์ง ๊ฝค ๋์์์๋ WWDC๊ฐ ์์ง ์ด๋ ต๊ณ ๋ฉ๊ฒ๋ง ๋๊ปด์ก๋๋ฐ ์ด๋ฒ์ ์ด๋ ๊ฒ ๊ฒฝํํ๊ณ ๋๋ ๋ค์๋ถํฐ๋ ๊ณต์๋ฌธ์์ฒ๋ผ ํธํ๊ฒ ๋ณด๊ณ ๋งค๋
WWDC๊ฐ ์ด๋ฆด ๋๋ง๋ค ๊ด์ฌ์ ๊ฐ์ง๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
๐ฅ ํ ์ค ์ ๋ฆฌ
Link Presentation๋ URL์ ์ฌ์ฉ์ ์นํ์ ์ด๊ณ ์ผ๊ด๋ ๋ชจ์ต์ผ๋ก ๋ณด์ฌ์ค ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ์ด๋ค. metadata ๊ฐ์ฒด๋ selializableํ๋ฏ๋ก URL์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ๋คํธ์ํฌ์ ์์ ํ๊ธฐ ๋ณด๋ค๋ ๋ก์ปฌ์ cacheํ์ฌ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค. ๋ metadata๋ Share Sheet์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์์๋ก ๊ตฌ์ฑํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ ๋คํธ์ํฌ ๋ก๋ฉ ์์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค.
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ iOS ] MVC - 2 ) Model ๊ฐ์ฒด (0) | 2023.11.18 |
---|---|
[ iOS ] MVC - 1) MVC๋? (1) | 2023.10.17 |
[ iOS ] Bounds์ Frame ๋น๊ต - 2. Size (0) | 2023.07.01 |
[ iOS ] Bounds์ Frame ๋น๊ต - 1. ๊ณต์๋ฌธ์์ origin (0) | 2023.06.30 |
[ iOS ] ๋๊ธฐ์ ๋น๋๊ธฐ / ์ง๋ ฌ๊ณผ ๋์์ฑ (0) | 2023.06.22 |