ToyProject - 사카마카 (살까말까 고민 될 때는 사카마카)

[사카마카/문제해결] 앱 내에서 웹을 보여줄 때 발생하는 스킴 문제를 해결해보자.

여성일 2024. 5. 30. 21:42
728x90
문제

링크 테스트를 위해 링크를 입력하고, 링크 버튼을 눌렀더니 .. !

 

Thread 1: "The specified URL an unsupported scheme. Only HTTP and HTTPS URLs are supported." 에러가 발생했다.

처음에는 대충 HTTPS~ 라길래 보안 문제인줄 알고 해결하는데 오래 걸리겠구나 ~ 했다. (이래서 에러 로그는 꼼꼼하게 읽어봐야한다 !!)

 

이 문제는 간단하다. SafariServices로 웹을 보여줄 때는, HTTP와 HTTPS scheme만 지원하기 때문에 발생하는 문제이다. 

 

(나중에 확인해보니 https가 아니라 httpsa라고 입력했다. 심지어 never 😂)

 

생각하기

1. HTTP와 HTTPS 스킴만을 지원하면, 입력 받은 URL의 스킴이 http나 https인지 확인하면 되지 않을까?

 

2. 사용자가 링크를 대문자로 입력할 수 있으니 대문자도 고려해야되지 않을까?

 

해결하기

위에서 생각한대로 접근하여 해결해보았다. 

 

1. URL 생성 : 입력 받은 String 타입의 url을 사용해 URL객체를 생성한다.

 

2. URL 스킴 확인 : URL의 스킴을 가져와 http인지, https인지 확인하고, http와 https일 경우 웹을 보여주고, http와 https가 아닌 경우 잘못된 형식의 링크임을 사용자에게 알리는 커스텀 alert창을 띄워준다.

✅ 사용자가 링크를 대문자로 입력할 수 있으니 URL 스킴을 소문자로 변환하여 조건문을 실행한다.

 

 

다시 생각해보기

1. 입력 검증 및 예외 처리

항상 사용자 입력 또는 외부 데이터로부터 URL을 처리할 때는 검증을 해야한다는 것을 다시 한번 생각하게 됐다. URL이 유효한지?, 지원되는 스킴을 가지고 있는지? 확인하는 과정은 중요하다는 것을 알게 되었다.

 

2. 안전한 URL

URL을 생성하기 전에 값을 검증하고, URL이 유효한지 확인해야겠다. 

func isValidURL(_ urlString: String) -> Bool {
    guard let url = URL(string: urlString) else {
        return false
    }
    let scheme = url.scheme?.lowercased()
    return scheme == "http" || scheme == "https"
}

이렇게 URL을 생성할 때 올바른 스킴인지 확인하는 코드를 작성하면 좋을 것 같다.