2012-11-30 13 views
8

ekevent EKparticipant ईमेल कैसे प्राप्त करें?ekevent EKparticipant ईमेल कैसे प्राप्त करें?

EKParticipant क्लास में ऐसी कोई विशेषता नहीं है।

क्या प्रतिभागियों की सूची दिखाने के लिए मूल आईओएस प्रतिभागियों नियंत्रक को प्रस्तुत करना संभव है?

उत्तर

9

मैं इस एक ही सवाल था और जब मैं इस साल WWDC पर था, मैं कई Apple इंजीनियर पूछा और वे कोई सुराग नहीं था। मैंने एक लड़के से पूछा कि मैं लाइन में मिला हूं और उसके पास जवाब था:

event.organizer.URL.resourceSpecifier 

यह किसी भी ईकेपार्टेंटेंट के लिए काम करता है। मुझे चेतावनी दी गई थी कि विवरण फ़ील्ड का उपयोग न करें क्योंकि यह किसी भी समय बदल सकता है।

आशा है कि इससे मदद मिलती है! ऊपर दिए गए समाधानों

+0

सबसे अच्छा समाधान जब EKParticipant प्रमुख है – Rakesh

+1

यह काम नहीं करता है (आईओएस 7.1) – ierceg

+0

यह 'होना चाहिए participant.URL.resourceSpecifier', लेकिन न सिर्फ' organizer' संपत्ति EKEvent में, जैसे 'उपस्थिति' संपत्ति – likid1412

1

संपत्ति प्रति एपीआई संस्करण 6.0 के सामने नहीं आती है - मैं खुद जवाब का पता लगा रहा हूं और ऑब्जेक्ट के विवरण से ईमेल पते को पार्स करने के अलावा अन्य कोई अन्य काम नहीं मिला है। उदाहरण:

EKParticipant *organizer = myEKEvent.organizer 
NSString *organizerDescription = [organizer description]; 
//(id) $18 = 0x21064740 EKOrganizer <0x2108c910> {UUID = D3E9AAAE-F823-4236-B0B8-6BC500AA642E; name = Hung Tran; email = [email protected]; isSelf = 0} 

एक NSDictionary में ऊपर स्ट्रिंग पार्स कुंजी @ "ईमेल"

2

एक अन्य विकल्प EKParticipant का यूआरएल को देखने के लिए हो सकता है द्वारा ईमेल खींच। आउटपुट मेलो जैसे मेलो: [email protected] होना चाहिए। वहाँ कुछ विरल प्रलेखन यहाँ है:

http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKParticipantClassRef/Reference/Reference.html

3

कोई भी विश्वसनीय हैं:

  1. URL/xyzxyzxyzxyz.../principal की तरह कुछ हो सकता है और स्पष्ट रूप से है कि एक ई-मेल नहीं है।
  2. EKParticipant:description बदल सकता है और अब ईमेल शामिल नहीं कर सकता है।
  3. आप उदाहरण के लिए emailAddress चयनकर्ता भेज सकते हैं लेकिन यह अनियंत्रित है, भविष्य में बदल सकता है और इस बीच आपके ऐप को अस्वीकार कर दिया जा सकता है।

तो अंत में आपको EKPrincipal:ABRecordWithAddressBook का उपयोग करने की आवश्यकता है और फिर वहां से ईमेल निकालें।

NSString *email = nil; 
ABAddressBookRef book = ABAddressBookCreateWithOptions(nil, nil); 
ABRecordRef record = [self.appleParticipant ABRecordWithAddressBook:book]; 
if (record) { 
    ABMultiValueRef value = ABRecordCopyValue(record, kABPersonEmailProperty); 
    if (value 
     && ABMultiValueGetCount(value) > 0) { 
     email = (__bridge id)ABMultiValueCopyValueAtIndex(value, 0); 
    } 
} 

ध्यान दें कि बुला ABAddressBookCreateWithOptions महंगा है तो आप ऐसा करने के लिए प्रति सत्र केवल एक बार देख सकते हैं: इस तरह।

यदि आप रिकॉर्ड तक नहीं पहुंच पा रहे हैं, तो URL.resourceSpecifier पर वापस आएं। EKParticipant के लिए

+0

हाय! मैंने आपके कोड का उपयोग करने की कोशिश की, लेकिन रिकॉर्ड वैरिएबल हमेशा मेरे मामले में शून्य है। यूआरएल जैसा आपने बताया है (प्रिंसिपल के साथ समाप्त)। मुझे प्रलेखन में मिला, कि अगर प्रतिभागी नहीं मिला है, तो शून्य वापस आ गया है। लेकिन मैंने अपनी पता पुस्तिका और कैलेंडर की जांच की और यह अस्तित्व में है (इसलिए यह पाया जाना चाहिए)।कोई विचार क्यों ABRecordWithAddressBook: शून्य वापस आ जाएगा? – haluzak

+0

@ हलुज़क कोई विचार नहीं, क्षमा करें। यह एपीआई स्पष्ट रूप से भयानक है। मुझे लगता है कि हम अंततः उदाहरण के लिए अनियंत्रित 'ईमेल एड्रेस' चयनकर्ता भेजने पर बस गए। – ierceg

+0

मैंने इसे अंत में समझ लिया, मुझे पता पुस्तिका तक पहुंच नहीं थी, इसलिए आपके द्वारा प्रदान किए गए कोड का उपयोग करने से पहले आपको पहुंच का अनुरोध करना होगा। अन्यथा यह अच्छी तरह से काम किया, धन्यवाद! लेकिन मैं सहमत हूं कि एपीआई भयानक और लगभग अनुपयोगी है। – haluzak

2

श्रेणी:

import Foundation 
import EventKit 
import Contacts 

extension EKParticipant { 
    var email: String? { 
     // Try to get email from inner property 
     if respondsToSelector(Selector("emailAddress")), let email = valueForKey("emailAddress") as? String { 
      return email 
     } 

     // Getting info from description 
     let emailComponents = description.componentsSeparatedByString("email = ") 
     if emailComponents.count > 1 { 
      let email = emailComponents[1].componentsSeparatedByString(";")[0] 
      return email 
     } 

     // Getting email from contact 
     if let contact = (try? CNContactStore().unifiedContactsMatchingPredicate(contactPredicate, keysToFetch: [CNContactEmailAddressesKey]))?.first, 
      let email = contact.emailAddresses.first?.value as? String { 
      return email 
     } 

     // Getting email from URL 
     if let email = URL.resourceSpecifier where !email.hasPrefix("/") { 
      return email 
     } 

     return nil 
    } 
} 
संबंधित मुद्दे