我对这个问题感到困惑。
在 Mac OS X 中,有一种简单的方法可以从内置地址簿 API 中获取“我的”名片(Mac/账户的所有者)。
有没有人找到了一种方法来确定哪个联系人(如果存在)属于 iPhone 的所有者?
我对这个问题感到困惑。
在 Mac OS X 中,有一种简单的方法可以从内置地址簿 API 中获取“我的”名片(Mac/账户的所有者)。
有没有人找到了一种方法来确定哪个联系人(如果存在)属于 iPhone 的所有者?
[[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"];
iOS上的联系人容器有一个名为 "me identifier" 的属性,可以使用 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)
}
}
这个标识符是在旧的AddressBook框架中使用的遗留标识符。您仍然可以在CNContact中访问它:
let iOSLegacyIdentifier = contact.value(forKey: "iOSLegacyIdentifier")
在iPhone SDK 2.2.1及更早版本中没有此API。请到以下网址提交请求: http://bugreport.apple.com
编辑:[过时的答案]
获取“我”卡片的API不存在,因为不存在“我”卡片。iPhone的联系人应用程序无法将卡片标记为“我”,而API也反映了这一点。
NSString *ownerName = [[UIDevice currentDevice] name];
在英语中,设备最初被称为,例如,“乔·布洛格的 iPhone”
然后分离出名称
NSRange t = [ownerName rangeOfString:@"’s"];
if (t.location != NSNotFound) {
ownerName = [ownerName substringToIndex:t.location];
}
NSPredicate *usersNamePredicate = [CNContact predicateForContactsMatchingName:usersName];
NSArray * keysToFetch = @[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNContactSocialProfilesKey, ];
NSArray * matchingContacts = [contactStore unifiedContactsMatchingPredicate:usersNamePredicate keysToFetch:keysToFetch error:nil];
当然,其他语言的设备名称字符串不同,例如“Johann Schmidt的iPhone”,因此需要进行更多的解析以适应其他语言,并且仅在用户未将设备名称更改为iTunes中的“Joes phone”之类的内容时才有效,但它为您提供了一个起点
好吧...它为您提供了一组匹配项 :) 因此,如果有多个联系人与该数组匹配,则只需使用随机选择并选择第一个或处理多个名片并从每个名片中获取所需内容。
我确实说过这是部分解决方案,即使它不能适用于所有用户情况,您可能会发现它适用于许多用户并减少了一些摩擦