11

ekevent EKparticipant のメールを取得するには?

EKParticipant クラスにはそのような属性はありません。

参加者のリストを表示するためにネイティブ ios 参加者コントローラーをレンダリングすることは可能ですか?

4

6 に答える 6

10

これと同じ質問があり、今年の WWDC にいたとき、何人かの Apple エンジニアに尋ねましたが、彼らには手がかりがありませんでした。列に並んでいた男性に聞いたところ、次のような答えが返ってきました。

event.organizer.URL.resourceSpecifier

これは、すべての EKParticipant で機能します。説明フィールドはいつでも変更される可能性があるため、使用しないように注意されました。

お役に立てれば!

于 2013-06-20T19:20:02.930 に答える
6

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
    }
}
于 2016-12-21T12:39:06.817 に答える
4

上記の解決策はどれも信頼できません。

  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はコストがかかるため、セッションごとに 1 回だけ実行することをお勧めします。

レコードにアクセスできない場合は、にフォールバックしURL.resourceSpecifierます。

于 2014-09-13T19:25:57.927 に答える
2

別のオプションは、EKParticipant の URL を検索することです。出力は、mailto:xyz@xyz.com のような mailto URI である必要があります。ここにいくつかのまばらなドキュメントがあります:

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

于 2013-03-26T02:16:04.337 に答える
1

プロパティは 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" でメールをプルします

于 2012-12-22T23:30:24.513 に答える
0

Anton Plebanovichの回答に基づいて、Apple が導入したこの構成された問題に対して、この Swift 5 ソリューションを作成しました。

スイフト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
  }
}
于 2020-01-13T08:19:09.533 に答える