Universal Link?
iOS9에서는 Universal Link 라는 기능이 추가 되었습니다.
이 기능을 쉽게 설명하자면,
일반적인 링크를 유저가 선택 시 해당 웹페이지로 이동하는 것이 아닌 해당 웹페이지에서 제공하는 앱을 띄워주는 기능입니다.
기존에는 앱의 고유 scheme을 정의해서 띄우는 방식이었는데 여기서 조금 더 발전된 기능이죠.
Medium이라는 앱을 주로 사용하시는 분들은 이미 이 기능을 보셨을 수도 있겠네요.
짧지만 데모 영상 보고 가실게요~
영상 최초 화면은 iOS 기본 메모장으로 테스트를 위해서 형식을 달리한 제 홈페이지 주소를 저장해뒀습니다.
그 주소 중 하나를 선택하면 일반적으로는 safari가 열리며 홈페이지가 열리지만 제가 임의로 만든 앱으로 이동하는 것을 볼 수 있습니다.
이것이 Universal Link 입니다. 간단하죠?
Universal Link 구현 방법
당연하겠지만 애플 문서에서 잘 설명하고 있습니다. 그 외에도 검색을 해보면 여러 글들이 보입니다.
웹서버에 apple-app-site-association 파일 업로드
앱과 연관된 웹 서버의 루트(ubuntu 서버에서는 기본적으로 /var/www/html)에 정의 된 apple-app-site-association 파일을 업로드 합니다.이 파일은 JSON 형태로 아래와 같은 형태를 가집니다. JSON 내용 중 appID는 애플 개발자 계정의 Account Info 내용 중 Team ID 값과 앱의 identifier입니다.
그리고 paths는 app으로 열어 처리할 URL path입니다. path 전체(““) 혹은 루트(“/”)로 정의했습니다. 전체(“)에 루트(“/”)가 포함되진 않더군요. 루트를 뺀 상태로 정의되어 있으면 Base URL만 있는 링크를 선택했을 때 safari가 오픈됩니다. paths에는 NOT으로 지정된 path는 앱을 열지 않도록 정의도 가능합니다. 자세한 내용은 위 “애플 문서”링크 참조하세요.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"applinks": {"apps": [], "details": [{ "appID": "[Team ID].com.y8k.UniversalLink", "paths":["*", "/"]}]}} |
Xcode 프로젝트 세팅
Xcode로 돌아가 Capabilities에 있는 Associated Domains 기능을 활성화 합니다. 하단의 + 버튼을 눌러 univeral link를 적용할 URL을 아래처럼 입력합니다.
이 정의가 완료되면 프로젝트 내에 entitlements 파일이 하나 생성됩니다. 방금 입력한 내용이 entitlements에 plist형태로 저장된 것을 볼 수 있습니다.
Provisioning File 갱신
꼭! provisioning file 갱신을 하셔야 합니다. 저는 이 스텝을 빼먹고 왜 제대로 작동이 안되는지 의아해하며 애꿎은 서버 설정만 고치고 있었네요.
Xcode를 통해 provisioning을 관리하시는 분은 제가 이전에 작성한 “xcode7에서 자동으로 관리되는 Provisioning Profile 갱신하는 먼지팁” 글 참고하시면 됩니다만 저는 결국 직접 provisioning 생성해서 적용했습니다… 될 때는 잘 되다가 안될 때는 정말 안됩니다… 에효..
AppDelegate에 메소드 정의
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool { | |
guard let rootViewCntrlr = self.window?.rootViewController else { | |
return false; | |
} | |
guard let viewCntrlr = rootViewCntrlr as? ViewController else { | |
return false; | |
} | |
viewCntrlr.URLLabel.text = userActivity.webpageURL?.absoluteString; | |
return true | |
} |
마지막으로 Universal Link를 통해 앱이 실행되었을 때 앱 내 처리를 위한 continuUserActivity 메소드입니다. 데모를 위해서 단순하게 ViewController에 정의한 UILabel에 webpageURL이 나타나도록 했습니다.
Universal Link 동작
첨부한 영상처럼 Universal Link가 잘 적용되었다면 링크를 선택 시 safari가 아닌 앱이 실행이 되며, 아래와 같은 status bar를 볼 수 있습니다. 오른쪽 상단에 낯선 컴퍼넌트가 나타나는데 이는 현재 URL을 safari로 띄우는 기능입니다.
이를 선택해보면,
사파리로 현재 URL이 나타나는데 상단에 Smart Banner와 유사한 컴퍼넌트가 보이게 되며 다시 앱으로 실행하도록 해줍니다.
앱에서 status bar 오른쪽을 선택해 웹으로 열린 상태에서 Universal Link가 정의된 또 다른 링크를 누르면 앱으로 이동하지 않고 웹으로 열립니다. 이는 버그로 여길 수 있겠지만 웹으로 열었는지 앱으로 열었는지를 기억하고 있다는 것을 의미합니다. 물론 safari 상단에서 “열기”를 누르면 앱으로 해당 URL이 정의된 화면으로 이동하며 다음부터는 앱으로 URL이 열립니다.
Universal Link 적용 후기
#1 적용 과정은 쉽습니다. 신규 프로젝트에 적용하거나 이미 URI Scheme이 정의되어 있다면 좀 수월하겠지만 그 외의 기존 앱에 이를 적용하기 위해서는 continuUserActivity에서 복잡한 handling을 해야하거나 일부 View Controller 구조를 변경하는 것을 피하기 힘들 수 있겠네요. 생각만해도 머리가 지끈지끈…
#2 그리고 위에서 설명한대로 설정을 마쳤음에도 동작이 되지 않을 경우에는 가장 먼저 체크해야 할 부분이 웹서버에 apple-app-site-association 파일이 잘 등록되었는지 확인을 하는 것입니다. 직접 주소창에 해당 파일 주소(https://(domain)/apple-app-site-association)를 입력해서 JSON 파일 형태가 보이면 그 문제는 아니니까 넘어가세요. 다음으로 확인할 것은 애플 포털을 열고 App IDs에서 Associated Domain이 활성화 되어 있는지이며 Xcode 프로젝트에 entitlement 파일이 있는지와 내용에 오타가 없는지입니다.
#3 개인 블로그 앱을 만들고 싶다는 욕심이 생기지만 등록이 안될테고.. 네이티브 클라이언트를 가진 여러 커뮤니티나 서비스들에 적용이 되면 아이폰 유저들이 편리하게 컨텐트를 소비하거나 물건 구매를 유도할 수 있겠죠? 적용하세요~ 두 번 하세요~
집중이 너무 안되서 두서없는 글을 쓴 점 양해부탁드리며..
끝.