준진의 블로깅
Home
  • 분류 전체보기 (141)
    • NO TITLE (2)
    • 개발 (69)
    • 이모티콘 (5)
    • 개인사업자 & 세금 (14)
    • 부동산 & 인테리어 (8)
    • 여행 (7)
      • 제주도 (0)
      • 미국서부(2019) (4)
      • 스페인(2017) (1)
    • 맛집 (5)
      • 분당, 서현, 판교 (5)
    • 반려견 (10)
    • 프랑스어 (18)
Home
  • 분류 전체보기 (141)
    • NO TITLE (2)
    • 개발 (69)
    • 이모티콘 (5)
    • 개인사업자 & 세금 (14)
    • 부동산 & 인테리어 (8)
    • 여행 (7)
      • 제주도 (0)
      • 미국서부(2019) (4)
      • 스페인(2017) (1)
    • 맛집 (5)
      • 분당, 서현, 판교 (5)
    • 반려견 (10)
    • 프랑스어 (18)
블로그 내 검색

준진의 블로깅

맛집, 개인사업자 정보, 개발, 여행 등등 잡다구리

  • 개발

    [iOS/Swift] Universal link 적용하기

    2021. 4. 24.

    by. dundin

    반응형

    이 글은 iOS 13+ 인 경우 기준으로 작성되었습니다. 

    Universal link에 대한 자세한 설명은 공식 애플문서를 참고하세요  developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

    developer.apple.com/documentation/safariservices/supporting_associated_domains

     

    🥑 Universal link의 동작 원리 

    1. 앱이 설치되거나 업데이트 될 때, 미리 정의 해 놓은 web url에 접근한다. 

    2. https://mydomain.com/.well-known/apple-app-site-association 주소에 업로드 된 JSON 파일을 파싱해서 'component' 에 지정되어 있는 경로의 웹사이트 링크를 클릭 한 경우 웹페이지 대신 앱을 기동 하도록 기억해 놓는다. 

    3. 추후에 해당 url로 시작하는 링크를 클릭한 경우 사파리 대신 App을 바로 기동시킨다.  

     

    서버 작업 + 앱 작업 순서로 알아보자.

     

    📝 Server 에 AASA 추가하기 

    Universal link를 사용하기 위해서는 소유한 도메인이 있어야 한다.  해당 도메인의 AASA 파일을 업로드해야 하는데 몇가지 주의할 점이 있다. 

    ✔️redirection 이 없어야 하고

    ✔️https 여야 하고 

    ✔️JSON 확장자가 있으면 안된다. 

     

    여기에 AASA파일을 저장하는 주소와 포맷이 iOS 13 을 기준으로 조금 달라진다. 

     

    https://mydomain.com/.well-known/apple-app-site-association (iOS 13 이상)

    https://mydomain.com/apple-app-site-association (iOS 13 미만)

     

    AASA 파일 예시는 다음과 같다. 

    AppID 는 appIdPrefix (==team id) + bundle id이다. 

     

    만약 iOS 13 이상 이면 아래와 같이 하면 되고, 

    {
      applinks: {
        details: [
          {      	   
            appIDs: [
            	"1234ASDF.me.dundinstudio.remocle"
            ],
            components: [
                {
                    /: "*"
                }
            ]
          }
        ]
      }
    }

     

    iOS 12 점 대를 지원하고 있다면 apps, appId, paths 를 따로 적어줘야 한다. 

    {
      applinks: {
      	apps: [], // only before iOS 13 
        details: [
          {
          	appId: "1234ASDF.me.dundinstudio.remocle", // only before iOS 13 
            paths: [ "*" ], // only before iOS 13 			   
            appIDs: [
            	"1234ASDF.me.dundinstudio.remocle"
            ],
            components: [
                {
                    /: "*"
                }
            ]
          }
        ]
      }
    }

     

    server configuration에 대해서는 다음 글에 잘 나와있다. 

    gist.github.com/anhar/6d50c023f442fb2437e1

     

    Setting up iOS Universal Links

    Setting up iOS Universal Links. GitHub Gist: instantly share code, notes, and snippets.

    gist.github.com

    다른 앱들이 어떻게 쓰고 있는지 궁금하다면 몰래(?) 가서 염탐해도 된다. 

    kyte.travel/.well-known/apple-app-site-association

     

     

    🍎 iOS 앱에서 Capability 추가하기 

    App > Target > Signing and Capability 에서 Associated Domain을 추가한다. 

    + 버튼 누르고, applinks:{yourdomain} 추가. 요렇게 하면 해당 url 의 .well-known/apple-app-site-association 경로에 가서 aasa 포맷을 확인하라고 OS에게 알려준 것이 된다. 

     

     

    자이제 여기까지 했으면 Universal Link의 기본적인 틀은 갖춰진 것이다. 

    이제 메모장 앱에서 https://remocle.com/open 이런식으로 클릭하면 (앱이 설치되어 있다면) 앱이 열리게 되는 것이다. 

     

    여기서 주의 할 점 

    ✔️ AASA 는 앱이 설치될 때 & 업데이트 될 때 조회되기 때문에 AASA 파일을 수정한 경우 앱을 삭제 후 재설치 해야만 변경이 반영 된다. 

    ✔️링크 클릭을 테스트 할 때 시스템 기본 메모장 앱에서 테스트 하는 것이 제일 정확하다.  실제 테스트 해보니 한글 인코딩 관련 버그가 발견되어 .. Slack에서 테스트 하길 바랍니다. 

     

     

    🚙  iOS 앱에서 Universal link클릭해서 들어온 URL handle 하기 

    원래는 Univeral Link를 클릭하면 AppDelegate 의 openURL 를 통해서 앱이 기동이 되는데, Scene Delegate 을 사용할 경우 AppDelegate 의 openURL 함수가 불리지 않고 SceneDelegate 의 openURLContexts 함수만 불리니 주의. 

     // AppDelegate.swift 
     func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { 
       // TODO  
     }
    
    
    //SceneDelegate.swift 
     func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    	guard let url = URLContexts.first?.url else { return } 
        // TODO 
     }

    TODO 써있는 곳에서 알아서 navigate 를 하면 되는데, 나중에 AppRouter 구조도 한번 다뤄봐야지 . 

    Notification, Universal Link, Custom Scheme 모두 하나의 Router로 처리하면 편하다. 

     

     

    👀 Universal link가 동작 안하는 경우 

    ✔️웹브라우저에서 직접 url 입력시 실제로 그 주소로 이동하고자 하는 의사가 있다고 생각해서 universal link가 동작하지 않는다.

    ✔️iOS version이 10 미만인 경우 Universal Link가 동작하지 않는다. 

    ✔️AASA 를 변경 해도 바로 반영되지 않는다. Apple CDN 캐시가 있기때문 .. 지웠다 깔아도 바로 반영이 안된다면 조금 기다린 후 다시 확인하면 된다.

     

     



    참고


    공식문서: developer.apple.com/documentation/xcode/allowing_apps_and_websites_to_link_to_your_content/supporting_universal_links_in_your_app

    WWDC: developer.apple.com/videos/play/wwdc2020/10098/

    validation tool: search.developer.apple.com/appsearch-validation-tool

     

    반응형
    저작자표시 비영리 변경금지 (새창열림)

    '개발' 카테고리의 다른 글

    [SwiftUI] Keyboard avoidance 동작하지 않도록 하기  (0) 2021.05.17
    [Fastlane] 인증서 싱크 오류 해결 (nuke)  (0) 2021.05.08
    Fastlane 을 사용해서 Firebase Distribution 배포하기  (0) 2021.04.17
    [Firebase/Crashlytics] Bitcode 때문에 dSYM 업로드 안되는 이슈  (0) 2021.04.07
    [iOS/Swift] Multiselection 되는 Photo picker Library 선택하기  (0) 2021.04.07

    댓글

    관련글

    • [SwiftUI] Keyboard avoidance 동작하지 않도록 하기 2021.05.17
    • [Fastlane] 인증서 싱크 오류 해결 (nuke) 2021.05.08
    • Fastlane 을 사용해서 Firebase Distribution 배포하기 2021.04.17
    • [Firebase/Crashlytics] Bitcode 때문에 dSYM 업로드 안되는 이슈 2021.04.07
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
dundin

티스토리툴바