이 문서는 Kakao SDK for iOS(이하 iOS SDK)를 사용한 카카오톡 공유 API 구현 방법을 안내합니다.
메시지 API는 카카오톡 공유와 카카오톡 메시지 두 가지입니다. 이해하기를 참고해 어떤 API로 메시지 보내기를 구현할 것인지 결정합니다.
종류를 참고하여 어떤 메시지 템플릿을 사용할지 결정합니다.
보낼 메시지는 기본 템플릿을 바탕으로 객체 형태로 구성하거나, 서비스에 맞게 직접 구성한 사용자 정의 템플릿을 사용하여 구성할 수 있습니다. 자세한 정보는 사용 방법에서 확인할 수 있습니다.
메시지 구성 후, 원하는 메시지 및 템플릿에 따라 API를 호출합니다. 요청이 성공하면 iOS SDK는 카카오톡을 실행하거나, 웹 페이지를 통해 카카오계정으로 로그인하여 메시지를 보낼 친구 및 대화방 목록을 보여줍니다. 사용자가 메시지를 보낼 친구 또는 대화방을 선택하면 메시지가 전송됩니다.
카카오톡 공유 완료 시 반환되는 값은 없으며, 전송 성공 여부는 카카오톡 공유 전송 성공 알림 설정하기를 통해서만 알 수 있습니다.
사용자가 카카오톡 메시지의 버튼을 통해 앱을 실행할 수 있도록 하려면 앱 실행 허용 목록을 설정해야 합니다. 카카오톡 공유와 카카오톡 메시지 사용 시, LSApplicationQueriesSchemes
설정에 "kakaolink" 값이 필요합니다. 이 설정은 kakao${YOUR_NATIVE_APP_KEY}://kakaolink
형식의 앱 실행을 위한 커스텀 URL 스킴(Custom URL Scheme)을 만드는 데 쓰입니다.
네이티브 앱의 경우, 커스텀 URL 스킴을 통한 앱 실행 시 서비스의 필요에 따라 추가 정보를 전달할 수 있습니다. androidExecutionParams
, iosExecutionParams
파라미터로 앱 실행 시 전달할 키와 값을 설정할 수 있습니다. 해당 파라미터 사용 시, 카카오톡 공유 메시지에서 앱을 실행하는 버튼을 클릭하면 아래와 같은 스킴이 호출됩니다.
kakao${YOUR_NATIVE_APP_KEY}://kakaolink?${androidExecutionParams}
kakao${YOUR_NATIVE_APP_KEY}://kakaolink?${iosExecutionParams}
// 예시
kakao${YOUR_NATIVE_APP_KEY}://kakaolink?key1=value1&key2=value2&key3=value3
카카오톡 공유와 카카오톡 메시지 API는 카카오톡 메시지를 구성할 때 KakaoSDKTemplate
에 정의된 클래스들을 공통적으로 사용합니다. 메시지 템플릿 구성 요소를 참고하여 원하는 메시지 템플릿에서 지원하는 객체들을 포함하여 메시지를 구성합니다.
다음은 종류별 메시지 구성 예제입니다.
let title = "피드 메시지"
let description = "피드 메시지 예제"
let feedTemplateJsonStringData =
"""
{
"object_type": "feed",
"content": {
"title": "오늘의 디저트",
"description": "#케익 #딸기 #삼평동 #카페 #분위기 #소개팅",
"image_url": "https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
},
"item_content" : {
"profile_text" :"Kakao",
"profile_image_url" :"https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
"title_image_url" : "https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
"title_image_text" :"Cheese cake",
"title_image_category" : "Cake",
"items" : [
{
"item" :"Cake1",
"item_op" : "1000원"
},
{
"item" :"Cake2",
"item_op" : "2000원"
},
{
"item" :"Cake3",
"item_op" : "3000원"
},
{
"item" :"Cake4",
"item_op" : "4000원"
},
{
"item" :"Cake5",
"item_op" : "5000원"
}
],
"sum" :"Total",
"sum_op" : "15000원"
},
"social": {
"comment_count": 45,
"like_count": 286,
"shared_count": 845
},
"buttons": [
{
"title": "웹으로 보기",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
},
{
"title": "앱으로 보기",
"link": {
"android_execution_params": "key1=value1&key2=value2",
"ios_execution_params": "key1=value1&key2=value2"
}
}
]
}
""".data(using: .utf8)!
let headerTitle = "리스트 메시지 예제"
let listTemplateJsonStringData =
"""
{
"object_type": "list",
"header_title": "WEEKLY MAGAZINE",
"header_link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
},
"contents": [
{
"title": "취미의 특징, 탁구",
"description": "스포츠",
"image_url": "https://mud-kage.kakao.com/dn/bDPMIb/btqgeoTRQvd/49BuF1gNo6UXkdbKecx600/kakaolink40_original.png",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
},
{
"title": "크림으로 이해하는 커피이야기",
"description": "음식",
"image_url": "https://mud-kage.kakao.com/dn/QPeNt/btqgeSfSsCR/0QJIRuWTtkg4cYc57n8H80/kakaolink40_original.png",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
},
{
"title": "감성이 가득한 분위기",
"description": "사진",
"image_url": "https://mud-kage.kakao.com/dn/c7MBX4/btqgeRgWhBy/ZMLnndJFAqyUAnqu4sQHS0/kakaolink40_original.png",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
}
],
"buttons": [
{
"title": "웹으로 보기",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
},
{
"title": "앱으로 보기",
"link": {
"android_execution_params": "key1=value1&key2=value2",
"ios_execution_params": "key1=value1&key2=value2"
}
}
]
}
""".data(using: .utf8)!
let title = "위치 메시지"
let description = "위치 메시지 예제"
let locationTemplateJsonStringData =
"""
{
"object_type": "location",
"address_title": "카카오 판교오피스 카페톡",
"address": "경기 성남시 분당구 판교역로 235 에이치스퀘어 N동 8층",
"content": {
"description": "이번 주는 체리블라썸라떼 1+1",
"image_url": "https://mud-kage.kakao.com/dn/bSbH9w/btqgegaEDfW/vD9KKV0hEintg6bZT4v4WK/kakaolink40_original.png",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.com"
},
"title": "신메뉴 출시❤️ 체리블라썸라떼"
},
"social": {
"comment_count": 45,
"like_count": 286,
"shared_count": 845
}
}
""".data(using: .utf8)!
let title = "커머스 메시지"
let description = "커머스 메시지 예제"
let commerceTemplateJsonStringData =
"""
{
"object_type": "commerce",
"commerce": {
"product_name": "Ivory long dress",
"regular_price": 208800,
"discount_price": 146160,
"discount_rate": 30
},
"content": {
"title": "Ivory long dress (4 Color)",
"image_url": "https://mud-kage.kakao.com/dn/RY8ZN/btqgOGzITp3/uCM1x2xu7GNfr7NS9QvEs0/kakaolink40_original.png",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
},
},
"buttons": [
{
"title": "구매하기",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
},
{
"title": "공유하기",
"link": {
"android_execution_params": "key1=value1&key2=value2",
"ios_execution_params": "key1=value1&key2=value2"
}
}
]
}
""".data(using: .utf8)!
let text = "카카오톡 공유는 카카오 플랫폼 서비스의 대표 기능으로써 사용자의 모바일 기기에 설치된 카카오 플랫폼과 연동하여 다양한 기능을 실행할 수 있습니다.\\n\\n현재 이용할 수 있는 카카오톡 공유는 다음과 같습니다.\\n카카오톡링크\\n카카오톡을 실행하여 사용자가 선택한 채팅방으로 메시지를 전송합니다."
let textTemplateJsonStringData =
"""
{
"object_type": "text",
"text": "\(text)",
"link": {
"web_url": "http://dev.kakao.com",
"mobile_web_url": "http://dev.kakao.com"
},
"button_title": "바로 확인"
}
""".data(using: .utf8)!
let calendarTemplateJsonStringData =
"""
{
"object_type": "calendar",
"id_type": "\(CalendarTemplate.IdType.Event.rawValue)",
"id": "${YOUR_EVENT_ID}",
"content": {
"link": {
"web_url": "https://devtalk.kakao.com",
"mobile_web_url": "https://developers.kakao.com"
},
"title": "1월 신작 평론 모임",
"image_url": "http://k.kakaocdn.net/dn/dFUqwp/bl3SUTqb2VV/VFSqyPpKUzZVVMcmotN9A0/kakaolink40_original.png"
},
"buttons": [
{
"title": "모임 주제 보기",
"link": {
"mobile_web_url": "https://developers.kakao.com",
"web_url": "https://developers.kakao.com"
}
}
]
}
""".data(using: .utf8)!
예를 들어 피드 메시지(Feed Message)를 구성하여 메시지를 보내려면 다음과 같이 진행합니다.
1. 템플릿 구성 요소 확인피드 메시지 구성 요소에서 어떤 객체를 포함해야 하는지 확인합니다. 레퍼런스를 통해서도 확인 가능합니다. iOS SDK에 피드 메시지는 FeedTemplate
클래스로 정의되어 있습니다.
피드 메시지에 포함할 수 있는 구성 요소는 content
, itemContent
, social
, buttonTitle
, buttons
입니다. 이 중 필수적으로 포함하여야 하는 구성 요소는 content
입니다. 각 구성 요소 또한 가이드 및 레퍼런스를 참고해 필수 및 선택 구성 요소의 내용을 채워 넣어 JSON
형식으로 메시지 객체를 생성합니다.
Step 2.에서 생성한 JSON
객체로 Templatable
객체를 생성합니다. Templatable
객체 생성 성공 시, 카카오톡 공유 또는 카카오톡 메시지 API 호출 시 전달합니다.
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareDefault() [SDK] isKakaoTalkSharingAvailable() [SDK] makeDefaultUrl() [SDK] SharingResult |
설치 모듈 설정 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
사용하려는 기본 템플릿에 따라 메시지를 JSON
형식으로 구성하여 카카오톡 메시지를 보내는 기능입니다.
카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareDefault()
를 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 url
을 열어 카카오톡으로 메시지를 공유하도록 구현합니다.makeDefaultUrl()
을 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.shareDefault()
의 경우, SdkJSONDecoder.custom.decode()
를 호출해 메시지 만들기에서 생성한 JSON
객체로 Templatable
객체를 생성합니다. 객체 생성 성공 시 메시지 전송에 사용합니다. 또는 고급: 생성자를 사용해 메시지 만들기를 참고해 templateObject
객체를 생성하여 메시지 전송 시 사용합니다.
//in ViewController
var safariViewController : SFSafariViewController? // to keep instance
//...
guard let templatable = try? SdkJSONDecoder.custom.decode(FeedTemplate.self, from: feedTemplateJsonStringData) else {
return
}
// 카카오톡 설치여부 확인
if ShareApi.isKakaoTalkSharingAvailable() {
// 카카오톡으로 카카오톡 공유 가능
// templatable은 메시지 만들기 항목 참고
ShareApi.shared.shareDefault(templatable: templatable) {(sharingResult, error) in
if let error = error {
print(error)
}
else {
print("shareDefault() success.")
if let sharingResult = sharingResult {
UIApplication.shared.open(sharingResult.url,
options: [:], completionHandler: nil)
}
}
}
else {
// 카카오톡 미설치: 웹 공유 사용 권장
// Custom WebView 또는 디폴트 브라우져 사용 가능
// 웹 공유 예시 코드
if let url = ShareApi.shared.makeDefaultUrl(templatable: templatable) {
self.safariViewController = SFSafariViewController(url: url)
self.safariViewController?.modalTransitionStyle = .crossDissolve
self.safariViewController?.modalPresentationStyle = .overCurrentContext
self.present(self.safariViewController!, animated: true) {
print("웹 present success")
}
}
}
// Class member property
let disposeBag = DisposeBag()
// templatable은 메시지 만들기 항목 참고
if let templatable = try? SdkJSONDecoder.custom.decode(FeedTemplate.self, from: feedTemplateJsonStringData) {
ShareApi.shared.rx.shareDefault(templatable:templatable)
.subscribe(onSuccess: { (sharingResult) in
print("shareDefault() success.")
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
}
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareCustom() [SDK] isKakaoTalkSharingAvailable() [SDK] makeCustomUrl() [SDK] SharingResult |
설치 모듈 설정 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
[도구] > [메시지 템플릿]에서 직접 구성한 사용자 정의 템플릿을 사용하여 카카오톡으로 메시지를 공유하는 기능입니다.
카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareCustom()
를 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 url
을 열어 카카오톡으로 메시지를 공유하도록 구현합니다.makeCustomUrl()
를 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.let templateId = 12345
// 카카오톡 설치여부 확인
if ShareApi.isKakaoTalkSharingAvailable() {
// 카카오톡으로 카카오톡 공유 가능
ShareApi.shared.shareCustom(templateId: templateId, templateArgs:["title":"제목입니다.", "description":"설명입니다."]) {(sharingResult, error) in
if let error = error {
print(error)
}
else {
print("shareCustom() success.")
if let sharingResult = sharingResult {
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}
}
}
}
else {
// 카카오톡 미설치: 웹 공유 사용 권장
// Custom WebView 또는 디폴트 브라우져 사용 가능
// 웹 공유 예시 코드
if let url = ShareApi.shared.makeCustomUrl(templateId: templateId, templateArgs:["title":"제목입니다.", "description":"설명입니다."]) {
self.safariViewController = SFSafariViewController(url: url)
self.safariViewController?.modalTransitionStyle = .crossDissolve
self.safariViewController?.modalPresentationStyle = .overCurrentContext
self.present(self.safariViewController!, animated: true) {
print("웹 present success")
}
}
}
// Class member property
let disposeBag = DisposeBag()
let templateId = 12345
ShareApi.shared.rx.shareCustom(templateId:templateId, templateArgs:["title":"제목입니다.", "description":"설명입니다."])
.subscribe(onSuccess: { (sharingResult) in
print("shareCustom() success.")
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareScrap() [SDK] isKakaoTalkSharingAvailable() [SDK] makeScrapUrl() [SDK] SharingResult |
설치 모듈 설정 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
스크랩한 웹 페이지 정보를 바탕으로 메시지를 구성하여 카카오톡으로 메시지를 공유하는 기능입니다.
카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareScrap()
를 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 url
을 열어 카카오톡으로 메시지를 공유하도록 구현합니다.makeScrapUrl()
를 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.let requestUrl = "https://developers.kakao.com"
// 카카오톡 설치여부 확인
if ShareApi.isKakaoTalkSharingAvailable() {
// 카카오톡으로 카카오톡 공유 가능
ShareApi.shared.shareScrap(requestUrl: requestUrl) {(sharingResult, error) in
if let error = error {
print(error)
}
else {
print("shareScrap() success.")
if let sharingResult = sharingResult {
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}
}
}
}
else {
// 카카오톡 미설치: 웹 공유 사용 권장
// Custom WebView 또는 디폴트 브라우져 사용 가능
// 웹 공유 예시 코드
if let url = ShareApi.shared.makeScrapUrl(requestUrl: requestUrl) {
self.safariViewController = SFSafariViewController(url: url)
self.safariViewController?.modalTransitionStyle = .crossDissolve
self.safariViewController?.modalPresentationStyle = .overCurrentContext
self.present(self.safariViewController!, animated: true) {
print("웹 present success")
}
}
}
// Class member property
let disposeBag = DisposeBag()
let requestUrl = "https://developers.kakao.com"
ShareApi.shared.rx.shareScrap(requestUrl: requestUrl)
.subscribe(onSuccess: { (sharingResult) in
print("shareScrap() success.")
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] shareScrap() [SDK] isKakaoTalkSharingAvailable() [SDK] makeScrapUrl() [SDK] SharingResult |
설치 모듈 설정 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 메시지 템플릿 |
- | - |
스크랩한 웹 페이지 정보를 바탕으로 메시지를 구성하여 카카오톡으로 메시지를 공유하는 기능입니다. [도구] > [메시지 템플릿]에서 구성한 사용자 정의 템플릿을 사용하여 메시지를 구성합니다.
카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoTalkSharingAvailable()
을 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다.
shareScrap()
를 호출하여 SharingResult
객체를 반환받습니다. 해당 객체의 url
을 열어 카카오톡으로 메시지를 공유하도록 구현합니다.makeScrapUrl()
를 통해 웹 공유 URL을 생성한 후, 기본 브라우저나 웹뷰로 해당 URL을 열도록 구현합니다.let requestUrl = "https://developers.kakao.com"
let templateId = 12345
// 카카오톡 설치여부 확인
if ShareApi.isKakaoTalkSharingAvailable() {
// 카카오톡으로 카카오톡 공유 가능
ShareApi.shared.shareScrap(requestUrl: requestUrl, templateId: templateId) {(sharingResult, error) in
if let error = error {
print(error)
}
else {
print("shareScrap() success.")
if let sharingResult = sharingResult {
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}
}
}
else {
// 카카오톡 미설치: 웹 공유 사용 권장
// Custom WebView 또는 디폴트 브라우져 사용 가능
// 웹 공유 예시 코드
if let url = ShareApi.shared.makeScrapUrl(requestUrl: requestUrl, templateId: templateId) {
self.safariViewController = SFSafariViewController(url: url)
self.safariViewController?.modalTransitionStyle = .crossDissolve
self.safariViewController?.modalPresentationStyle = .overCurrentContext
self.present(self.safariViewController!, animated: true) {
print("웹 present success")
}
}
}
// Class member property
let disposeBag = DisposeBag()
let requestUrl = "https://developers.kakao.com"
let templateId = 12345
ShareApi.shared.rx.shareScrap(requestUrl: requestUrl, templateId: templateId)
.subscribe(onSuccess: { (sharingResult) in
print("shareScrap() success.")
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
전송 성공 알림은 사용자가 선택한 친구나 채팅방으로 카카오톡 공유 메시지가 성공적으로 전달된 경우, 카카오디벨로퍼스에 설정된 콜백 URL로 메시지가 성공적으로 전달되었음을 알려주는 기능입니다. 카카오톡 공유 메시지 전송 시에만 사용할 수 있고, 카카오톡 메시지 전송에는 지원되지 않습니다. 카카오톡 공유는 사용자가 카카오톡에서 메시지를 전송하므로 서비스에서 전송 성공 여부를 직접 확인할 수 없기 때문에 메시지 전송 성공 시 알림을 받는 서버 콜백(Callback) 기능을 제공합니다.
이 기능을 사용하려면 다음을 수행해야 합니다.
서비스 서버를 통해 카카오톡 공유 메시지 전송 성공 알림을 받을 때, 미리 설정해둔 사용자 정의(Custom) 파라미터를 통해 사용자가 공유한 콘텐츠가 무엇인지 등 추가 정보를 알 수 있습니다. 서비스 서버로 보내지는 알림은 자세한 메시지 전송 관련 정보를 포함하고 있지 않으므로 어떤 메시지의 전송 결과인지, 사용자가 무슨 정보를 공유했는지 등 서비스에서 필요한 추가 정보로 파라미터를 구성합니다. [내 애플리케이션]에서 카카오톡 공유 콜백을 설정하였더라도 사용자 정의 파라미터가 없을 경우에는 카카오톡 공유 전송 성공 알림이 전달되지 않습니다.
serverCallbackArgs
파라미터에 Dictionary
자료형으로 키와 값의 쌍으로 구성한 정보를 담아 카카오톡 공유 API 요청 시 전달해야 하며, 키에는 시스템 예약어인 CHAT_TYPE
, HASH_CHAT_ID
, TEMPLATE_ID
를 사용할 수 없습니다. 해당 키는 카카오톡 공유 전송 성공 알림의 명세에 정의된 값으로 알림에 포함됩니다.
다음은 카카오톡 공유 전송 성공 알림 파라미터 설정 예제입니다.
// 템플릿 ID
let templateId = 12345;
// 템플릿 Arguments
let templateArgs = ["title": "제목 영역입니다.", "description": "설명 영역입니다."]
// 서버에서 콜백으로 받을 정보
let serverCallbackArgs = ["user_id": "abcd", "product_id": "1234"]
// 카카오톡 설치여부 확인
if ShareApi.isKakaoTalkSharingAvailable() {
// 카카오톡으로 카카오톡 공유 가능
ShareApi.shared.shareCustom(templateId:templateId,
templateArgs:templateArgs,
serverCallbackArgs: serverCallbackArgs) { (sharingResult, error) in
if let error = error {
print(error)
}
else {
print("shareCustom() success.")
if let sharingResult = sharingResult {
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}
}
}
}
else {
// 카카오톡 미설치: 웹 공유 사용 권장
// Custom WebView 또는 디폴트 브라우져 사용 가능
// 웹 공유 예시 코드
if let url = ShareApi.shared.makeCustomUrl(templateId:templateId,
templateArgs:templateArgs,
serverCallbackArgs: serverCallbackArgs) {
self.safariViewController = SFSafariViewController(url: url)
self.safariViewController?.modalTransitionStyle = .crossDissolve
self.safariViewController?.modalPresentationStyle = .overCurrentContext
self.present(self.safariViewController!, animated: true) {
print("웹 present success")
}
}
}
// Class member property
let disposeBag = DisposeBag()
// 템플릿 ID
let templateId = 12345;
// 템플릿 Arguments
let templateArgs = ["title": "제목 영역입니다.", "description": "설명 영역입니다."]
// 서버에서 콜백으로 받을 정보
let serverCallbackArgs = ["user_id": "abcd", "product_id": "1234"]
ShareApi.shared.rx.shareCustom(templateId:templateId,
templateArgs:templateArgs,
serverCallbackArgs: serverCallbackArgs)
.subscribe(onSuccess: { (sharingResult) in
print("shareCustom() success.")
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
}
위와 같이 설정된 파라미터는 서비스 서버의 콜백 URL에 보내지는 알림에 요청 파라미터 형태로 전달됩니다. 카카오가 보내는 카카오톡 공유 성공 알림 요청 전문은 카카오톡 공유 전송 성공 알림을 확인합니다.
레퍼런스 | 앱 설정 |
---|---|
[SDK, RxSDK] imageUpload() [SDK, RxSDK] imageScrap() [SDK] ImageUploadResult |
설치 모듈 설정 초기화 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
- | 플랫폼 등록 | - | - |
메시지에 넣을 이미지는 URL 형태로 메시지 템플릿 구성 시에 첨부하거나, 메시지 템플릿 도구에서 미리 업로드할 수 있습니다. 기기에 저장된 이미지 파일은 서버에 업로드하고 이미지 파일 URL 값을 구해야 메시지 전송에 사용할 수 있습니다.
이미지 파일 URL을 구하기 어려운 경우, 웹 페이지 속 이미지 파일을 카카오 서버로 업로드하거나 스크랩해두는 기능을 이용할 수 있습니다. 파일 용량 5MB 이하 이미지만 업로드할 수 있습니다. 카카오 서버에 업로드된 이미지는 최대 100일간 보관되고, 기간이 지나면 자동으로 삭제됩니다.
요청 성공 시 업로드된 이미지의 URL 정보를 문자열(String) 값으로 받습니다. 이 URL을 메시지 만들기에 사용할 수 있습니다.
이미 서비스 서버에 업로드되어 있는 이미지 파일의 정보를 스크랩하고, 카카오 서버에 저장하여 메시지 전송에 사용할 수도 있습니다. 이미지 파일 스크랩에는 imageScrap()
API를 사용합니다.
if let image = UIImage(named: "sample1") {
ShareApi.shared.imageUpload(image:image) { [weak self] (imageUploadResult, error) in
if let error = error {
print(error)
}
else {
print("imageUpload() success.")
}
}
}
// Class member property
let disposeBag = DisposeBag()
if let image = UIImage(named: "sample1") {
ShareApi.shared.rx.imageUpload(image:image)
.subscribe(onSuccess: { (imageUploadResult) in
print("imageUpload() success.")
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
}
if let url = URL(string:"https://t1.kakaocdn.net/kakaocorp/Service/KakaoTalk/pc/slide/talkpc_theme_01.jpg") {
ShareApi.shared.imageScrap(imageUrl: url, completion: { [weak self] (imageUploadResult, error) in
if let error = error {
print(error)
}
else {
print("imageUpload() success.")
}
})
}
// Class member property
let disposeBag = DisposeBag()
if let url = URL(string:"https://t1.kakaocdn.net/kakaocorp/Service/KakaoTalk/pc/slide/talkpc_theme_01.jpg") {
ShareApi.shared.rx.imageScrap(imageUrl: url)
.subscribe(onSuccess: { (imageUploadResult) in
print(String(describing:imageUploadResult))
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
}
메시지는 JSON
형식으로 구성하는 것이 기본적인 방법이지만, 메시지 유형별 템플릿 클래스의 생성자를 사용해 메시지를 만들 수도 있습니다. 이 방법을 사용할 경우 구성 요소들을 보다 명시적으로 파악하고 정의할 수 있다는 장점이 있습니다. 메시지 유형별 템플릿 클래스 객체는 메시지 전송 요청에 바로 사용할 수 없고, 실제 요청 파라미터에 쓰일 templateObject
객체 생성에 사용해야 합니다.
let link = Link(webUrl: URL(string:"https://developers.kakao.com"),
mobileWebUrl: URL(string:"https://developers.kakao.com"))
let appLink = Link(androidExecutionParams: ["key1": "value1", "key2": "value2"],
iosExecutionParams: ["key1": "value1", "key2": "value2"])
let button1 = Button(title: "웹으로 보기", link: link)
let button2 = Button(title: "앱으로 보기", link: appLink)
let social = Social(likeCount: 286,
commentCount: 45,
sharedCount: 845)
let content = Content(title: "딸기 치즈 케익",
imageUrl: URL(string:"https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png")!,
description: "#케익 #딸기 #삼평동 #카페 #분위기 #소개팅",
link: link)
let feedTemplate = FeedTemplate(content: content, social: social, buttons: [button1, button2])
//메시지 템플릿 encode
if let feedTemplateJsonData = (try? SdkJSONEncoder.custom.encode(feedTemplate)) {
//생성한 메시지 템플릿 객체를 jsonObject로 변환
if let templateJsonObject = SdkUtils.toJsonObject(feedTemplateJsonData) {
ShareApi.shared.shareDefault(templateObject:templateJsonObject) {(sharingResult, error) in
if let error = error {
errorHandler(error)
}
else {
print("shareDefault(templateObject:templateJsonObject) success.")
// 성공 시 동작 구현
guard let sharingResult = sharingResult else { return }
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}
}
}
}
// Class member property
let disposeBag = DisposeBag()
let link = Link(webUrl: URL(string:"https://developers.kakao.com"),
mobileWebUrl: URL(string:"https://developers.kakao.com"))
let appLink = Link(androidExecutionParams: ["key1": "value1", "key2": "value2"],
iosExecutionParams: ["key1": "value1", "key2": "value2"])
let button1 = Button(title: "웹으로 보기", link: link)
let button2 = Button(title: "앱으로 보기", link: appLink)
let social = Social(likeCount: 286,
commentCount: 45,
sharedCount: 845)
let content = Content(title: "딸기 치즈 케익",
imageUrl: URL(string:"https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png")!,
description: "#케익 #딸기 #삼평동 #카페 #분위기 #소개팅",
link: link)
let feedTemplate = FeedTemplate(content: content, social: social, buttons: [button1, button2])
//생성한 메시지 템플릿 encode
if let feedTemplateJsonData = (try? SdkJSONEncoder.custom.encode(feedTemplate)) {
//생성한 메시지 템플릿을 jsonObject로 변환
if let templateJsonObject = SdkUtils.toJsonObject(feedTemplateJsonData) {
ShareApi.shared.rx.shareDefault(templateObject:templateJsonObject)
.subscribe(onSuccess: { (sharingResult) in
print("success.")
// 성공 시 동작 구현
UIApplication.shared.open(sharingResult.url, options: [:], completionHandler: nil)
}, onFailure: {error in
print(error)
})
.disposed(by: disposeBag)
}
}