문제
링크 테스트를 위해 링크를 입력하고, 링크 버튼을 눌렀더니 .. !
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을 생성할 때 올바른 스킴인지 확인하는 코드를 작성하면 좋을 것 같다.
'ToyProject - 사카마카 (살까말까 고민 될 때는 사카마카)' 카테고리의 다른 글
[사카마카] TableView의 Section을 이용해서 대댓글 기능을 구현해보자. (0) | 2024.06.03 |
---|---|
[사카마카] 키보드 이벤트를 감지하여 화면의 레이아웃을 업데이트 해보자. (0) | 2024.06.01 |
[사카마카] 앱 내에서 웹을 보여주는 방법에 대해 알아보자. (0) | 2024.05.30 |
[사카마카] Lottie로 애니메이션을 사용해보자. (0) | 2024.05.29 |
[사카마카/문제해결] CollectionViewCell의 버튼 이벤트 문제를 해결해보자. (0) | 2024.05.29 |