parsing一个NSURL mailto

我怎样才能parsing一个mailto请求?

'mailto:someone@example.com?cc=someone_else@example.com&subject=This%20is%20the%20subject&body=This%20is%20the%20body' 

从这个NSURL,我想提取收件人,主题和正文。 我应该怎么做 ?

谢谢

这里是一些代码,将parsing任何url,并返回一个字典与参数和字典中的关联对象。 它也适用于mailtourl。
请注意:这段代码假设你正在使用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:foo@example.com?cc=bar@example.com&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"]; 

编辑:
我更新了代码以处理任何URL,收件人现在位于字典中的mailto URL。

我会从这样的电子邮件拉:

 NSString * mailToString = @"'mailto:someone@example.com?cc=someone_else@example.com&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); 

从iOS 7开始,NSURLComponents很容易实现。 您可以使用以下方法创build该对象

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

然后你可以让收件人访问NSURLComponents的path属性; 以及queryItems属性的参数。 例如,如果我们想要得到这个主题,这样的事情会做我们的工作

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

NSURL类别只是mailto:这个方法也有修复上面的Fabian的答案当mailto:url不包含?的崩溃错误。 它也不需要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]; }