Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

iPhone(iOS)에서 NSString 문자열을 URL 인코딩하는 방법 완벽 정리


URL 인코딩이 필요한 이유

API 기반 웹 애플리케이션을 개발할 때는 여러 웹 서비스 및 URL과 상호작용해야 하는 경우가 많습니다. URL에는 특수 문자, 검색어, 쿼리 파라미터 등 다양한 요소가 포함될 수 있으며, 이러한 요소는 호출하려는 서비스에 따라 달라집니다. 특수 문자를 그대로 전송하면 서버가 URL을 잘못 해석할 수 있기 때문에, 생성하는 URL과 실제 요청되는 URL이 일치하도록 퍼센트 인코딩(percent encoding) 처리가 필수적입니다.

Objective-C에서 URL 인코딩 구현하기

첫 번째 방법은 NSString에 카테고리(Category)를 추가해 URL 인코딩 메서드를 직접 구현하는 것입니다. Core Foundation의 CFURLCreateStringByAddingPercentEscapes 함수를 활용하면 됩니다.

#import "NSString+URLEncoding.h"
@implementation NSString (URLEncoding)
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
    (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding));
}
@end

두 번째 방법은 NSString에서 기본 제공하는 stringByAddingPercentEscapesUsingEncoding: 메서드를 사용하는 것입니다.

NSString *sUrl = @"https://www.myService.com/search.jsp?param= name";
NSString *encod = [sUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

참고: 위 두 API는 iOS 9 이후 공식적으로 deprecated(사용 중단 권고)되었습니다. 최신 프로젝트에서는 Objective-C의 stringByAddingPercentEncodingWithAllowedCharacters: 메서드나 아래의 Swift 방식을 사용하는 것이 좋습니다.

Swift에서 URL 인코딩하기

Swift에서는 addingPercentEncoding(withAllowedCharacters:) 메서드를 사용해 간단히 URL 인코딩을 처리할 수 있습니다.

func getURL(str: String) -> String? {
    return str.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
}

이 함수는 인코딩된 URL 문자열(옵셔널 타입)을 반환하며, 다음과 같이 사용할 수 있습니다.

var sURL = "https://www.myService.com/search.jsp?param= name"
print(getURL(sURL)!)

실행 결과, 공백처럼 허용되지 않는 문자는 퍼센트 인코딩되어 다음과 같이 출력됩니다.

https://www.myService.com/search.jsp?param=%20name

활용 팁

문자열의 용도에 따라 적절한 allowed character set을 선택하는 것이 중요합니다. 호스트(host) 영역에는 .urlHostAllowed, 쿼리(query) 문자열에는 .urlQueryAllowed를 사용하는 것이 적합하며, 이를 통해 불필요한 이중 인코딩을 방지하고 안정적인 네트워크 요청을 보낼 수 있습니다.