페이지 이동경로
  • 문서>
  • 메시지>
  • 카카오링크: iOS

메시지

카카오링크: iOS

이 문서는 Kakao SDK for iOS(이하 iOS SDK)를 사용한 카카오링크 API 구현 방법을 안내합니다.

애플리케이션 설정 확인

이 기능을 사용하려면 카카오디벨로퍼스(Kakao Developers, 이하 개발자 웹사이트) 애플리케이션(이하 앱) 설정에 iOS 플랫폼 및 번들 ID 등 정보가 등록되어 있어야 합니다. 자세한 내용은 애플리케이션 등록을 참고합니다.

시작하기 전에

필요한 모듈 설정하기

카카오링크 API는 LinkApi 모듈이 제공합니다. 모듈 설치 방법은 설치하기를 참고합니다.

모듈 설치 후 카카오링크 API를 사용하려면 다음과 같이 import합니다.

Swift
RxSwift
import KakaoSDKLink

// 기본 템플릿 사용 시 필요
import KakaoSDKTemplate
import KakaoSDKLink
import RxKakaoSDKLink

// 기본 템플릿 사용 시 필요
import KakaoSDKTemplate

사용할 API 선택하기

Step 1. 메시지 API 선택

메시지 API는 카카오링크와 카카오톡 메시지 두 가지입니다. 이해하기를 참고해 어떤 API로 메시지 보내기를 구현할 것인지 결정합니다.

Step 2. 메시지 종류 및 구성 방법 선택

메시지 템플릿 > 종류를 참고하여 어떤 메시지 템플릿을 사용할지 결정합니다.

보낼 메시지는 기본 템플릿을 바탕으로 객체 형태로 구성하거나, 서비스에 맞게 직접 구성한 사용자 정의 템플릿을 사용하여 구성할 수 있습니다. 자세한 사항은 메시지 구성 방법을 참고합니다.

메시지를 구성한 후, 원하는 메시지 및 템플릿에 따라 API를 호출합니다. 요청이 성공하면 iOS SDK는 카카오톡을 실행하거나, 웹 페이지를 통해 카카오계정으로 로그인하여 메시지를 보낼 친구 및 대화방 목록을 보여줍니다. 사용자가 메시지를 보낼 친구 또는 대화방을 선택하면 메시지가 전송됩니다.

커스텀 URL 스킴(Custom URL Scheme) 설정하기

사용자가 카카오톡 메시지의 버튼을 통해 앱을 실행할 수 있도록 하려면 Info.plist 설정에서 추가한 LSApplicationQueriesSchemes 설정의 'kakaolink' 값이 필요합니다. 이 설정은 "kakao{YOUR_NATIVE_APP_KEY}://kakaolink" 형식의 앱 실행 스킴을 만드는 데 쓰입니다.

카카오톡 메시지의 앱 실행 스킴에는 androidExecutionParamsiosExecutionParams로 앱 실행 시 앱에 전달할 파라미터를 설정할 수 있습니다. 이 파라미터는 앱 실행 스킴에 다음과 같은 형식으로 추가됩니다.

kakao{YOUR_NATIVE_APP_KEY}://kakaolink${androidExecutionParams}
kakao{YOUR_NATIVE_APP_KEY}://kakaolink${iosExecutionParams}

메시지 만들기

카카오링크와 카카오톡 메시지 API는 카카오톡 메시지를 구성할 때 KakaoSDKTemplate에 정의된 클래스들을 공통적으로 사용합니다. 메시지 템플릿 > 기본 메시지 템플릿 구성 요소를 참고하여 원하는 메시지 템플릿에서 지원하는 객체들을 포함하여 메시지를 구성합니다.

다음은 종류별 메시지 구성 예제입니다.

Feed
List
Location
Commerce
Text
let title = "피드 메시지"
let description = "피드 메시지 예제"

let feedTemplateJsonStringData =
    """
    {
        "object_type": "feed",
        "content": {
            "title": "오늘의 디저트",
            "description": "#케익 #딸기 #삼평동 #카페 #분위기 #소개팅",
            "image_url": "http://mud-kage.kakao.co.kr/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" :"http://mud-kage.kakao.co.kr/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png",
            "title_image_url" : "http://mud-kage.kakao.co.kr/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": "http://mud-kage.kakao.co.kr/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": "http://mud-kage.kakao.co.kr/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": "http://mud-kage.kakao.co.kr/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": "http://mud-kage.kakao.co.kr/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": "http://mud-kage.kakao.co.kr/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카카오톡을 실행하여 사용자가 선택한 채팅방으로 메시지를 전송합니다.\\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)!

예를 들어 피드 메시지(Feed Message)를 구성하여 메시지를 보내려면 다음과 같이 진행합니다.

Step 1. 템플릿 구성 요소 확인

메시지 템플릿 > 피드 메시지 구성 요소에서 어떤 객체를 포함해야 하는지 확인합니다. 레퍼런스를 통해서도 확인 가능합니다. iOS SDK에 피드 메시지는 FeedTemplate 클래스로 정의되어 있습니다.

Step 2. 템플릿 구성 요소 정의

피드 메시지에 포함할 수 있는 구성 요소는 content, itemContent, social, buttonTitle, buttons입니다. 이 중 필수적으로 포함하여야 하는 구성 요소는 content입니다. 각 구성 요소 또한 가이드 및 레퍼런스를 참고해 필수 및 선택 구성 요소의 내용을 채워 넣어 JSON 형식으로 메시지 객체를 생성합니다.

Step 3. 메시지 전송 요청

Step 2.에서 생성한 JSON 객체로 Templatable 객체를 생성합니다. Templatable 객체를 생성하는 데 성공하면 카카오링크 또는 카카오톡 메시지 API 호출 시 전달합니다.

기본 템플릿으로 메시지 보내기

사용하려는 기본 템플릿에 따라 메시지를 JSON 형식으로 구성하여 카카오톡 메시지를 보내는 기능입니다.

defaultLink()의 경우, SdkJSONDecoder.custom.decode()를 호출해 메시지 만들기에서 생성한 JSON 객체로 Templatable 객체를 생성합니다. 생성 성공 시 메시지 전송에 사용합니다. 또는 고급: 생성자를 사용해 메시지 만들기를 참고해 templateObject 객체를 생성하여 메시지 전송 시 사용합니다.

카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoLinkAvailable를 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다. 카카오톡이 설치되어 있는 경우 defaultLink를 호출하여 카카오톡으로 메시지를 공유할 수 있도록 합니다. 카카오톡이 설치되어 있지 않다면 makeSharerUrlforDefaultLink를 통해 공유용 URL을 선언한 후, 기본 브라우저나 웹뷰로 해당 URL을 열 수 있도록 구현합니다.

Parameter
Name Type Description Required
templatable Templatable 전송할 메시지 템플릿 객체
원하는 템플릿에 맞는 클래스로 객체를 생성해야 함
메시지 만들기 참고
O
serverCallbackArgs [String:String]? 메시지 전송 성공 시 서비스 서버로 알림을 보내고 싶을 때 사용
카카오링크 전송 성공 알림 설정하기 참고
X
Swift
RxSwift
//in ViewController
var safariViewController : SFSafariViewController? // to keep instance
//...

guard let templatable = try? SdkJSONDecoder.custom.decode(FeedTemplate.self, from: feedTemplateJsonStringData) else {
    return
}

// 카카오톡 설치여부 확인
if LinkApi.isKakaoLinkAvailable() {
    // 카카오톡으로 카카오링크 공유 가능
    // templatable은 메시지 만들기 항목 참고
    LinkApi.shared.defaultLink(templatable: templatable) {(linkResult, error) in
    if let error = error {
        print(error)
    }
    else {
        print("defaultLink() success.")

        if let linkResult = linkResult {
            UIApplication.shared.open(linkResult.url, 
                            options: [:], completionHandler: nil)
        }
    }
}
else {
    // 카카오톡 미설치: 웹 공유 사용 권장
    // Custom WebView 또는 디폴트 브라우져 사용 가능
    // 웹 공유 예시 코드
    if let url = LinkApi.shared.makeSharerUrlforDefaultLink(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) {
    LinkApi.shared.rx.defaultLink(templatable:templatable)
        .subscribe(onSuccess: { (linkResult) in
            print("defaultLink() success.")
            
            UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
        }, onFailure: {error in
            print(error)
        })
        .disposed(by: disposeBag)
}

사용자 정의 템플릿으로 메시지 보내기

[도구] > [메시지 템플릿]에서 직접 구성한 사용자 정의 템플릿을 사용하여 카카오톡으로 메시지를 공유하는 기능입니다.

카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoLinkAvailable를 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다. 카카오톡이 설치되어 있는 경우 customLink를 호출하여 카카오톡으로 메시지를 공유할 수 있도록 합니다. 카카오톡이 설치되어 있지 않다면 makeSharerUrlforCustomLink를 통해 공유용 URL을 선언한 후, 기본 브라우저나 웹뷰로 해당 URL을 열 수 있도록 구현합니다.

Parameter
Name Type Description Required
templateId Int64 메시지 템플릿 도구에서 구성한 사용자 정의 템플릿의 ID O
templateArgs [String:String]? templateId로 지정한 템플릿에 사용자 인자(User argument)가 포함되어 있는 경우 대입할 값, key:value 형식으로 전달 X
serverCallbackArgs [String:String]? 메시지 전송 성공 시 서비스 서버로 알림을 보내고 싶을 때 사용
카카오링크 전송 성공 알림 설정하기 참고
X
Swift
RxSwift
let templateId = 12345

// 카카오톡 설치여부 확인
if LinkApi.isKakaoLinkAvailable() {
    // 카카오톡으로 카카오링크 공유 가능
    LinkApi.shared.customLink(templateId: templateId, templateArgs:["title":"제목입니다.", "description":"설명입니다."]) {(linkResult, error) in
        if let error = error {
            print(error)
        }
        else {
            print("customLink() success.")
            if let linkResult = linkResult {
                UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
            }
        }
    }
}
else {
    // 카카오톡 미설치: 웹 공유 사용 권장
    // Custom WebView 또는 디폴트 브라우져 사용 가능
    // 웹 공유 예시 코드
    if let url = LinkApi.shared.makeSharerUrlforCustomLink(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

LinkApi.shared.rx.customLink(templateId:templateId, templateArgs:["title":"제목입니다.", "description":"설명입니다."])
    .subscribe(onSuccess: { (linkResult) in
        print("customLink() success.")
        
        UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

기본 템플릿으로 스크랩 메시지 보내기

스크랩한 웹 페이지 정보를 바탕으로 메시지를 구성하여 카카오톡으로 메시지를 공유하는 기능입니다.

카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoLinkAvailable를 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다. 카카오톡이 설치되어 있는 경우 scrapLink를 호출하여 카카오톡으로 메시지를 공유할 수 있도록 합니다. 카카오톡이 설치되어 있지 않다면 makeSharerUrlforScrapLink를 통해 공유용 URL을 선언한 후, 기본 브라우저나 웹뷰로 해당 URL을 열 수 있도록 구현합니다.

Parameter
Name Type Description Required
requestUrl String 스크랩할 웹 페이지 URL, [내 애플리케이션] > [플랫폼] > [Web]에 등록된 도메인만 사용 가능 O
serverCallbackArgs [String:String]? 메시지 전송 성공 시 서비스 서버로 알림을 보내고 싶을 때 사용
카카오링크 전송 성공 알림 설정하기 참고
X
Swift
RxSwift
let requestUrl = "https://developers.kakao.com"

// 카카오톡 설치여부 확인
if LinkApi.isKakaoLinkAvailable() {
    // 카카오톡으로 카카오링크 공유 가능
    LinkApi.shared.scrapLink(requestUrl: requestUrl) {(linkResult, error) in
        if let error = error {
            print(error)
        }
        else {
            print("scrapLink() success.")
            if let linkResult = linkResult {
                UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
            }
        }
    }
}
else {
    // 카카오톡 미설치: 웹 공유 사용 권장
    // Custom WebView 또는 디폴트 브라우져 사용 가능
    // 웹 공유 예시 코드
    if let url = LinkApi.shared.makeSharerUrlforScrapLink(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"

LinkApi.shared.rx.scrapLink(requestUrl: requestUrl)
    .subscribe(onSuccess: { (linkResult) in
        print("scrapLink() success.")
        
        UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

사용자 정의 템플릿으로 스크랩 메시지 보내기

스크랩한 웹 페이지 정보를 바탕으로 메시지를 구성하여 카카오톡으로 메시지를 공유하는 기능입니다. [도구] > [메시지 템플릿]에서 구성한 사용자 정의 템플릿을 사용하여 메시지를 구성합니다.

카카오톡을 통해 메시지 공유가 가능한지 확인하기 위해 먼저 isKakaoLinkAvailable를 호출하여 사용자 기기에 카카오톡이 설치되어 있는지 확인합니다. 카카오톡이 설치되어 있는 경우 scrapLink를 호출하여 카카오톡으로 메시지를 공유할 수 있도록 합니다. 카카오톡이 설치되어 있지 않다면 makeSharerUrlforScrapLink를 통해 공유용 URL을 선언한 후, 기본 브라우저나 웹뷰로 해당 URL을 열 수 있도록 구현합니다.

Parameter
Name Type Description Required
requestUrl String 스크랩할 웹 페이지 URL, [내 애플리케이션] > [플랫폼] > [Web]에 등록된 도메인만 사용 가능 O
templateId Int64 스크랩한 정보를 반영할 사용자 정의 템플릿 ID([도구] > [메시지 템플릿]에서 구성한 템플릿의 ID)
스크랩 메시지 참고
O
templateArgs [String:String]? templateId로 지정한 템플릿에 사용자 인자(User argument)가 포함되어 있는 경우 대입할 값, key:value 형식으로 전달
스크랩 결과를 덮어쓰기(overwrite) 할 수는 없음
X
serverCallbackArgs [String:String]? 메시지 전송 성공 시 서비스 서버로 알림을 보내고 싶을 때 사용
카카오링크 전송 성공 알림 설정하기 참고
X
Swift
RxSwift
let requestUrl = "https://developers.kakao.com"
let templateId = 12345

// 카카오톡 설치여부 확인
if LinkApi.isKakaoLinkAvailable() {
    // 카카오톡으로 카카오링크 공유 가능
    LinkApi.shared.scrapLink(requestUrl: requestUrl, templateId: templateId) {(linkResult, error) in
    if let error = error {
        print(error)
    }
    else {
        print("scrapLink() success.")
        if let linkResult = linkResult {
            UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
        }
    }
}
else {
    // 카카오톡 미설치: 웹 공유 사용 권장
    // Custom WebView 또는 디폴트 브라우져 사용 가능
    // 웹 공유 예시 코드
    if let url = LinkApi.shared.makeSharerUrlforScrapLink(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


LinkApi.shared.rx.scrapLink(requestUrl: requestUrl, templateId: templateId)
    .subscribe(onSuccess: { (linkResult) in
        print("scrapLink() success.")
        
        UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

카카오링크 전송 성공 알림 설정하기

카카오링크 전송 성공 알림은 사용자가 선택한 친구나 채팅방으로 카카오링크 메시지가 성공적으로 전달된 경우, 개발자 웹사이트에 설정된 콜백 URL로 메시지가 성공적으로 전달되었음을 알려주는 기능입니다. 카카오링크 메시지 전송 시에만 사용할 수 있고, 카카오톡 메시지 전송에는 지원되지 않습니다. 카카오링크는 사용자가 카카오톡에서 메시지를 전송하므로 서비스에서 전송 성공 여부를 직접 확인할 수 없기 때문에 메시지 전송 성공 시 알림을 받는 서버 콜백(Callback) 기능을 제공합니다.

이 기능을 사용하려면 다음을 수행해야 합니다:

  1. 설정하기 > 카카오링크 전송 성공 알림 설정을 참고하여 콜백 URL과 요청 방법(Method) 설정
  2. 카카오링크 콜백을 받을 서버 구현
  3. 카카오링크 API 호출 시 사용자 정의(Custom) 파라미터 전달
  4. 서비스 서버의 콜백 URL로 전달되는 알림에 대한 처리 구현

서비스 서버를 통해 카카오링크 메시지 전송 성공 알림을 받을 때, 미리 설정해둔 사용자 정의(Custom) 파라미터를 통해 사용자가 공유한 콘텐츠가 무엇인지 등 추가 정보를 알 수 있습니다. 서비스 서버로 보내지는 알림은 자세한 메시지 전송 관련 정보를 포함하고 있지 않으므로 어떤 메시지의 전송 결과인지, 사용자가 무슨 정보를 공유했는지 등 서비스에서 필요한 추가 정보로 파라미터를 구성합니다. [내 애플리케이션]에서 카카오링크 콜백을 설정하였더라도 사용자 정의 파라미터가 없을 경우에는 카카오링크 전송 성공 알림이 전달되지 않습니다.

serverCallbackArgs 파라미터에 Dictionary 자료형으로 키와 값의 쌍으로 구성한 정보를 담아 카카오링크 API 요청 시 전달해야 합니다. 다음은 카카오링크 전송 성공 알림 파라미터 설정 예제입니다.

Swift
RxSwift
// 템플릿 ID
let templateId = 12345;
// 템플릿 Arguments
let templateArgs = ["title": "제목 영역입니다.", "description": "설명 영역입니다."]
// 서버에서 콜백으로 받을 정보
let serverCallbackArgs = ["user_id": "abcd", "product_id": "1234"]

// 카카오톡 설치여부 확인
if LinkApi.isKakaoLinkAvailable() {
    // 카카오톡으로 카카오링크 공유 가능
    LinkApi.shared.customLink(templateId:templateId,
                            templateArgs:templateArgs,
                            serverCallbackArgs: serverCallbackArgs) { (linkResult, error) in
        if let error = error {
            print(error)
        }
        else {
            print("customLink() success.")
            if let linkResult = linkResult {
                UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
            }
        }
    }
}
else {
    // 카카오톡 미설치: 웹 공유 사용 권장
    // Custom WebView 또는 디폴트 브라우져 사용 가능
    // 웹 공유 예시 코드
    if let url = LinkApi.shared.makeSharerUrlforCustomLink(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"]

LinkApi.shared.rx.customLink(templateId:templateId,
                            templateArgs:templateArgs,
                            serverCallbackArgs: serverCallbackArgs)
    .subscribe(onSuccess: { (linkResult) in
        print("customLink() success.")
        
        UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)
}

위와 같이 설정된 파라미터는 서비스 서버의 콜백 URL에 보내지는 알림에 요청 파라미터 형태로 전달됩니다. 카카오가 보내는 카카오링크 성공 알림 요청 전문은 유용한 참고 정보 > 고급: 카카오링크 전송 성공 알림을 확인합니다.

이미지 업로드하기

메시지에 넣을 이미지는 URL 형태로 메시지 템플릿 구성 시에 첨부하거나, 메시지 템플릿 도구에서 미리 업로드할 수 있습니다. 기기에 저장된 이미지 파일은 서버에 업로드하고 이미지 파일 URL 값을 구해야 메시지 전송에 사용할 수 있습니다.

이미지 파일 URL을 구하기 어려운 경우, 웹 페이지 속 이미지 파일을 카카오 서버로 업로드하거나 스크랩해두는 기능을 이용할 수 있습니다. 카카오링크 전용 서버에 업로드된 이미지는 최대 20일간 보관되고, 기간이 지나면 자동으로 삭제됩니다.

LinkApiimageUpload() API를 사용해 이미지를 업로드할 수 있습니다.

주의사항

파일 용량 2MB 이하 이미지만 업로드할 수 있습니다.

Swift
RxSwift
if let image = UIImage(named: "sample1") {
    LinkApi.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") {
    LinkApi.shared.rx.imageUpload(image:image)
        .subscribe(onSuccess: { (imageUploadResult) in
            print("imageUpload() success.")
            
        }, onFailure: {error in
            print(error)
        })
        .disposed(by: disposeBag)
}

요청 성공 시 업로드된 이미지의 URL 정보를 문자열(String) 값으로 받습니다. 이 URL을 메시지 만들기에 사용할 수 있습니다.

이미 서비스 서버에 업로드되어 있는 이미지 파일의 정보를 스크랩하고, 카카오 서버에 저장하여 메시지 전송에 사용할 수도 있습니다. 이미지 파일 스크랩에는 imageScrap() API를 사용합니다. 다음은 이미지 스크랩하기 예제입니다.

Swift
RxSwift
if let url = URL(string:"https://t1.kakaocdn.net/kakaocorp/Service/KakaoTalk/pc/slide/talkpc_theme_01.jpg") {
    LinkApi.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") {
    LinkApi.shared.rx.imageScrap(imageUrl: url)
        .subscribe(onSuccess: { (imageUploadResult) in
            print(String(describing:imageUploadResult))            
        }, onFailure: {error in
            print(error)
        })
        .disposed(by: disposeBag)
}

고급: 생성자를 사용해 메시지 만들기

메시지는 JSON 형식으로 구성하는 것이 기본적인 방법이지만, 메시지 유형별 템플릿 클래스의 생성자를 사용해 메시지를 만들 수도 있습니다. 이 방법을 사용할 경우 구성 요소들을 보다 명시적으로 파악하고 정의할 수 있다는 장점이 있습니다. 메시지 유형별 템플릿 클래스 객체는 메시지 전송 요청에 바로 사용할 수 없고, 실제 요청 파라미터에 쓰일 templateObject 객체 생성에 사용해야 합니다.

Swift
RxSwift
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:"http://mud-kage.kakao.co.kr/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) {
        LinkApi.shared.defaultLink(templateObject:templateJsonObject) {(linkResult, error) in
            if let error = error {
                errorHandler(error)
            }
            else {
                print("defaultLink(templateObject:templateJsonObject) success.")
                
                //do something
                guard let linkResult = linkResult else { return }
                UIApplication.shared.open(linkResult.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:"http://mud-kage.kakao.co.kr/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) {
        LinkApi.shared.rx.defaultLink(templateObject:templateJsonObject)
            .subscribe(onSuccess: { (linkResult) in
                print("success.")
                
                //do something
                UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
                
            }, onFailure: {error in
                print(error)
            })
            .disposed(by: disposeBag)
    }
}

Legacy

메시지 보내기의 Legacy Kakao SDK for iOS(이하 Legacy iOS SDK) 개발 가이드는 다음 링크에서 확인할 수 있습니다. 추후 Legacy iOS SDK에 대한 지원이 중단될 수 있으므로, 가급적 빠른 시일 내에 최신 버전 iOS SDK로 변경할 것을 권장합니다.

더보기