Universal Link (iOS9) 적용하기

iOS9에서는 Universal Link 라는 기능이 추가 되었습니다.

이 기능을 쉽게 설명하자면,
일반적인 링크를 유저가 선택 시 해당 웹페이지로 이동하는 것이 아닌 해당 웹페이지에서 제공하는 앱을 띄워주는 기능입니다.
기존에는 앱의 고유 scheme을 정의해서 띄우는 방식이었는데 여기서 조금 더 발전된 기능이죠.

Medium이라는 앱을 주로 사용하시는 분들은 이미 이 기능을 보셨을 수도 있겠네요.
짧지만 데모 영상 보고 가실게요~

영상 최초 화면은 iOS 기본 메모장으로 테스트를 위해서 형식을 달리한 제 홈페이지 주소를 저장해뒀습니다.
그 주소 중 하나를 선택하면 일반적으로는 safari가 열리며 홈페이지가 열리지만 제가 임의로 만든 앱으로 이동하는 것을 볼 수 있습니다.

이것이 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는 앱을 열지 않도록 정의도 가능합니다. 자세한 내용은 위 “애플 문서”링크 참조하세요.


{"applinks": {"apps": [], "details": [{ "appID": "[Team ID].com.y8k.UniversalLink", "paths":["*", "/"]}]}}

view raw

gistfile1.txt

hosted with ❤ by GitHub

Xcode 프로젝트 세팅

Xcode로 돌아가 Capabilities에 있는 Associated Domains 기능을 활성화 합니다. 하단의 + 버튼을 눌러 univeral link를 적용할 URL을 아래처럼 입력합니다.

capabilities

이 정의가 완료되면 프로젝트 내에 entitlements 파일이 하나 생성됩니다. 방금 입력한 내용이 entitlements에 plist형태로 저장된 것을 볼 수 있습니다.

스크린샷 2015-12-18 오후 2.27.28

Provisioning File 갱신

꼭! provisioning file 갱신을 하셔야 합니다. 저는 이 스텝을 빼먹고 왜 제대로 작동이 안되는지 의아해하며 애꿎은 서버 설정만 고치고 있었네요.
Xcode를 통해 provisioning을 관리하시는 분은 제가 이전에 작성한 “xcode7에서 자동으로 관리되는 Provisioning Profile 갱신하는 먼지팁” 글 참고하시면 됩니다만 저는 결국 직접 provisioning 생성해서 적용했습니다… 될 때는 잘 되다가 안될 때는 정말 안됩니다… 에효..

AppDelegate에 메소드 정의


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
}

view raw

gistfile1.txt

hosted with ❤ by GitHub

마지막으로 Universal Link를 통해 앱이 실행되었을 때 앱 내 처리를 위한 continuUserActivity 메소드입니다. 데모를 위해서 단순하게 ViewController에 정의한 UILabel에 webpageURL이 나타나도록 했습니다.

첨부한 영상처럼 Universal Link가 잘 적용되었다면 링크를 선택 시 safari가 아닌 앱이 실행이 되며, 아래와 같은 status bar를 볼 수 있습니다. 오른쪽 상단에 낯선 컴퍼넌트가 나타나는데 이는 현재 URL을 safari로 띄우는 기능입니다.

IMG_0413

이를 선택해보면,

IMG_0414

사파리로 현재 URL이 나타나는데 상단에 Smart Banner와 유사한 컴퍼넌트가 보이게 되며 다시 앱으로 실행하도록 해줍니다.

앱에서 status bar 오른쪽을 선택해 웹으로 열린 상태에서 Universal Link가 정의된 또 다른 링크를 누르면 앱으로 이동하지 않고 웹으로 열립니다. 이는 버그로 여길 수 있겠지만 웹으로 열었는지 앱으로 열었는지를 기억하고 있다는 것을 의미합니다. 물론 safari 상단에서 “열기”를 누르면 앱으로 해당 URL이 정의된 화면으로 이동하며 다음부터는 앱으로 URL이 열립니다.

#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 파일이 있는지와 내용에 오타가 없는지입니다.

스크린샷 2015-12-18 오후 3.10.05

#3 개인 블로그 앱을 만들고 싶다는 욕심이 생기지만 등록이 안될테고.. 네이티브 클라이언트를 가진 여러 커뮤니티나 서비스들에 적용이 되면 아이폰 유저들이 편리하게 컨텐트를 소비하거나 물건 구매를 유도할 수 있겠죠? 적용하세요~ 두 번 하세요~

집중이 너무 안되서 두서없는 글을 쓴 점 양해부탁드리며..

끝.

19 Shares:
답글 남기기

이메일 주소는 공개되지 않습니다.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

You May Also Like