chaneeii / iOS-Study-Log

✨ iOS에 대해 공부한 것들을 기록합니다 ✨
19 stars 0 forks source link

Dynamic Link 만들기 (feat. firebase) #39

Open chaneeii opened 2 years ago

chaneeii commented 2 years ago

https://firebase.google.com/docs/dynamic-links/create-manually

ius : 커스텀 url scheme

Getting Started with Dynamic Links on iOS - Pt.3: Creating links programmatically (Firecasts) https://www.youtube.com/watch?v=LqCi-TaUfJs https://mrparkcodingschool.tistory.com/19

  1. Configuration steps (1번비디오)
  2. Create a link (1번비디오)
  3. Interpret link in code (read&parse)

0. 기본개념

Universal Links

파베가 일종의 universal link 를 제공하는 셈으로 쪼꼬만 웹사이트를 하나주는 꼴로 다이나믹 링크가 사용되는 것이다. 스크린샷 2022-09-13 오후 5 06 25

Custom URL Schemes

스크린샷 2022-09-13 오후 5 07 05

앱 번들아이디로 url 스킴준다 기본으로 스크린샷 2022-09-13 오후 5 07 11

1. Configuration steps

프로젝트를 생성하고 Team ID 와 App ID 를 넣어준다

스크린샷 2022-09-14 오전 1 02 14

동적링크를 생성한다.

스크린샷 2022-09-13 오후 5 21 35

요렇게 쪼꼬미 웹사이트가 만들어짐

스크린샷 2022-09-13 오후 5 22 30

요거 추가해주기

스크린샷 2022-09-13 오후 5 23 58

요러면 유니버셜 링크 등록이 완료된다

스크린샷 2022-09-13 오후 5 25 03

얘도 등록해준다

스크린샷 2022-09-13 오후 5 26 11

그럼 설정완료!

그리고 Firebase 를 프로젝트에 설치해주자

https://github.com/Team-Trit/donworry-ios/issues/168

소스를 추가해보자

AppDelegate.swift에

import FirebaseDynamicLinks

    // DynamicLink 수신
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in
            if let urlString = dynamiclink?.url?.absoluteString {
                print(urlString)
            }
        }
        return handled
    }

    // 앱이 Running 상태가 아닐 때 수신
    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
    }

그러고 링크를 클릭하면 앱으로 잘 들어가진다. 꾹누르면 요렇게 우리앱에서 열지도 확인가능!

스크린샷 2022-09-14 오전 12 58 08

2. Create a link

이번엔 새 동적링크를 눌러서 커스텀 URL 을 만들어보자

스크린샷 2022-09-14 오전 1 04 15

만들기 시작!

스크린샷 2022-09-14 오전 1 05 11

다음으로 딥 링크 URL을 입력하는데 여기에 매개변수를 만들어 값을 앱에 전달할 수 있다. 실제 존재하는 도메인이 아니여도 좋지만 도메인이 있어서 슬쩍 사용해봤다

스크린샷 2022-09-14 오전 1 17 36

다음은 앱을 선택해준다

스크린샷 2022-09-14 오전 1 19 26

안드로이드 앱은 없으니깐 위에서 정의한 url 로 들어가게 해줌

스크린샷 2022-09-14 오전 1 20 29

링크 미리보기 등에 사용된다! 따라서 요기에 앱 마케팅하기에 좋으니깐 무조건 커스텀 하는게 좋다고 한다! (구글이그럼)

스크린샷 2022-09-14 오전 1 24 00

그럼 링크가 만들어집니다

스크린샷 2022-09-14 오전 1 24 35

그러고 세부정보를 먼저 봅시다 (디버그 너무좋음!)

스크린샷 2022-09-14 오전 1 25 24

그럼 full dynamic link 가 나옵니다

스크린샷 2022-09-14 오전 1 25 50

그럼 이제 https://donworry.page.link/space 를 눌러도 앱으로 잘 이동을 하게 됩니다.

3. Interpret link in code

link가 들어오면 DynamicLinksLibary 에서 convert 한다 스크린샷 2022-09-14 오전 1 29 30 스크린샷 2022-09-14 오전 1 29 38 스크린샷 2022-09-14 오전 1 30 18 여기서 오리지널 딥링크 파라미터를 찍을 수 있다.

우선 firebase 를 configure 해주자

App Delegate 에서

import Firebase
import FirebaseDynamicLinks

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Firebase Configuration
        FirebaseApp.configure()

        return true
    }

SceneDelegate.swift

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        // 앱이 Running 상태가 아닐 때 수신
        if let userActivity = connectionOptions.userActivities.first {
            self.scene(scene, continue: userActivity)
        }
    }

    // DynamicLink 처리
    func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
        guard let url = dynamicLink.url else {
            print("이 Dynamic Link Object 는 URL 을 가지고 있지 않습니다")
            return
        }
        print("🐥🐥🐥🐥🐥 Dynamic Link Parameter : \(url.absoluteString) 🐥🐥🐥🐥🐥")

        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
                let queryItems = components.queryItems else { return }
        for queryItem in queryItems {
            print("🥚Parameter🥚 \(queryItem.name) : \(queryItem.value ?? "")")
        }
        dynamicLink.matchType
    }

    // DynamicLink 수신
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        if let incomingURL = userActivity.webpageURL {
            DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL)
            { (dynamiclink, error) in
                guard error == nil else {
                    print("🚨 ERROR: \(error!.localizedDescription)")
                    return
                }
                if let dynamiclink = dynamiclink {
                    self.handleIncomingDynamicLink(dynamiclink)
                }
            }
        }
    }

코드로 다이나믹 링크 설정하는법

위에서 파이어베이스 콘솔에서 직접 다이나믹링크를 설정했던 것을 코드에서도 설정할 수 있다.

    // MARK: ShareSheet
    func showShareSheet(url: URL) {
        let promoText = "돈워리에서 정산할래요?" // 🔀 TEXT 변경필요
        let activityVC = UIActivityViewController(activityItems: [promoText, url], applicationActivities: nil)
        present(activityVC, animated: true)
    }

    // MARK: 공유하기
    @objc
    private func shareSpace() {

        // 1. URL Link 생성하기
        let spaceID = reactor?.currentState.space.shareID
        var components = URLComponents()
        components.scheme = "https"
        components.host = "www.don-worry.com"
        components.path =  "/space"

        let spaceShareQueryItem = URLQueryItem(name: "id", value: spaceID)
        components.queryItems = [spaceShareQueryItem]

        guard let linkParmater = components.url else { return }

        // 2. Full DynamicLink 생성하기
        guard let shareLink = DynamicLinkComponents.init(link: linkParmater, domainURIPrefix: "https://donworry.page.link") else {
            print("Full Dynamic Link Components 를 생성할 수 없습니다.")
            return
        }

        // iOS 관련설정
        // - App Bundle ID 설정
        if let myBundleId = Bundle.main.bundleIdentifier {
            shareLink.iOSParameters = DynamicLinkIOSParameters(bundleID: myBundleId)
        }
        // - App Store ID
        shareLink.iOSParameters?.appStoreID = "1643097323"
        // - 공유 개선을 위한 소셜 메타 태그
        let spaceTitle = reactor?.currentState.space.title
        shareLink.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters()
        shareLink.socialMetaTagParameters?.title = "돈.워리에서 정산해요" // 🔀 변경필요
        shareLink.socialMetaTagParameters?.descriptionText = "💸\(spaceTitle!)에 참가해서 정산을 완료해보세요 " // 🔀 변경필요
        shareLink.socialMetaTagParameters?.imageURL = URL(string: "https://user-images.githubusercontent.com/63157395/190110193-0d6f49b9-b163-4fe4-845f-d650dd088d9f.png") // 🔀 변경필요
//        guard let fullDynamicLink = shareLink.url else { return }

        // 3. 공유용 URL로 줄이기
        shareLink.shorten { [weak self] (url, warnings, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            if let warnings = warnings {
                for warning in warnings {
                    print(warning)
                }
            }
            guard let url = url else { return }
            self?.showShareSheet(url: url)
        }
    }