有没有办法从iPhone地址簿API获取“我”卡?

时间:2009-05-07 18:13:19

标签: iphone objective-c cocoa cocoa-touch addressbook

所以我对这个感到难过。

在Mac OS X中,可以通过内置的地址簿API轻松获取“我”卡(Mac /帐户的所有者)。

有没有人找到方法找出哪个联系人(如果存在)属于iPhone的所有者?

5 个答案:

答案 0 :(得分:7)

您可以使用未记录的用户默认值:

[[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"];

然后使用该电话号码在地址簿中搜索该卡。

请记住,由于用户默认值未记录,Apple可能随时更改,您可能无法进入App Store。

您可以采用的另一种方法是查看设备名称,尽管它更脆弱。如果用户没有从默认的“用户名的iPhone”更改它并且他们使用他们的真实姓名作为iPhone,您可以从中获取用户名。同样,不是任何方式的最佳解决方案,但它确实给你一些其他尝试。

这个问题的普遍接受的答案是向Apple提交Radar与此功能,并提示用户选择他们的卡。

答案 1 :(得分:4)

iPhone SDK 2.2.1及更早版本中没有此类API。请在http://bugreport.apple.com

提交申请

答案 2 :(得分:4)

编辑:[过时回答]

没有用于获取“我”卡的API,因为没有“我”卡。 iPhone的联系人应用程序无法将卡片标记为“我”,并且API反映了这一点。

答案 3 :(得分:2)

联系人容器在 iOS 上有一个 me 标识符属性,可以使用 container.value(forKey: "meIdentifier")

访问
if let containers = try? CNContactStore().containers(matching: nil) {
  containers.forEach { container in
  if let meIdentifier = container.value(forKey: "meIdentifier") as? String {
    print("Contacts:", "meIdentifier", meIdentifier)
  }
}

标识符是旧地址簿框架中使用的旧标识符。您仍然可以在 CNCContact 中访问它:

let iOSLegacyIdentifier = contact.value(forKey: "iOSLegacyIdentifier")

答案 4 :(得分:0)

我想出了一个部分解决方案

您可以按如下方式获取设备名称

NSString *ownerName = [[UIDevice currentDevice] name];
用英语

最初调用一个设备,例如,Joe Blogg的iPhone'

突破名称

 NSRange t = [ownerName rangeOfString:@"’s"];
    if (t.location != NSNotFound) {
        ownerName = [ownerName substringToIndex:t.location];
    }

然后您可以使用该名称并搜索联系人

CNContactStore * contactStore = [CNContactStore new];

 NSPredicate *usersNamePredicate = [CNContact predicateForContactsMatchingName:usersName];

    NSArray * keysToFetch = @[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNContactSocialProfilesKey, ];

 NSArray * matchingContacts = [contactStore unifiedContactsMatchingPredicate:usersNamePredicate keysToFetch:keysToFetch error:nil];

当然,其他语言在设备名称字符串中有所不同,例如' iPhone Von Johann Schmidt'因此,需要对其他语言进行更多的解析,并且只有在用户没有将iTunes中设备的名称更改为" Joes phone'但它给你一个起点

好吧......它为你提供了一系列匹配的项目:)所以,如果有一个以上的联系人,你只需要使用锅运气和第一个或通过多张卡工作,并采取你的需要每个人。

我确实说它是一个部分解决方案,即使它不适用于所有用户案例,您可能会发现它适用于您的许多用户并减少一点摩擦

相关问题