티스토리 뷰
"" Firebase 동적 링크는 앱 설치 여부에 관계없이 여러 플랫폼에서 원하는 대로 작동하는 링크입니다. ""
앱이 설치되어 있다면 앱이 실행이 되고, 앱이 설치되어 있지 않았다면 앱스토어나 특정 URL로 가는 액션을 할 수 있다.
하지만 우리가 하고싶어 하는 것은 단순히 앱을 켜는것 그 이상의 액션들이다.
[공식 문서]
https://firebase.google.com/docs/dynamic-links?hl=ko
링크 생성하기
링크 생성에는 크게 두가지 방법이 있다.
1. 파이어베이스 콘솔에서 생성하기
* Firebase 콘솔에서 링크를 생성하는건 대부분 특정 유저에게 보내거나 유동적인 데이터가 아니라 이벤트, 공지사항 같은 전체에게 보내거나 인스타그램, 페이스북 같은 곳에 광고용 링크를 만들기 위해 주로 사용된다.
2. iOS 앱에서 생성하기
* iOS 앱에서 링크를 생성하는 이유는 추천인 보상을 위해 링크 공유 시 사용자 고유 값을 함께 지정해서 보내기 위함이거나, 네이버 지도와 같이 특정 위치에 대한 정보를 공유하거나, 쇼핑몰에서 특정 상품 정보를 공유하는 등 사용자가 다른 사람에게 정보를 공유하기 위해 주로 사용된다.
func createDynamicLink() {
let link = URL(string: "https://리다이렉트URL/?category=food&productId=10")
let referralLink = DynamicLinkComponents(link: link!, domainURIPrefix: "URL 프리픽스")
// iOS 설정
referralLink?.iOSParameters = DynamicLinkIOSParameters(bundleID: "앱 번들 ID")
referralLink?.iOSParameters?.minimumAppVersion = "1.0.0"
referralLink?.iOSParameters?.appStoreID = "1111111111"
referralLink?.iOSParameters?.customScheme = "커스텀 스키마가 설정되어 있을 경우 추가"
// Android 설정
referralLink?.androidParameters = DynamicLinkAndroidParameters(packageName: "안드로이드 패키지 네임")
referralLink?.androidParameters?.minimumVersion = 1
// 단축 URL 생성
referralLink?.shorten { (shortURL, warnings, error) in
if let error = error {
print(error.localizedDescription)
return
}
print(shortURL)
self.sendSMS(dynamicLink: shortURL)
}
}
Dynamic Link에서 데이터 받아오기
생성된 링크를 클릭 했을 때 앱에서 데이터를 받아오는 액션이다!!
Associated Domains에 원하는 도메인 추가하기
일단 XCode의 Signing & Capablities 탭에서
Associated Domains 필드를 채워줘야 한다. https://는 빼고 도메인만 적어주면 된다.
<key>FirebaseDynamicLinksCustomDomains</key>
<array>
<string>URL 프리픽스</string>
</array>
파이어베이스 동적 링크 페이지에서 URL prefix 눌러서 볼 수 있다.
"""만약에 사용하는 URL 프리픽스가 test.domain.com인데 리다이렉트 할 URL은 www.domain.com을 사용하는 중이라면 Associated Domains에 www.domain.com도 추가를 해주어야 데이터를 받을 수 있습니다. """
이런식으로 해주면 된다.
[출처] https://swieeft.github.io/2020/09/02/DynamicLinkGetQueryData.html
Info.plist에 커스텀 도메인 추가하기
Info.plist의 FirebaseDynamicLinksCustomDomains에 url 배열을 추가해준다.
AppDelegate에 콜백 메서드 만들기
@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
return application(app, open: url,
sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
annotation: "")
}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
// Handle the deep link. For example, show the deep-linked content or
// apply a promotional offer to the user's account.
// ...
return true
}
return false
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard let weburl = URL(string: userActivity.webpageURL?.absoluteString.removingPercentEncoding ?? "") else {
return false
}
let handled = DynamicLinks.dynamicLinks().handleUniversalLink(weburl) { dynamicLink, error in
print("dynamicLink : \(dynamicLink?.url?.absoluteString ?? "")")
if dynamicLink != nil, !(error != nil) {
self.handleDynamicLink(dynamicLink)
}
}
return handled
}
Link에서 데이터 받기
콜백 메서드로 들어온 DynamicLink에서 데이터를 빼내는 메서드를 만들어준다.
@discardableResult
func handleDynamicLink(_ dynamicLink: DynamicLink?) -> Bool {
guard let dynamicLink = dynamicLink, let deepLink = dynamicLink.url else {
return false
}
let queryItems = URLComponents(url: deepLink, resolvingAgainstBaseURL: true)?.queryItems
let category = queryItems?.filter({$0.name == "category"}).first?.value
let productId = queryItems?.filter({$0.name == "productId"}).first?.value
print("category : \(category ?? "")")
print("productId : \(productId ?? "")")
return true
}
카카오톡 미리보기에서 잘 보이게 만들기
linkBuilder.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters()
linkBuilder.socialMetaTagParameters?.title = "Example of a Dynamic Link"
linkBuilder.socialMetaTagParameters?.descriptionText = "This link works whether the app is installed or not!"
// linkBuilder.socialMetaTagParameters?.imageURL = "https://www.example.com/my-image.jpg"
이거 해줘야 프리뷰에서도 잘 뜬다!
'macOS, iOS' 카테고리의 다른 글
[SwiftUI] UserDefaults -> AppStorage (0) | 2021.04.28 |
---|---|
[iOS] Codable URL이 "" 일 때 dataCorrupted 안나게 하기 (0) | 2021.04.28 |
[Swift] 함수 이름 프린트 하는법 (0) | 2021.04.24 |
[SwiftUI] Loading Indicator 만들기 (0) | 2021.04.24 |
[SwiftUI] TabViewStyle (0) | 2021.04.19 |