2011-09-05 7 views

答えて

10

は、任意のURLを解析し、辞書内のパラメータと関連オブジェクトと辞書を返しますいくつかのコードです。それはmailto URLでも有効です。
注:このコードは、あなたが使用していることを前提としています。ARC

@interface NSString (URLDecoding) 

- (NSString *) URLDecodedString; 

@end 

@implementation NSString (URLDecoding) 

- (NSString *) URLDecodedString { 
    NSString *result = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (__bridge CFStringRef)self, CFSTR(""), kCFStringEncodingUTF8); 
    return result; 
} 

@end 

- (NSDictionary *) parameterDictionaryFromURL:(NSURL *)url { 
    NSMutableDictionary *parameterDictionary = [[NSMutableDictionary alloc] init]; 
    if ([[url scheme] isEqualToString:@"mailto"]) { 
     NSString *mailtoParameterString = [[url absoluteString] substringFromIndex:[@"mailto:" length]]; 
     NSUInteger questionMarkLocation = [mailtoParameterString rangeOfString:@"?"].location; 
     [parameterDictionary setObject:[mailtoParameterString substringToIndex:questionMarkLocation] forKey:@"recipient"]; 

     if (questionMarkLocation != NSNotFound) { 
      NSString *parameterString = [mailtoParameterString substringFromIndex:questionMarkLocation + 1]; 
      NSArray *keyValuePairs = [parameterString componentsSeparatedByString:@"&"]; 
      for (NSString *queryString in keyValuePairs) { 
       NSArray *keyValuePair = [queryString componentsSeparatedByString:@"="]; 
       if (keyValuePair.count == 2) 
        [parameterDictionary setObject:[[keyValuePair objectAtIndex:1] URLDecodedString] forKey:[[keyValuePair objectAtIndex:0] URLDecodedString]]; 
      } 
     } 
    } 
    else { 
     NSString *parameterString = [url parameterString]; 
     NSArray *keyValuePairs = [parameterString componentsSeparatedByString:@"&"]; 
     for (NSString *queryString in keyValuePairs) { 
      NSArray *keyValuePair = [queryString componentsSeparatedByString:@"="]; 
      if (keyValuePair.count == 2) 
       [parameterDictionary setObject:[[keyValuePair objectAtIndex:1] URLDecodedString] forKey:[[keyValuePair objectAtIndex:0] URLDecodedString]]; 
     } 
    } 

    return [parameterDictionary copy]; 
} 

そして、ここであなたがそれを使用する方法です:

NSURL *mailtoURL = [NSURL URLWithString:@"mailto:[email protected][email protected]&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"]; 
NSDictionary *parameterDictionary = [self parameterDictionaryFromURL:mailtoURL]; 

NSString *recipient = [parameterDictionary objectForKey:@"recipient"]; 
NSString *subject = [parameterDictionary objectForKey:@"subject"]; 
NSString *body = [parameterDictionary objectForKey:@"body"]; 

EDIT:
すべてのURLで動作するようにコードが更新され、受信者はmailtoのURLの辞書に登録されました。

+0

非常に洗練されたソリューションです。私は抽象が好きです。 – Mundi

+0

どうすればテキストファイルを添付できますか? – Saleh

+0

これはクエリの内容を取得し、何かを添付しないことでした。 –

2

私はこのようなことから、電子メールを引き上げる:

NSString * mailToString = @"'mailto:[email protected][email protected]&subject=This%20is%20the%20subject&body=This%20is%20the%20body'"; 

NSArray *tempArray = [mailToString componentsSeparatedByString:@"?"]; 

//get email address from array 
NSString * emailString = [[tempArray objectAtIndex:0]description]; 

//clean up string 
emailString = [emailString stringByReplacingOccurrencesOfString:@"'mailto:" withString:@""]; 

//and here is your email string 
NSLog(@"%@",emailString); 
+2

'-description'を使うことは非常に悪いことです。 –

+1

なぜ '-description'を使うのが非常に悪いのですか? –

1

は、iOS 7ので、これはNSURLComponentsで簡単になんとかです。あなたがして、そのオブジェクトを作成することができます。

if let components = NSURLComponents(URL: url, resolvingAgainstBaseURL:false) { ... 

次に、あなたは、受信者がNSURLComponentsのパスプロパティにアクセスし得ることができます。 queryItemsプロパティを使用してパラメータを設定します。例えば、我々は件名を取得したい場合は、このようなものは、ただのmailtoのための私たちの仕事

let queryItems = components.queryItems as? [NSURLQueryItem] 
let subject = queryItems?.filter({$0.name == "subject"}).first?.value 
+0

'queryItems'と' NSURLQueryItem'クラス自体は、iOS 8.0以降でのみ利用可能です。 – Alnair

0

NSURLカテゴリの操作を行います。また、このメソッドは、ときのmailto上記ファビアンの答えでクラッシュバグの修正があります。URLのdoesn aを含んでいない?また、URLDecodedStringカテゴリメソッドも必要ありません。

@implementation NSURL (Additions) 

- (NSDictionary *) parameterDictionaryForMailTo { 
    NSMutableDictionary *parameterDictionary = [[NSMutableDictionary alloc] init]; 
    NSString *mailtoParameterString = [[self absoluteString] substringFromIndex:[@"mailto:" length]]; 
    NSUInteger questionMarkLocation = [mailtoParameterString rangeOfString:@"?"].location; 
    if (questionMarkLocation != NSNotFound) { 
     [parameterDictionary setObject:[mailtoParameterString substringToIndex:questionMarkLocation] forKey:@"recipient"]; 
     NSString *parameterString = [mailtoParameterString substringFromIndex:questionMarkLocation + 1]; 
     NSArray *keyValuePairs = [parameterString componentsSeparatedByString:@"&"]; 
     for (NSString *queryString in keyValuePairs) { 
      NSArray *keyValuePair = [queryString componentsSeparatedByString:@"="]; 
      if (keyValuePair.count == 2) 
       [parameterDictionary setObject:[[keyValuePair objectAtIndex:1] stringByRemovingPercentEncoding] forKey:[[keyValuePair objectAtIndex:0] stringByRemovingPercentEncoding]]; 
     } 
    } 
    else { 
     [parameterDictionary setObject:mailtoParameterString forKey:@"recipient"]; 
    } 

    return [parameterDictionary copy]; 
}