티스토리 뷰
iOS: 유니버셜 링크 적용하기 에서 계속...
발생일: 2016.06.15
키워드: 유니버셜 링크, universal link, smart banner, 스마트 배너, apple-app-site-association, nginx
문제:
유니버셜 링크에 대한 처리를 위해 apple-app-site-association 파일을 웹서버에 추가하려고 한다.
해결책:
유니버셜 링크를 허용할 웹사이트에서, 유니버셜 링크로 처리할 정보가 담긴 association file에 대한 요청을 응답할 수 있게 처리해주면 된다.
먼저 아래 형식으로, apple-app-site-association 를 이름으로 하는 파일을 작성한다.
{
"applinks": {
"apps": [], (A)
"details": [
{
"appID": "9JA89QQLNQ.com.apple.wwdc", (C)
"paths": [
"/authors, (E)
"/authors/*, (F)
"/authors/*/books, (G)
"/authors/1?, (H)
"NOT /videos/wwdc/2015/*" (I)
] (D)
}, (B)
{
"appID": "ABCD1234.com.apple.wwdc",
"paths": [ "*" ]
}
]
}
}
(A) apps 키는 빈 배열 상태로 반드시 존재해야 한다.
(B) 해당 URL로 제공할 유니버셜 링크를 제공할 앱 정보이다. 동일한 정보가 여러 개일 경우, 첫 번째 매칭되는 것을 사용한다.
(C) {app_prefix}.{app_identifier} 형태의 appID
(D) 허용하거나 허용하지 않을 주소 목록. 첫 번째 매칭되는 것을 사용한다.
(E) 허용할 주소를 명시할 수 있고,
(F) * 를 사용하면 하위 디렉토리를 모두 매칭한다.
(G) 특정 경로에 * 를 사용할 수 있고,
(H) ? 를 사용할 경우, 특정 캐릭터 이후를 명시할 수 있다.
(I) 허용하지 않을 주소에는 'NOT '을 붙인다.
다음으로, 유니버셜 링크가 동작하도록 할 웹사이트의 루트 또는 ./well-known 디렉토리 하위에서,
위 파일을 application/json 타입으로 응답하게 해주면 된다.
예)
https://example.com/apple-app-site-association
또는
https://example.com/.well-known/apple-app-site-association
에서 응답하도록 처리
nginx 라면 아래와 같이 적용해주면 되겠다.
server {
listen 443; # https 여야 한다.
...
location = /apple-app-site-association {
more_set_headers "Content-Type: application/json; charset=utf-8";
root {apple-app-site-association 파일의 디렉토리};
}
# 또는 .well-known 하위여도 된다.
# location = /.well-known/apple-app-site-association { ... }
}
논의:
- 초기에 테스트할 때, association 파일을 암호화해야할 지 말아야 할 지에 대해 고민하면서 삽질했던 기억이 난다.
iOS9 이상을 대상으로 하고, association file 을 HTTPS 프로토콜로 제공할 거라면 association file을 추가로 암호화하지 않아도 된다.
단, iOS8 버전에서 핸드오프나 Shared Web Credentials 을 제공할 거라면 암호화가 필요하고 한다.
- iOS 9.3.1 버전부터는 apple-app-site-association 파일은 (암호화 여부에 관계 없이) 128KB 이하로 제한된다.
- apple-app-site-association.json 이 아니라 apple-app-site-association 이다.
- 파일을 만들기 귀찮다면 nginx 에서 바로 응답해도 좋다.
location = /apple-app-site-association {
more_set_headers "Content-Type: application/json; charset=utf-8";
return 200 '{"applinks": {"apps": [],"details": [{"appID": "{appID}","paths": ["*","/"]}]}}';
}
- 앱이 설치되지 않을 경우 마켓으로 보내고 싶다면, 해당 path 요청의 응답으로 마켓 URL을 응답하면 된다.
nginx 라면 아래와 같이 처리하면 된다.
location / {
return 302 {마켓 URL};
}
반응형
댓글
공지사항