4

私は iOS 開発に飛び込んでおり、iPhone アプリ用のカスタム URL スキームはmyApp://?q=200. クエリパラメーターを取得する次のコードがあります...

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

...しかし、さらにパラメーターを追加する場合に備えて、もう少し将来性のあるものにしたいと思います。より安全な方法で「q」パラメータを抽出するにはどうすればよいですか?

あなたの知恵を前もってありがとう!

4

3 に答える 3

2

&URL から返されたクエリを andで分割し、=それらを辞書に入れることができます。

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"]);

この例では、パラメーターに値がない場合は、 に設定しましたNSNullNSNullこれは、値を持つキーをスキップするか、空の文字列に設定するロジックを確認または変更する必要があることを意味します。

于 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. インデックス: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...
}

重要なのは、StringReplace よりも NSArray クラスを活用することです。

于 2012-12-21T02:26:07.617 に答える