티스토리 뷰

카카오톡 공유하기 기능을 구현하면서 배운 것들을 정리하였습니다.

우선 카카오톡 공유하기 API를 사용하기 위해서는 사전에 여러 설정이 필요합니다.

 

1) Kakao SDK 설치

프로젝트의 Podfile에 Kakao SDK를 전체 또는 모듈(Module) 별로 추가합니다. 저는 필요한 모듈만 추가하였습니다.

# 전체 추가
pod 'KakaoSDK'

# 필요한 모듈만 추가
pod 'KakaoSDKShare'  
pod 'KakaoSDKTemplate'

 

 

 

2) Kakao Developer 로그인 후, 애플리케이션 추가

Kakao Developer 로그인 > 내 어플리케이션 > 애플리케이션 추가를 진행합니다.

3) iOS 플랫폼 등록

플랫폼 > 플랫폼 설정하기 버튼 > iOS 플랫폼 등록

저는 간단하게 테스트만 진행할 것이기 때문에 번들 ID만 등록하였습니다.

이미 앱스토어에 등록되어있는 앱이라면 ID까지 적어주세요!

 

4) 앱 키 확인 후, Xcode 진입

네이티브 앱 키를 설정해줘야하기 때문에 이 값을 복사해 주고 Xcode로 돌아옵니다.

 

5) 앱 실행 허용 목록 설정

Xcode 프로젝트 파일 > Info > Custom iOS Target Properties에 Array 타입 키(Key)인 LSApplicationQueriesSchemes를 추가하고, 해당 키의 Item으로 커스텀 URL 스킴에 사용할 값인 "kakaokompassauth", "kakaolink"를 추가합니다.

 

6) URL Schemes 설정

카카오계정을 통한 인증과 카카오톡 메시지를 통한 앱 실행을 위해 URL Schemes 설정을 합니다.

Info > URL Types > URL Schemes 항목에 네이티브 앱 키(Native App Key)를  형식으로 등록합니다. 예를 들어 네이티브 앱 키가 "123456789"라면 [URL Schemes]에 "kakao123456789"를 입력합니다.

7) 초기화

import KakaoSDKCommon 을 해주고, 네이티브 앱 키를 사용해 iOS SDK를 초기화하는 과정이 필요합니다. AppDelegate.swift에 Kakao SDK를 초기화하는 코드를 추가합니다. 

 

여기까지가 기본 세팅입니다... 기본 세팅이 더 빡세네요

저는 카카오톡 공유하기 기능을 따로 템플릿을 만들지 않고 코드로 커스텀하는 방식으로 구현하였습니다.

@objc func kakao() {
    // 웹 링크입니다. 카카오톡 인앱 브라우저에서 열립니다.
    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 webButton = Button(title: "웹으로 보기", link: link)
    let appButton = Button(title: "앱으로 보기", link: appLink)
    
    // 메인이 되는 사진, 이미지 URL, 클릭 시 이동하는 링크를 설정합니다.
    let content = Content(title: "딸기 치즈 케익",
                          imageUrl: URL(string: "https://mud-kage.kakao.com/dn/Q2iNx/btqgeRgV54P/VLdBs9cvyn8BJXB3o7N8UK/kakaolink40_original.png")!,
                          link: link)
        
    let template = FeedTemplate(content: content, buttons: [webButton, appButton])
        
    // 메시지 템플릿 encode
    if let templateJsonData = (try? SdkJSONEncoder.custom.encode(template)) {
        // 생성한 메시지 템플릿 객체를 jsonObject로 변환
        if let templateJsonObject = SdkUtils.toJsonObject(templateJsonData) {
            // 카카오톡 앱이 있는지 체크합니다.
            if ShareApi.isKakaoTalkSharingAvailable() {
                ShareApi.shared.shareDefault(templateObject:templateJsonObject) {(linkResult, error) in
                    if let error = error {
                        print("error : \(error)")
                    }
                    else {
                        print("defaultLink(templateObject:templateJsonObject) success.")
                        guard let linkResult = linkResult else { return }
                        UIApplication.shared.open(linkResult.url, options: [:], completionHandler: nil)
                    }
                }
            } else {
            	// 없을 경우 카카오톡 앱스토어로 이동합니다. (이거 하려면 URL Scheme에 itms-apps 추가 해야함)
                let url = "itms-apps://itunes.apple.com/app/362057947"
                if let url = URL(string: url), UIApplication.shared.canOpenURL(url) {
                    if #available(iOS 10.0, *) {
                        UIApplication.shared.open(url, options: [:], completionHandler: nil)
                    } else {
                        UIApplication.shared.openURL(url)
                    }
                }
            }
        }
    }
}

다음 코드를 통해 카카오톡 공유하기를 사용할 수 있습니다. 이 코드를 실행하면 다음과 같이 전송됩니다.

 

그런데 아직 남은 것이 있습니다.

바로 앱으로 보기를 클릭했을 때, 앱의 특정 부분으로 이동하거나 어떤 작업을 진행하고 싶을 수 있습니다. 

 

iOS 앱에서 URL Scheme을 이용해 앱으로 진입할 때, 실행되는 메서드의 순서는 다음과 같습니다.

 

if) AppDelegate만 사용하는 경우

 

1. 앱이 실행되고, 'UIApplicationDelegate' 프로토콜을 구현한 객체의 'application(_:didFinishLaunchingWithOptions:)' 메서드가 호출됩니다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    return true
}
  • 이 메서드에서는 앱이 처음 실행될 때 필요한 초기화 작업을 수행합니다.

2. 만약 앱이 이미 실행 중이었다면, 'UIApplicationDelegate' 프로토콜을 구현한 객체의 'application(_:open:options:)' 메서드가 호출됩니다.

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
	if let components = URLComponents(url: url, resolvingAgainstBaseURL: false) {
        var queryItems = components.queryItems ?? []
        for queryItem in queryItems {
            if queryItem.name == "key1", let value = queryItem.value {
                print(value)
            } else if queryItem.name == "key2", let value = queryItem.value {
                print(value)
            }
        }
    }
    return true
}
    • 이 메서드에서는 URL Scheme에 대한 처리 작업을 수행합니다.
    • 이때, URL Scheme에 전달된 매개변수를 이용하여 적절한 화면으로 이동하는 작업 등을 수행할 수 있습니다.
    • URL을 URLComponents로 변환 후, queryItem 프로퍼티로 파라미터에 접근 가능합니다.
    • 오는 URL 값 : kakao${네이티브 앱 키}://kakaolink?key1=value1&key2=value2

 

3. URL Scheme을 이용해 앱을 진입한 경우, 앱이 실행된 후 'UIApplicationDelegate' 프로토콜을 구현한 객체의 'applicationDidBecomeActive(_:)' 메서드가 호출됩니다.

func applicationDidBecomeActive(_ application: UIApplication)
  • 이 메서드에서는 앱이 Active 상태가 되었을 때 수행해야 할 작업을 수행합니다.

 

 

if) SceneDelegate가 있는 경우

앱으로 진입 시, application(_:open:options:) 메서드가 호출되지 않고 scene(_ scene:openURLContexts) 메서드를 사용합니다.

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else { return }
    if let components = URLComponents(url: url, resolvingAgainstBaseURL: false) {
        var queryItems = components.queryItems ?? []
        for queryItem in queryItems {
            if queryItem.name == "key1", let value = queryItem.value {
                print(value)
            } else if queryItem.name == "key2", let value = queryItem.value {
                print(value)
            }
        }
    }
}
  • 이 메서드에서 대신 URL Scheme에 대한 처리 작업을 수행합니다.
  • URL을 URLComponents로 변환 후, queryItem 프로퍼티로 파라미터에 접근 가능합니다.

 

마지막으로 웹으로 보기 클릭 시, 지정한 URL로 가게 하기 위해선 Web 플랫폼을 설정해야 합니다.

아까 iOS 플랫폼 등록했던 곳으로 가서 Web 플랫폼에 지정한 URL을 등록하시면 됩니다.

 

참고

https://developers.kakao.com/docs/latest/ko/getting-started/sdk-ios#set-up-plist

https://developers.kakao.com/docs/latest/ko/message/ios-link

https://velog.io/@rbw/iOS-%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1-%EA%B3%B5%EC%9C%A0%ED%95%98%EA%B8%B0-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함