Das iOS 7 SDK bietet jetzt eine bessere Alternative stringByAddingPercentEscapesUsingEncoding, mit der Sie festlegen können, dass alle Zeichen außer bestimmten zulässigen Zeichen maskiert werden sollen. Es funktioniert gut, wenn Sie die URL in Teilen aufbauen:
NSString * unescapedQuery = [[NSString alloc] initWithFormat:@"?myparam=%d", numericParamValue];
NSString * escapedQuery = [unescapedQuery stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString * urlString = [[NSString alloc] initWithFormat:@"http://ExampleOnly.com/path.ext%@", escapedQuery];
Obwohl es seltener vorkommt, dass die anderen Teile der URL Variablen sind, gibt es in der Kategorie NSURLUtilities auch Konstanten für diese:
[NSCharacterSet URLHostAllowedCharacterSet]
[NSCharacterSet URLUserAllowedCharacterSet]
[NSCharacterSet URLPasswordAllowedCharacterSet]
[NSCharacterSet URLPathAllowedCharacterSet]
[NSCharacterSet URLFragmentAllowedCharacterSet]
[NSCharacterSet URLQueryAllowedCharacterSet]Enthält alle Zeichen, die im Abfrageteil der URL zulässig sind (der Teil, der mit dem ?und vor dem #für ein Fragment beginnt , falls vorhanden), einschließlich der Zeichen ?und &oder =, die zur Begrenzung der Parameternamen und -werte verwendet werden. Bei Abfrageparametern mit alphanumerischen Werten kann eines dieser Zeichen in den Werten der Variablen enthalten sein, die zum Erstellen der Abfragezeichenfolge verwendet werden. In diesem Fall muss jeder Teil der Abfragezeichenfolge maskiert werden, was nur ein wenig mehr Arbeit erfordert:
NSMutableCharacterSet * URLQueryPartAllowedCharacterSet;
URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[URLQueryPartAllowedCharacterSet removeCharactersInString:@"&+=?"];
NSString * escapedValue = [anUnescapedValue stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
NSString * escapedFrag = [anUnescapedFrag stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSString * urlString = [[NSString alloc] initWithFormat:@"http://ExampleOnly.com/path.ext?myparam=%@#%@", escapedValue, escapedFrag];
NSURL * url = [[NSURL alloc] initWithString:urlString];
Das unescapedValuekönnte sogar eine ganze URL, wie für einen Rückruf oder Umleitung sein:
NSString * escapedCallbackParamValue = [anAlreadyEscapedCallbackURL stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
NSURL * callbackURL = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"http://ExampleOnly.com/path.ext?callback=%@", escapedCallbackParamValue]];
Hinweis: Nicht NSURL initWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)pathfür eine URL mit einer Abfragezeichenfolge verwenden, da dadurch mehr prozentuale Escapezeichen zum Pfad hinzugefügt werden.