我正在研究iOS开发,并且我有一个看起来像 myApp://?q=200
的iPhone应用程序的自定义URL方案。我有以下代码以获取查询参数...
NSString *urlString = [url absoluteString];
NSString *query = [urlString stringByReplacingOccurrencesOfString:@"myApp://?q=" withString:@""];
...但是,如果我添加更多参数,我想让它更加防前。如何以更安全的方式提取" Q"参数?
事先感谢您的智慧!
您可以通过&
和=
从URL返回的查询,然后将它们放入字典中。
NSURL *url = [NSURL URLWithString:@"myApp://?q=200"];
NSArray *query = [[url query] componentsSeparatedByString:@"&"];
NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithCapacity:[query count]];
for(NSString *parameter in query)
{
NSArray *kv = [parameter componentsSeparatedByString:@"="];
[parameters setObject:[kv count] > 1 ? [[kv objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding] : [NSNull null]
forKey:[[kv objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding]];
}
NSLog(@"Parameters: %@", parameters);
NSLog(@"q = %@", [parameters objectForKey:@"q"]);
在此示例中,如果参数没有值,则我将其设置为NSNull
。这意味着您要么需要检查NSNull
或更改逻辑以跳过值的键,要么将它们设置为空字符串。
从我的头顶起作用,但尚未包括错误检查输入
-(NSDictionary*) parameterDictionaryFromString: (NSURL*) url {
//input can be something like: "myApp://?q=one&q2=two&q3=three"
NSString *requestString = [url query];
//now we have q=one&q2=two&q3=three
NSArray *requests = [requestString componentsSeparatedByString: @"&"];
NSMutableDictionary *resultDictionary = [NSMutableDictionary dictionary];
for (NSString *singleParameter in requests) {
NSArray *keyValuePair = [singleParameter componentsSeparatedByString: @"="];
[resultDictionary setObject: [keyValuePair objectAtIndex: 1] forKey: [keyValuePair objectAtIndex: 0]];
}
NSURL *u = [NSURL URLWithString: @"myApp://something?q=1&check=yes"];
NSLog(@"paramStr = %@", [u parameterString]);
return [resultDictionary copy];
}
- 通过不同的分离器打破查询字符串,
- 确保在索引上提供的有价值的内容:1(查询字符串断开的右侧)
- 在有价值的内容中,然后使用下游或设置为上游变量。
//Your Example:
//@"myApp://?q=200"
//Break:
NSArray *queryParts = [urlString componentsSeparatedByString:@"?q="];
//Assure Content:
if ([[array objectAtIndex:1] length]>0) {
//Setter:
NSString *queryString = [array objectAtIndex:1];
//... Use away...
}
关键是要通过字符串Replace来利用NSArray类。