jak uzyskać ekevent EKparticipant e-mail?jak uzyskać ekevent EKparticipant e-mail?
Klasa EKParticipant nie ma takiego atrybutu.
Czy można wyrenderować kontroler natywnego kontrolera ios, aby wyświetlić listę uczestników?
jak uzyskać ekevent EKparticipant e-mail?jak uzyskać ekevent EKparticipant e-mail?
Klasa EKParticipant nie ma takiego atrybutu.
Czy można wyrenderować kontroler natywnego kontrolera ios, aby wyświetlić listę uczestników?
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!
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”
Inną opcją może być patrzeć URL EKParticipant użytkownika. Dane wyjściowe powinny być identyfikatorem URI mailto, takim jak mailto: [email protected] Jest jakiś rzadki dokumentacja tutaj:
Żadne z powyższych rozwiązań nie są wiarygodne:
URL
może być coś podobnego /xyzxyzxyzxyz.../principal
i oczywiście, że nie jest to e-mail.EKParticipant:description
może ulec zmianie i nie zawierać już wiadomości e-mail.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
.
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
@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
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
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
}
}
najlepszym rozwiązaniem – Rakesh
To nie działa, gdy EKParticipant jest głównym (iOS 7.1) – ierceg
To powinno być 'participant.URL.resourceSpecifier', ale nie tylko' nieruchomość organizer' w EKEvent, na przykład 'attendees' property – likid1412