所以我对这个感到难过。
在Mac OS X中,可以通过内置的地址簿API轻松获取“我”卡(Mac /帐户的所有者)。
有没有人找到方法找出哪个联系人(如果存在)属于iPhone的所有者?
答案 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'但它给你一个起点
好吧......它为你提供了一系列匹配的项目:)所以,如果有一个以上的联系人,你只需要使用锅运气和第一个或通过多张卡工作,并采取你的需要每个人。我确实说它是一个部分解决方案,即使它不适用于所有用户案例,您可能会发现它适用于您的许多用户并减少一点摩擦