2011-09-05 19 views
7

मैं मेलto अनुरोध को कैसे पार्स कर सकता हूं?एक NSURL mailto को पार्स करें

'mailto:[email protected][email protected]&subject=This%20is%20the%20subject&body=This%20is%20the%20body' 

इस NSURL से, मैं प्राप्तकर्ता, विषय और शरीर निकालना चाहता हूं। मुझे कैसे करना चाहिए ?

धन्यवाद

उत्तर

10

यहाँ कुछ कोड है कि किसी भी यूआरएल को पार्स और मापदंडों और एक शब्दकोश में संबद्ध वस्तुओं के साथ एक शब्दकोश वापस आ जाएगी है। यह mailto यूआरएल के लिए भी काम करता है।
कृपया ध्यान दें: यह कोड मानता है कि आप एआरसी का उपयोग कर रहे हैं!

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

संपादित करें:
मैंने किसी भी यूआरएल के साथ काम करने के लिए कोड अपडेट किया है और प्राप्तकर्ता अब mailto यूआरएल के लिए शब्दकोश में हैं।

+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

'डिस्क्रिप्शन' का उपयोग करना बहुत बुरा अभ्यास है। –

+1

'डिस्क्रिप्शन' का उपयोग क्यों करना बहुत बुरा अभ्यास है? –

1

iOS 7 के बाद से इस NSURLComponents साथ आसानी से संभव है। आप के साथ उस वस्तु बना सकते हैं:

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

तो फिर तुम प्राप्तकर्ता NSURLComponents की राह प्रॉपर्टी एक्सेस प्राप्त कर सकते हैं; और क्वेरी इटम्स संपत्ति के साथ पैरामीटर। उदाहरण के लिए, अगर हम विषय प्राप्त करना चाहता था, कुछ इस तरह हमारा काम

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

'queryItems' और' NSURLQueryItem' क्लास केवल आईओएस 8.0 के बाद ही उपलब्ध है, हालांकि। – Alnair

0

NSURL वर्ग के लिए क्या करना होगा बस mailto: यूआरएल नहीं करता है: यह विधि भी जब इन्हें मेल ऊपर फेबियन के जवाब में एक दुर्घटना बग के लिए एक ठीक है एक नहीं है? इसे 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]; 
} 
संबंधित मुद्दे