どのようにしてmailtoリクエストを解析できますか?このNSURLからNSURLを解析するmailto
'mailto:[email protected][email protected]&subject=This%20is%20the%20subject&body=This%20is%20the%20body'
、私は、受信者、件名と本文を抽出したいです。どうすればいいですか?ここで
おかげ
どのようにしてmailtoリクエストを解析できますか?このNSURLからNSURLを解析するmailto
'mailto:[email protected][email protected]&subject=This%20is%20the%20subject&body=This%20is%20the%20body'
、私は、受信者、件名と本文を抽出したいです。どうすればいいですか?ここで
おかげ
は、任意の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の辞書に登録されました。
私はこのようなことから、電子メールを引き上げる:
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);
'-description'を使うことは非常に悪いことです。 –
なぜ '-description'を使うのが非常に悪いのですか? –
は、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
'queryItems'と' NSURLQueryItem'クラス自体は、iOS 8.0以降でのみ利用可能です。 – Alnair
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];
}
非常に洗練されたソリューションです。私は抽象が好きです。 – Mundi
どうすればテキストファイルを添付できますか? – Saleh
これはクエリの内容を取得し、何かを添付しないことでした。 –