- Published on
๐ฑ iOS - ์ธ์คํ๊ทธ๋จ ์คํ ๋ฆฌ๋ก ๊ณต์ ํ๊ธฐ
- Authors
- Name
- ์ด์ฐฝ์ค
์ธ์คํ๊ทธ๋จ ์คํ ๋ฆฌ ๊ณต์
์ค๋์ ์ฑ์์ ์ป์ด๋ธ ์ฌ์ง์ ์ธ์คํ๊ทธ๋จ ์คํ ๋ฆฌ๋ก ๊ณต์ ํ๋ ๋ฒ์ ๊ณต๋ถํด๋ณด๊ฒ ์ต๋๋ค.
Instagram - Sharing to stories
ํด๋น ๋ฌธ์๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ์งํํด๋ณด์ฃ !
์ฑ ID ํ๋ํ๊ธฐ
๊ฐ์ฅ ๋จผ์ ๋์ ๋๋ ๊ฒฝ๊ณ ๋ฌธ์ด ์๋ค์!
๋ค๋ฅธ SDK์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ ๋ฑ๋ก์ ํด์ผํ๋ ๋ด ๋๋ค. ๊ทธ๋ฐ๋ฐ 1์๋ถํฐ๋ฉด ๊ทธ ์ ์๋ ๊ทธ๋ฅ ๋๋๊ฑด๊ฐโฆ?
Meta ๊ฐ๋ฐ์ ๊ณ์ ์ ๋ง๋ค๊ณ ์ฑ์ ์์ฑํด์ฃผ๋ฉด ์ด๋ ๊ฒ ์ฑ ID๋ฅผ ์ป์ด๋ผ ์ ์์ต๋๋ค.
์ด๋ค ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํด์ผํ ์ง ํ์ธํด๋ณด๊ธฐ
๊ทธ๋ฌ๋ฉด ์ด์ ์ธ์คํ ์คํ ๋ฆฌ๋ก ์ฌ๋ฆด ๋ด์ฉ์ ์ ๊ณตํ๋ ค๋ฉด ์ด๋ค ๊ฒ์ด ํ์ํ์ง๋ฅผ ์์์ผ๊ฒ ์ฃ ?
์ด ํญ๋ชฉ์ ์ดํด๋ณด๋ฉด ์คํ ๋ฆฌ๋ Background Layer์ Sticker Layer๋ก ๊ตฌ๋ถ๋์ด ์๋ค๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์คํ ๋ฆฌ์ ๋ฐฐ๊ฒฝ์ ๊ฝ ์ฑ์ด ์ํ๋ก ๊ณ ์ ์ํค๋ ์ด๋ฏธ์ง๋ Background Layer๋ก, ์ ์ ๊ฐ ๋ณํํ๊ฑฐ๋ ์ด๋์์ผ ๋ฐฐ์น์ํฌ ์ ์๋ ์ด๋ฏธ์ง๋ Sticker Layer๋ก ๊ตฌ์ฑํด์ฃผ๋ฉด ๋๊ฒ ์ฃ ?
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ์ธ์คํ๊ทธ๋จ ์ฑ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ๋ฌํด์ค ์ ์์๊น์?
์คํค๋ง ์ ์ฉ
์ฑ์ ์ฝํ ์ธ ๋ฅผ ์ธ์คํ๊ทธ๋จ์ผ๋ก ์ ์กํ๊ธฐ ์ํด์๋ ์ธ ๊ฐ์ง ์คํ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
- ์ฑ์ด ์ธ์คํ๊ทธ๋จ์ ๋ง์ถค URL ์คํค๋ง๋ฅผ ์ฐพ์ ์ ์๋์ง ํ์ธํฉ๋๋ค.
- ํ์ด์คํธ๋ณด๋์ ๊ณต์ ํ๊ณ ์ ํ๋ ์ฝํ ์ธ ๋ฅผ ํ ๋นํฉ๋๋ค.
- ์ฑ์์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ง์ถค URL ์คํค๋ง๋ฅผ ์ฐพ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ญ์ ์์์ ๋ค๋ฅธ SDK์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ์ URL ์คํค๋ง๋ฅผ ๋ฑ๋กํด์ฃผ๋ ๊ฒ์ด๊ฒ ์ฃ ?
์ธ์คํ๊ทธ๋จ์ Info.plist
ํ์ผ์ ์๋ LSApplicationQueriesSchemas
ํค์ instagram-stories
๋ฅผ ์ถ๊ฐํด๋ฌ๋ผ๊ณ ํฉ๋๋ค.
์ฃผ์ํ ์ ์ Array
ํ์
์ผ๋ก ๊ทธ ํ์์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ธ์คํ๊ทธ๋จ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ธฐ๋ฅ์ด๋ ์ฑ๋ค์ ์คํค๋ง๋ค๋ ๋ฑ๋ก๋ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ !
์ฝ๋ ์์ฑ
์ด์ ์ธ์คํ๊ทธ๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ด ์๋ค.
๋ฌธ์ ๋ ์ธ์คํ๊ทธ๋จ์ด ์์ ๋ก Swift ์ฝ๋๋ฅผ ์ ๊ณตํ๋๊ฒ ์๋๋ผ Obj-C ์ฝ๋๋ฅผ ์ ๊ณตํ๊ณ ์์ด์..
์๋นํ ๋นํฉ์ค๋ฝ์ง๋ง.. ์์๋ฑ์ผ๋ก Swift๋ก ๋ณํํด์ ์์ฑํด๋ด ์๋ค.. ๐ก
์ฐ๋ฆฌ์๊ฒ ์ด์ GPT๋ผ๋ ๋ฌด๊ธฐ๋ ์์ผ๋๊น์!
์ฐ์ ์ ๋ฌํด์ค ์ ์๋ ๋ฐ์ดํฐ์ ํ์ , ์ค๋ช ์ ์๋์ ๊ฐ์ต๋๋ค.
๋ฐฐ๊ฒฝ ์์ฐ ๊ณต์ ํ๊ธฐ
์ด๋ฆ์ ๋ณด์ํ๋ Background Layer๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด๊ฒ ์ฃ ?
ChatGPT์๊ฒ Obj-C ์ธ์ด๋ฅผ Swift๋ก ๋ณํํด๋ฌ๋ผ๊ณ ํ๋ ๊ฝค ๊ทธ๋ด๋ฏ ํด๋ณด์ด๋ ์ฝ๋๊ฐ ๋์์ ๊ทธ๋๋ก ์ฝ๋๋ฅผ ์ ์ฉํด๋ณด์์ต๋๋ค.
private func shareToInstagram() {
if
let backgroundImage = UIImage(named: "GiftMock"), // ํ
์คํธ๋ฅผ ์ํ ์์ ๋ฐ์ดํฐ
let imageData = backgroundImage.pngData() { // 1๏ธโฃ
self.backgroundImage(backgroundImage: imageData, appID: URLSchemes.instagramStory.url)
}
}
private func backgroundImage(backgroundImage: Data, appID: String) {
if let url = URL(string: appID) {
if UIApplication.shared.canOpenURL(url) { // 2๏ธโฃ
let pasteboardItems = [["com.instagram.backgroundImage": backgroundImage]]
let pasteboardOptions: [UIPasteboard.OptionsKey: Any] = [
.expirationDate: Date(timeIntervalSinceNow: 60 * 5)
]
UIPasteboard.general.setItems(pasteboardItems, options: pasteboardOptions) // 3๏ธโฃ
UIApplication.shared.open(url, options: [:]) // 4๏ธโฃ
} else {
// Error Handling
}
}
}
๊ณผ์ ์ ์๊ฐ๋ณด๋ค ๊ฐ๋จํฉ๋๋ค.
- ์ธ์คํ๊ทธ๋จ์ด ์๊ตฌํ๋ ๋ฐ์ดํฐ์ ํ์
์ ๋ง์ถฐ์ฃผ๊ธฐ ์ํด
UIImage
ํ์ผ์Data
ํ์ ์ผ๋ก ๋ณํํด์ค๋๋ค. - ์คํค๋ง URL์ด ์ ํจํ ์ง ํ์ธํฉ๋๋ค. ์ฑ์ ๋ฑ๋ก๋์ง ์์ ์คํค๋ง๊ฑฐ๋ ๊ธฐ๊ธฐ์ ์ค์น๋์ด ์์ง ์์ ์ฑ์ผ๋ก ์ฐ๊ฒฐ ์ ์๋ฌ๋ฅผ ๋์ ธ๋ ๋๋ค.
- ๋ณํํ ์ด๋ฏธ์ง ํ์ผ์
UIPasteboard
๋ฅผ ํ์ฉํ์ฌ ๋ณต์ฌํด ์ ์ฅํฉ๋๋ค..expirationDate
๋ฅผ ํตํด ์ ์ฅ ๊ธฐ๊ฐ์ ์ค์ ํด์ฃผ์๋ค์. - URL ์คํค๋ง๋ฅผ ์ด๊ณ ์ธ์คํ๊ทธ๋จ ์ฑ์ ์คํ ๋ฆฌ ์ถ๊ฐ ํ๋ฉด์ ์คํํฉ๋๋ค.
๊ณผ์ฐ ๊ฒฐ๊ณผ๋!
- Info.plist URL ๋ฑ๋ก ์๋ฌ
๐.. ํ ๋ฒ์ ๋ ๋ฆฌ๊ฐ ์์ฃ โฆ
๋ฌธ์ ๋ ์ด๊ณณ์ ์์์ต๋๋ค.
๋ถ๋ช
LSApplicationQuriesSchemas
๋ฅผ ๋ฑ๋กํ๋ผ๊ณ ํ์๋จ ๋ง์ด์ฃ ?
๊ณต์ ๋ฌธ์๋ฅผ ๋ค์ ์ฝ์ด๋ณด๊ณ ์ ์ฐจ๋ก ์๋ํด๋ดค์ง๋ง ์ง์ ์ด ์์ด ๊ฐ์ ๋ค์ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ ํด๋ณด์์ต๋๋ค.
๊ทธ๋ฌ๋๋..
์๋ ๊ธ์ ํค ๊ฐ์ด ์๋์ผ๋ก ๋ฐ๋์์ต๋๋ค.. ์ ์๋ ๋์ฒด ์..
์์ ์ ๋น ๋ฅด๊ฒ ํด์ฃผ๊ณ ๋ค์ ์คํํด๋ด ์๋ค. ๊ณผ์ฐ ์ด๋ฒ์๋..?
- ๋ฐ์ดํฐ๊ฐ ๋์ด์ค์ง ์๋ ๋ฒ๊ทธ
์ค! ๋ญ๊ฐ ๋๋ ๊ฒ ๊ฐ์์! ๐ฅณ
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ ๋์ด์ค์ง ์์ ๊ฒ ๊ฐ์ฃ โฆ?
๋ฌด์์ด ๋ฌธ์ ์ผ๊น ๋ ์ดํด๋ณด๋ ์ค.. ์ฌ์ํ ์์ ์ ์ ๊ฐ ์ ์ง๋ ๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค.
let pasteboardItems = [["com.instagram.backgroundImage": backgroundImage]]
๋ฐ๋ก ์ด ๋ถ๋ถ์ด์์!
key
๊ฐ์ผ๋ก "com.instagram.backgroundImage"
๋ฅผ ์ฃผ๊ณ ์์ฃ ..
ํ์ง๋ง ์์ ๋ฅผ ๋ณด๋ฉด "com.instagram.sharedSticker.backgroundImage"
๋ก ๋์ด ์์ต๋๋ค..
์ธ์คํ๊ทธ๋จ ์ฑ์ ์
์ฅ์์ ๋ณด๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ์ดํด๋ณธ key
๊ฐ์ ์๋ฌด๊ฒ๋ ์์ผ๋ ๋๊ฒจ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒ์ด์์ฃ ..
์ฌ์ค์ ์ key
๊ฐ์ ์ ์ฑ์์ ํด๋ฆฝ๋ณด๋์ ์ ์ฅํ๊ธฐ ์ํ ์ผ์ข
์ ID๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ฌ ์์ ์ ํ์์ต๋๋ค.
ํ์ง๋ง โ์ธ์คํ๊ทธ๋จ์ด ์ด๋ป๊ฒ ๊ฐ์ ๋ฐ์์ค๋๊ฑธ๊นโ๋ฅผ ์๊ฐํ๋ค๋ณด๋ ์ฝ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋๊ฒจ์ฃผ๋ ๋ก์ง์ ์ด๋์๋ ์๊ณ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ๊ฐ์ ์ pasteboardItems
๋ฐ์ ์๋๊ตฐ์..
๊ฒฐ๊ตญ์ key-value๋ก ์ฐพ์๋ด๋ ๋ฐฉ๋ฒ๋ฐ์ ์๊ฒ ๋ค ์ถ์ด ์ ๋ถ๋ถ์ ์๋๋๋ก ์์ ํด๋ณด์์ต๋๋ค.
์! ์ฑ๊ณต์ด๋ค์!
๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ง์ด ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์คํฐ์ปค ์์ฐ ๊ณต์ ํ๊ธฐ
์ฌ๊ธฐ๊น์ง ์ฑ๊ณตํ๋ค๋ฉด ์คํฐ์ปค ๋ ์ด์์๊น์ง ์ถ๊ฐํ๋ ๊ฒ์ ์์ฃผ ์ฝ์ต๋๋ค.
private func shareToInstagram(background: UIImage?, sticker: UIImage?) {
if
let background, let sticker,
let imageData = background.pngData(),
let stickerData = sticker.pngData() {
self.backgroundImage(
backgroundImage: imageData,
stickerImage: stickerData,
appID: URLSchemes.instagramStory.url
)
}
}
private func backgroundImage(backgroundImage: Data, stickerImage: Data, appID: String) {
if let url = URL(string: appID) {
if UIApplication.shared.canOpenURL(url) {
let pasteboardItems = [
[
"com.instagram.sharedSticker.backgroundImage": backgroundImage,
"com.instagram.sharedSticker.stickerImage": stickerImage // โจ ์จ์
]
]
let pasteboardOptions: [UIPasteboard.OptionsKey: Any] = [
.expirationDate: Date(timeIntervalSinceNow: 60 * 5)
]
UIPasteboard.general.setItems(pasteboardItems, options: pasteboardOptions)
UIApplication.shared.open(url, options: [:])
} else {
// Error Handling
}
}
}
์ด๋ ๊ฒ key-value๋ฅผ ํ๋๋ง ๋ ์ถ๊ฐํด์ฃผ๋ฉด ๋๊ฑฐ๋ ์!
์์ฑ
์ ์ด๋ ๊ฒ ์ธ์คํ๊ทธ๋จ ์คํ ๋ฆฌ๋ก ์ํ๋ ์ด๋ฏธ์ง๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ ๊ณต๋ถํด๋ณด์์ต๋๋ค!
์๊ฐ๋ณด๋ค ๊ต์ฅํ ๊ฐ๋จํ๋ ๊ฒ ๊ฐ์์!
์์ ๋ฌผ์ ๋ฐ๊นฅ์ ๊ณต์ ํ ์ ์์ด์ ๋ญ๊ฐ ๋ฟ๋ฏํ ๊ณต๋ถ์์ต๋๋ค. ๐