iOS 10.3.x CustomURL Scheme 호출 이슈 및 해결 방법

Category
HTML/CSS/JS, 개발 노트
Posted
세월호 참사 1주기 결코 잊지 않겠습니다.

내 아이폰을 업뎃을 하지 않고 있었더니 이슈가 있는 줄도 모르고 있엇…..

issue

iOS에서 deeplink 호출을 위해 custom URL scheme을 사용하고 있는데, iOS 10.3.0, iOS 10.3.1 에서 정상적으로 동작하지 않는 케이스가 발견되었다. 확인해 보니 재현절차는 다음과 같았다.

  1. 링크 클릭
  2. deeplink 호출을 처리하는 페이지가 새 창에서 열림
  3. 열리라는 어플리케이션은 열리지 않고, 앱스토어로 이동

아오 쓍… Apple이 왜 또…
정확한 이슈를 확인하기 위해 몇 가지 케이스 테스트 해보니 (모두 앱이 설치된 상태를 기준으로 진행 됨) 다음과 같은 결과가 발생되더라.

anchor를 이용한 deeplink 호출
현재 페이지에서 이동시킨 경우
정상적으로 앱 호출
target="_blank"로 새 창을 연 경우
아무런 반응을 하지 않음
window.open()으로 새 창을 연 경우
아무런 반응을 하지 않음
location.href = deeplink 를 이용한 deeplink 호출
현재 페이지에서 이동시킨 경우
정상적으로 앱 호출
target="_blank"로 새 창을 연 경우
아무런 반응을 하지 않음
window.open()으로 새 창을 연 경우
아무런 반응을 하지 않음
runApp JS를 이용항 deeplink 호출
현재 페이지에서 실행 된 경우
정상적으로 앱 호출
target="_blank"로 열린 새 창에서 실행 된 경우
팝업 페이지에서 App Store로 이동에 대한 confirm 창 뜸
window.open()으로 열린 새 창에서 실행 된 경우
opener 페이지에서 App Store로 이동에 대한 confirm 창 뜸

요약해보자면, 새 창이 뜨면서 custom URL Scheme를 호출하는 경우, App이 호출되지 않고, setTimeout에 의한 코드는 정상적으로 진행되어 App Store로 이동시키려는 시도가 발생하는 것이다.

Resolve

같은 이슈를 만난 케이스가 여러 군데 있던 모양인데 구글님께서도 해결책을 가진 곳을 알고 있지 않은지 찾을 방법이 없었다. 해서 추가적인 테스트를 진행하면서 해결방법을 찾아봤다는데 운 좋게도 단 한번의 테스트로 해결책 발견… = _=a
단순히 runApp 코드를 일정 시간 지연시켜서 호출하면 잘 돌더라.

다시 말해, 페이지가 로드 됨과 동시에 runApp 코드가 호출 되면 custom URL scheme을 묵살해버리는데, 페이지 로드 이후 약간의 지연시간을 주면 동작하더라는…
결국 runApp 코드의 실행을 700ms 정도 지연시켜 처리해보니 넘나 잘도는 것…

function runApp(){
	...
}
setTimeout(runApp, 700);

일단 임시로 이렇게 처리하도록 해결책을 마련하기는 했는데, 이게 iOS 10.3.x 에서의 버그인지 애플이 의도한 것인지를 모르겠다.
정말 의도한 것이라면 대략 난감… 이젠 버전별로 분기해서 universal link + custom URL Scheme 을 가야 하는 것인지…

Authored By 멀더끙