2012-11-30 3 views

Odpowiedz

9

miałem to samo pytanie i kiedy byłem na WWDC w tym roku, poprosiłem kilku inżynierów Apple i nie mieli pojęcia. Zapytałem faceta, którego spotkałem w kolejce i on miał odpowiedź:

event.organizer.URL.resourceSpecifier 

Działa to dla każdego uczestnika EKP. Zostałem ostrzeżony, aby NIE używać pola opisu, ponieważ może się ono zmienić w dowolnym momencie.

Mam nadzieję, że to pomoże!

+0

najlepszym rozwiązaniem – Rakesh

+1

To nie działa, gdy EKParticipant jest głównym (iOS 7.1) – ierceg

+0

To powinno być 'participant.URL.resourceSpecifier', ale nie tylko' nieruchomość organizer' w EKEvent, na przykład 'attendees' property – likid1412

1

Właściwość nie jest widoczna dla wersji 6.0 interfejsu API - sam szukam odpowiedzi i nie znalazłem żadnej innej pracy poza parsowaniem adresu e-mail z opisu obiektu. Przykład:

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} 

Przetwarza powyższy ciąg na NSDictionary wyciągnąć email kluczem @ „Wyślij”

3

Żadne z powyższych rozwiązań nie są wiarygodne:

  1. URL może być coś podobnego /xyzxyzxyzxyz.../principal i oczywiście, że nie jest to e-mail.
  2. EKParticipant:description może ulec zmianie i nie zawierać już wiadomości e-mail.
  3. Możesz wysłać selektor emailAddress do instancji, ale jest to nieudokumentowane, może się zmienić w przyszłości, a w międzyczasie może zostać odrzucona.

Na koniec należy użyć EKPrincipal:ABRecordWithAddressBook, a następnie wyodrębnić z niego pocztę. Tak:

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); 
    } 
} 

Zauważ, że wywołanie ABAddressBookCreateWithOptions jest drogie, więc warto to zrobić tylko raz na sesję.

Jeśli nie możesz uzyskać dostępu do rekordu, a następnie powróć do URL.resourceSpecifier.

+0

Hi! Próbowałem użyć twojego kodu, ale zmienna rekordowa jest zawsze zerowa w moim przypadku. Adres URL jest taki, jak wspomniano (kończąc na zleceniodawcy). Znalazłem w dokumentacji, że jeśli uczestnik nie zostanie znaleziony, to zwracane jest zero. Ale sprawdziłem swoją książkę adresową i kalendarz i istnieje (więc powinno zostać znalezione).Każdy pomysł dlaczego ABRecordWithAddressBook: zwróci zero? – haluzak

+0

@haluzak Nie mam pojęcia, przepraszam. Ten interfejs API jest naprawdę okropny. Myślę, że w końcu zdecydowaliśmy się na wysłanie nieudokumentowanego selektora 'emailAddress' do instancji. – ierceg

+0

Wyliczyłem to w końcu, nie miałem dostępu do książki adresowej, więc musisz poprosić o dostęp, zanim użyjesz podanego kodu. W przeciwnym razie działało dobrze, dzięki! Ale zgadzam się, że interfejs API jest okropny i prawie bezużyteczny. – haluzak

2

Kategoria dla EKParticipant:

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 
    } 
}