Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
chaneeii opened this issue Sep 13, 2022 · 0 comments
Open

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

chaneeii opened this issue Sep 13, 2022 · 0 comments
Labels
iOS iOS 관련내용을 정리합니다 Third-Party Libraries Third-Party Libraries

Comments

@chaneeii
Copy link
Owner

chaneeii commented Sep 13, 2022

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 를 프로젝트에 설치해주자

Team-Trit/donworry-ios#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)
        }
    }
    
@chaneeii chaneeii added iOS iOS 관련내용을 정리합니다 in-progress 작업중인내용 Third-Party Libraries Third-Party Libraries and removed in-progress 작업중인내용 labels Sep 13, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
iOS iOS 관련내용을 정리합니다 Third-Party Libraries Third-Party Libraries
Projects
None yet
Development

No branches or pull requests

1 participant