제가 드디어(?ㅠㅠ) 결제를 붙여야할 일이 생겨서 iamport 서비스를 사용하는 결제 widget을 만들고 있습니다. iamport 덕분에 pg사에 따라 서버등을 설정해야할 필요 없이 손쉽게 이용은 가능합니다.
다만 앱 내부(in app)에서 처리하려니 url scheme과 카드사별 따로 설치를 요구하는 앱들이 다르기 때문에 노가다가 많네요.
titanium sdk를 수정하지 않고 동작하게 만들려고 했으나 android의 shouldOverrideUrlLoading나 iOS의 shouldStartLoadWithRequest를 직접적으로 컨트롤하는 타이타늄 API가 없다보니 해결하지 못하는 문제가 있네요. 타이타늄의 기본 Webview에서 앞서 말한 두 함수를 수정해서 사용해야할 것 같네요.
국내 PG사와 카드사들의 앱들 복잡한 이 상황을 뚥기 위해 필요했던 기능은 특정 url을 완전히 사전에 막는 것입니다.
네이티브에서는 iOS는 shouldStartLoadWithRequest, 안드로이드는 shouldOverrideUrlLoading에서 return값에 따라 요청을 여부를 결정합니다.
Titanium에서 비슷한 일을 하는 방법 하지만 문제는 있다.
현재 버전(TiSDK 5.2.x)기준에서 설명해보겠습니다. beforeload이벤트에서 url을 확인하여 stopLoading을 이용할 경우 실제 request가 전달되어 버립니다. beforeload 이벤트는 UI 메인쓰레드의 흐름과 무관하게 비동기로 호출되다보니 요청을 사전에 막는게 아니라 일단 요청하고 stopLoading을 하게 됩니다.
얼마 전에 올라왔던 글이 바로 이런 내용이었습니다.
오늘 결제 위젯을 만들려고 자세히 살펴보다 이런 사항을 확실하게 알게 되었죠.
5.4.0에 추가되는 Webview의 blacklistedURLs 속성과 stopBlackListUrl 이벤트
정확히 위에서 설명한 요구사항에 맞는 기능으로 새로운 속성과 event가 추가되었습니다.
다행이네요~ 일단 현재 버전에 아래 commit 내용을 참고하여 사용해야겠습니다.
저희는 일단 ‘load’ eventListener 에서 이렇게 꽁수로 처리…ㅋ
로드된 url 을 체크해서 intent 호출이면 intent 뒤에 스키마를 대체해서 호출하는 식으로 …
문제는 beforeload에서 stoploading이 안먹어서 intent 호출을 막지 못하고 에러페이지 발생한 다음에
아래와 같이 처리하느라…에러페이지가 살짝 노출됐다가 다시 원래 페이지로 되돌아가도록 되어 있습니다.
로딩완료되기 전까지 웹뷰를 감췄다가 정상 로딩된 후 다시 보여주는 식 꼼수로 처리해볼려다가 일단은
그냥 놔둔 상태입니다.
if (e.url.indexOf(‘intent’) !== -1) {
var urlData = e.url.split("#");
var fixedUrl = urlData[0].replace(“intent”, “droidx3web”);
// Ti.API.debug("in payment, url : " + fixedUrl);