firebase의 dynamicLink가 2025년 8월 25일을 기점으로 종료가 된다고 합니다. 그래서 이번에 새로 개발하는 앱에는 OneLink를 적용을 해보았고, 시행착오를 공유하려 합니다.(이 글에서는 마케터 관점이나 appsflyer 설정보다 개발자 적인 관점에서 세팅해주는 방법에 대해서 적어보려 합니다.)
1. OneLink란?
OneLink란 간단하게 Appsflyer에서 제공하는 dynamicLink같이 설치나 딥링크 등의 기능을 해주는 링크를 말합니다.
2. 세팅방법
1. Certificaties, Identifiers & Profiles 설정
우선 apple developer 의 Certificaties, Identifiers & Profies에 접속해서 Identifiers에 항목에 들어가서 App의 App ID Prefix와 Bundle ID를 확인합니다. 그리고 Capabilities에 Associated Domains를 체크해주고 저장합니다.
2Xcode에서 설정
다음은 XCode 프로젝트를 클릭한 다음, TARGETS에 프로젝트를 선택합니다.
그다음 나오는 화면에서 Signing & Capabilities를 클릭 거기에 있는 Associated Domains에 Domains를 추가해 줍니다.
Associated Domains에 추가하는 Domain의 경우에는 appsflyer어 관리페이지 > 인게이지 > 원링크 관리에서 우측 상단 점 3개를 클릭하면 나오는 원링크 탬플릿 편집에 들어가 보면 있는 하위 도메인에 항목에서 확인 가능합니다.
3. URI 스킴 결정
URI 스팀은 사용자를 모바일 앱의 액티비티로 보내는 URL로 앱 사용자가 브라우저의 주소창에 URI 스킴을 입력하면 앱이 시작됩니다.
URI스킴은 유니크한것이 좋습니다
URI스킴을 추가하는 방법은 info.plist에 URL types에 URL Schemes에 추가하면 됩니다. (이미 다른 게 추가되어 있다면 같은 곳에 추가해도 됩니다.) 이때 ://이랑 것없이 순수하게 text만 있으면 됩니다. (://이런 값들이 있으면 나중에 store에 업로드할 때 error가 발생합니다.)
3. 통합 딥링킹 적용
사용자가 링크를 누렀을 떄 앱이 설치되어 있지 않다면, 스토어로 넘어가 설치를 하게 되지만, 앱이 설치되어 있다면 링크를 통하여 딥링킹 동작을 해야 합니다. 이 동작을 위한 방법을 알아보겠습니다.
https://ko.dev.appsflyer.com/hc/docs/dl_ios_unified_deep_linking
위 링크에 들어가서
위 이미지를 클릭하면 엄청 상세한 설명을 볼 수 있다. 중요한 부분은 아래 코드입니다.
extension AppDelegate: DeepLinkDelegate {
func didResolveDeepLink(_ result: DeepLinkResult) {
var fruitNameStr: String?
switch result.status {
case .notFound:
NSLog("[AFSDK] Deep link not found")
return
case .failure:
print("Error %@", result.error!)
return
case .found:
NSLog("[AFSDK] Deep link found")
}
guard let deepLinkObj:DeepLink = result.deepLink else {
NSLog("[AFSDK] Could not extract deep link object")
return
}
if deepLinkObj.clickEvent.keys.contains("deep_link_sub2") {
let ReferrerId:String = deepLinkObj.clickEvent["deep_link_sub2"] as! String
NSLog("[AFSDK] AppsFlyer: Referrer ID: \(ReferrerId)")
} else {
NSLog("[AFSDK] Could not extract referrerId")
}
let deepLinkStr:String = deepLinkObj.toString()
NSLog("[AFSDK] DeepLink data is: \(deepLinkStr)")
if( deepLinkObj.isDeferred == true) {
NSLog("[AFSDK] This is a deferred deep link")
}
else {
NSLog("[AFSDK] This is a direct deep link")
}
fruitNameStr = deepLinkObj.deeplinkValue
walkToSceneWithParams(fruitName: fruitNameStr!, deepLinkData: deepLinkObj.clickEvent)
}
}
위 코드는 사용자랑 OneLink를 눌러 앱이 동작했을 때 동작하는 코드로 이곳에서 OneLink를 파싱 하여 원하는 동작을 수행할 수 있도록 하면 됩니다.
4. 테스트
다른 것보다 테스트에서 많은 삽질을 했었습니다.
OneLink를 만들어 아무리 클릭해도 동작을 하지 않는 현상이 있었습니다. 그에 대한 회고를 해보면
1. 앱을 이미 실행시켜놓은 상태에서 OneLink를 클릭할 경우
이 경우에는 AppDelegate가 아니라 SceneDelegate에 AppsFlyer가 세팅되어 있어야 동작을 합니다.
2. 테스트 기기 등록
테스트하기 위해서 테스트 기기를 등록해 두어야 테스트가 동작합니다.
3. 링크 테스트
링크 테스트는 링크를 직접 브라우저에 입력하거나 iOS 메모앱에 붙여 넣는 등의 동작으로 할 경우 모바일에서 앱이 열리지 않고 계속 store로 이동되는 현상이 있습니다. 특히 Safari로 테스트할 경우 더 그런데, 모바일 기기에 chrome을 설치하고 메일로 보내서 테스트를 할 경우 앱이 실행되는 것을 확인할 수 있습니다.
사실 테스트의 경우 결과만 보면 별거 없지만, 이 결과를 내기까지 이런저런 검색과 테스트를 해야 하는 많은 시간이 걸려서 이 글을 보시는 분은 시간을 단축하셨으면 좋겠습니다.
'2023년 부터 > iOS&Swift' 카테고리의 다른 글
[iOS&Swift]Firebase에서 FCM 토픽 메시징으로 사용자 관심사별 알림 전송하기 (0) | 2024.03.26 |
---|---|
[iOS] ScrenDelegate 와 Appdelegate에서 navigationViewcontroller 호출하기 (0) | 2024.02.08 |
[iOS/Swift]Decoding Error(The data couldn’t be read because it is missing) (0) | 2024.01.15 |
[iOS] 공백만 입력되었는지 체크하는 로직 (0) | 2024.01.12 |
[iOS] Android System.currentTimeMillis 사용하기 (1) | 2023.11.25 |