11

如何获取 ekevent EKparticipant 电子邮件?

EKParticipant 类没有这样的属性。

是否可以渲染原生 ios 参与者控制器以显示参与者列表?

4

6 回答 6

10

我也有同样的问题,今年在 WWDC 时,我问了几位苹果工程师,他们都不知道。我问了我在排队时遇到的一个人,他得到了答案:

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成本很高,因此您可能希望每个会话只调用一次。

如果您无法访问记录,请重新使用URL.resourceSpecifier.

于 2014-09-13T19:25:57.927 回答
2

另一种选择可能是查找 EKParticipant 的 URL。输出应该是 mailto URI,例如 mailto:xyz@xyz.com。这里有一些稀疏的文档:

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 通过 key @"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 回答