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};
    }

저작자 표시 비영리 변경 금지
신고

카테고리

분류 전체보기 (659)
About me. (6)
Daylogs (624)
비공개 (0)
영어공부 (0)
My works - 추억 (29)