iOS 웹뷰의 타임아웃은 얼마에요?

whitelips
a day of a programmer
5 min read2 days ago

WKWebView 에서 웹페이지 로딩을 시도할 때 타임아웃을 알아봅니다.

오늘도 회사에서 질문 받았어요.

by DALL-E

iOS 웹뷰에서 페이지 로딩시 타임아웃을 알고 싶어요.

앱개발자는 WKWebView 에서 URL 로딩을 시도할 때에 별도의 타임아웃을 설정하는 API가 없다는 것을 알고 있을 것인데요. 그래도 이런 질문을 받으면 정확하게 확인 하고 답을 하는 걸 좋겠죠? 다음과 같은 방법으로 확인해볼 수 있습니다.

네트워크 스로틀링을 통한 테스트

프록시 툴을 사용해도 좋고, macOS 에 Network Conditioner 를 설치해서 동작해도 좋습니다. 개발자 계정에 개발기기로 등록한 아이폰이라면 개발자 설정에서 네트워크 속도 변경을 해볼 수도 있을거예요.

본인에게 익숙하거나 쉬운 방법으로 해봅니다. 임의의 url 로딩을 시도. 1차 관문 60초 통과, 2차 관문 300초 통과, 400초가 지나니 서버 에러가 내려오네요.

56Kbps 속도로 테스트
이후에도 계속 기다렸지만 서버에서 연결을 닫아서 실패

앱이 사용하는 WKWebView 는 타임아웃이 없는 것처럼 보이는 테스트 결과입니다. 진짜일까요?

WebKit 코드에서 확인하기

URLRequest 에 익숙한 개발자라면 여기서 의문이 하나 생길텐데요. 바로 애플 개발자문서에도 나와있는 내용입니다.

기본 타임아웃은 60초라고 되어있습니다. 그런데 왜 위의 웹뷰 테스트에서는 60초로 동작하지 않았을까요? 지금부터 살펴봅니다. 😄

WebKit/Source/WebCore/platform/network/cocoa/ResourceRequestCocoa.mm 에서 그 단서를 찾을 수 있었습니다. Apple 은 Cocoa framework 을 쓰는 것도 알고 있다면, 여기 코드에서 익숙한 NSURLRequest 도 찾을 수 있습니다. 그리고 timeout 으로 검색해본니다.

void ResourceRequest::doUpdateResourceRequest()
{
// ...
m_timeoutInterval = [m_nsRequest timeoutInterval];

어라? NSURLRequest 의 타임아웃을 쓰네요. 혹시 제가 틀린 걸까요? 더 찾아볼게요.

void ResourceRequest::doUpdatePlatformRequest()
{
// ...
double timeoutInterval = ResourceRequestBase::timeoutInterval();
if (timeoutInterval)
[nsRequest setTimeoutInterval:timeoutInterval];
// Otherwise, respect NSURLRequest default timeout.

다른 구현에서는 ResourceRequestBase의 타임아웃을 사용하고 있습니다. 두 함수를 비교해보니, updatePlatformRequest() 가 더 늦게 호출되어서ResourceRequestBase 의 타임아웃이 웹뷰에 사용됩니다. 계속 찾아갑시다.

WebKit/Source/WebCore/platform/network/ResourceRequestBase.h

ResourceRequestBase(const URL& url, ResourceRequestCachePolicy policy)
: m_url(url)
, m_timeoutInterval(s_defaultTimeoutInterval)
// ...

디폴트 타임아웃을 사용하는 것이네요. 이제 헤더가 아닌 코드를 볼게요.

WebKit/Source/WebCore/platform/network/ResourceRequestBase.cpp

#if PLATFORM(IOS_FAMILY) || USE(CFURLCONNECTION)
double ResourceRequestBase::s_defaultTimeoutInterval = INT_MAX;
#else

iOS 에서는 INT_MAX 를 사용하고 있습니다. 확인 완료!

위 테스트 결과(타임아웃 없음)와 같은 웹킷 코드 구현(타임아웃 정수최대)을 찾았습니다.

마치며

모바일 인앱 웹뷰는 종종 앱개발자에게도 FE개발자에게도 블랙박스로 작용하고 있습니다. 이때에는 개발자의 누적된 경험과 테스트 결과에 따라서 블랙박스 내부를 상상하게 됩니다. 이 경우에는 되는데 왜 되는지 모르겠네 하면서 쓰게되어 찝찝한 기분을 함께 가져가고는 하는데요.

by DALL-E

다행히 애플의 웹킷 코드가 오픈소스로 공개되어 이렇게 내부 구현을 확인할 방법이 있으니, 이제는 명쾌하게 알고 지나가면 좋겠습니다.

--

--

whitelips
a day of a programmer

Software Engineer with 10+ years in iOS, focusing on performance optimization, modularization, and innovative solutions. Proven leader in major tech projects.