【问题标题】:How can I extract parameters from a non-standard URL NSString object?如何从非标准 URL NSString 对象中提取参数?
【发布时间】:2012-12-20 18:41:51
【问题描述】:

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

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

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

提前感谢您的智慧!

【问题讨论】:

标签: iphone objective-c ios


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    }

    【讨论】:

      【解决方案3】:
      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。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-21
        • 2011-06-03
        • 2021-10-20
        • 2021-06-15
        • 1970-01-01
        相关资源
        最近更新 更多