4

我正在深入研究 iOS 开发,并且我的 iPhone 应用程序有一个自定义 URL 方案,看起来像myApp://?q=200. 我有以下代码来获取查询参数...

NSString *urlString = [url absoluteString];
NSString *query = [urlString stringByReplacingOccurrencesOfString:@"myApp://?q=" withString:@""];

...但如果我添加更多参数,我想让它更具前瞻性。如何以更安全的方式提取“q”参数?

提前感谢您的智慧!

4

3 回答 3

2

&您可以使用and拆分从 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或更改逻辑以跳过带有值的键或将它们设置为空字符串。

于 2012-12-20T18:52:38.500 回答
1

这从我的头顶可以工作,但还没有包括错误检查输入

-(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];

}

于 2012-12-20T18:55:10.397 回答
0
  1. 通过不同的分隔符打破查询字符串,
  2. 确保在 index:1 处提供的有价值的内容(查询字符串中断的右侧)
  3. 然后在有价值的内容中使用下游,或设置为上游变量。

//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...
}

关键是利用 NSArray 类而不是 StringReplace。

于 2012-12-21T02:26:07.617 回答