Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何从非标准URL NSString对象提取参数?_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 如何从非标准URL NSString对象提取参数?

Iphone 如何从非标准URL NSString对象提取参数?,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在进行iOS开发,我的iPhone应用程序有一个定制的URL方案,看起来像myApp://?q=200。我有以下代码来获取查询参数 NSString *urlString = [url absoluteString]; NSString *query = [urlString stringByReplacingOccurrencesOfString:@"myApp://?q=" withString:@""]; …但如果我添加更多参数,我想让它更能证明未来。如何以更安全的方式提取“q”参数

我正在进行iOS开发,我的iPhone应用程序有一个定制的URL方案,看起来像
myApp://?q=200
。我有以下代码来获取查询参数

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(查询字符串的右侧)提供有值内容
  • 在有值内容中,然后使用下游变量,或设置为上游变量

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

    检查我们的
    //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...
    }