ekevent EKparticipant のメールを取得するには?
EKParticipant クラスにはそのような属性はありません。
参加者のリストを表示するためにネイティブ ios 参加者コントローラーをレンダリングすることは可能ですか?
ekevent EKparticipant のメールを取得するには?
EKParticipant クラスにはそのような属性はありません。
参加者のリストを表示するためにネイティブ ios 参加者コントローラーをレンダリングすることは可能ですか?
これと同じ質問があり、今年の WWDC にいたとき、何人かの Apple エンジニアに尋ねましたが、彼らには手がかりがありませんでした。列に並んでいた男性に聞いたところ、次のような答えが返ってきました。
event.organizer.URL.resourceSpecifier
これは、すべての EKParticipant で機能します。説明フィールドはいつでも変更される可能性があるため、使用しないように注意されました。
お役に立てれば!
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
}
}
上記の解決策はどれも信頼できません。
URL
のようなものかもしれませんが/xyzxyzxyzxyz.../principal
、明らかにそれは電子メールではありません。EKParticipant:description
変更される可能性があり、電子メールが含まれなくなります。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
はコストがかかるため、セッションごとに 1 回だけ実行することをお勧めします。
レコードにアクセスできない場合は、にフォールバックしURL.resourceSpecifier
ます。
別のオプションは、EKParticipant の URL を検索することです。出力は、mailto:xyz@xyz.com のような mailto URI である必要があります。ここにいくつかのまばらなドキュメントがあります:
プロパティは API バージョン 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 = hung@sampleemail.com; isSelf = 0}
上記の文字列を NSDictionary に解析し、キー @"email" でメールをプルします
Anton Plebanovichの回答に基づいて、Apple が導入したこの構成された問題に対して、この Swift 5 ソリューションを作成しました。
private let emailSelector = "emailAddress"
extension EKParticipant {
var email: String? {
if responds(to: Selector(emailSelector)) {
return value(forKey: emailSelector) as? String
}
let emailComponents = description.components(separatedBy: "email = ")
if emailComponents.count > 1 {
return emailComponents[1].components(separatedBy: ";")[0]
}
if let email = (url as NSURL).resourceSpecifier, !email.hasPrefix("/") {
return email
}
return nil
}
}