Search
Duplicate

Swift에서 URL 인코딩을 통해 안전하게 URL 생성하기

생성일
2024/08/06 01:26
태그
지혜로운 회사생활
비플페이
v1.8.9

Swift에서 URL 인코딩을 통해 안전하게 URL 생성하기

Swift로 URL을 생성할 때 종종 문제를 겪는 경우가 있다.
특히, URL 문자열에 공백이나 특수 문자가 포함된 경우, URL 객체 생성이 실패할 수 있다.
이를 방지하기 위해 URL 인코딩을 사용하여 문자열을 적절히 변환할 수 있다.
일단 우리 앱에서 에러가 난 케이스를 살펴보면
여기 메인 화면에서 나타나고 있는 배너를 눌렀을 때, 서버에서 내려주는 URL에 외부 브라우저로 이동을 해야하는데,
클릭을 해도 이동하지 않는 문제가 발생하였다.
func newOpenBrowser(urlSt: String) { var fullUrlSt = API.serverURL + urlSt if urlSt.contains("http") || urlSt.contains("https") { fullUrlSt = urlSt } guard let url = URL(string: fullUrlSt) else { print("Error: Invalid URL string: \(fullUrlSt)") return } UIApplication.shared.open(url) }
Swift
복사
Error: Invalid URL string: https://m.kjbank.com/mweb/spa/Onepick/?pick=L073&chfrom=210003&utm_source=bplaypay-da-m&utm_medium=DA&utm_campaign=비플페이&utm_content=비플페이&dkas=652877
Swift
복사
이런 에러 로그가 나왔다.
일단 내 생각은 로그 중에 한글이 섞여 있어 발생한 문제라고 생각하였다.
그래서 코드를
func newOpenBrowser(urlSt: String) { var fullUrlSt = API.serverURL + urlSt if urlSt.contains("http") || urlSt.contains("https") { fullUrlSt = urlSt } guard let url = URL(string: fullUrlSt.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "") else { print("Error: Invalid URL string: \(fullUrlSt)") return } UIApplication.shared.open(url) }
Swift
복사
이렇게 바꿔 주었다.
기존에는 fullUrlSt 문자열을 직접 URL 객체로 변환하고 있었다.
guard let url = URL(string: fullUrlSt) else { print("Error: Invalid URL string: \(fullUrlSt)") return }
Swift
복사
이 코드는 fullUrlSt 에 공백이나 특수 문자가 포함된 경우, URL 객체를 생성하지 못하고 오류 메시지를 출력한다.
실제로 우리 URL에 한글이 포함되어서 내려오니, 외부 브라우저로 이동 되지 않는 문제가 발생.

 해결방법

URL 인코딩을 통해 문자열을 변환하고 이를 URL 객체로 생성하도록 변경하였다.
guard let url = URL(string: fullUrlSt.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "") else { print("Error: Invalid URL string: \(fullUrlSt)") return }
Swift
복사
fullUrtSt.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
URL 문자열에 포함된 공백 및 특수 문자 URL 인코딩
.urlQueryAllowed : URL의 쿼리 부분에서 허용되는 문자 집합을 나타낸다.
이렇게 하고 로그를 찍어 비교해보고
✅ fullUrlSt의 경우 - https://m.kjbank.com/mweb/spa/Onepick/?pick=L073&chfrom=210003&utm_source=bplaypay-da-m&utm_medium=DA&utm_campaign=비플페이&utm_content=비플페이&dkas=652877 ✅ fullUrlSt.addingPercentEncoding(withAllowedCharacters: 의 경우 - https://m.kjbank.com/mweb/spa/Onepick/?pick=L073&chfrom=210003&utm_source=bplaypay-da-m&utm_medium=DA&utm_campaign=%EB%B9%84%ED%94%8C%ED%8E%98%EC%9D%B4&utm_content=%EB%B9%84%ED%94%8C%ED%8E%98%EC%9D%B4&dkas=652877
Plain Text
복사
성공적으로 URL 인코딩이 되었다 → fullUrlSt 문자열이 인코딩 되기 때문에, 공백이나 특수 문자가 포함되어 있더라도 URl 객체가 성공적으로 생성된다.
그리고 앱을 다시 빌드 후 테스트 해보니 성공적으로 이동 완료!

결론

URL 인코딩을 통해 URL 문자열을 안전하게 변환하는 것은 매우 중요하다.
이는 공백이나 특수 문자가 포함된 문자열을 다룰 때 특히 유용하고, Swift에서 URL을 더 안정적으로 생성할 수 있다.