24

所以我被这个难住了。

在 Mac OS X 中,有一种简单的方法可以从内置的地址簿 API 中获取“我”卡(Mac/帐户的所有者)。

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

4

5 回答 5

5

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

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

然后在地址簿中搜索具有该电话号码的卡。

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

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

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

于 2009-05-08T11:48:49.077 回答
3

联系人容器在 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)
  }
}

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

let iOSLegacyIdentifier = contact.value(forKey: "iOSLegacyIdentifier")
于 2021-05-16T13:02:28.867 回答
2

iPhone SDK 2.2.1 及更早版本中没有此类 API。请在以下网址提交请求: http: //bugreport.apple.com

于 2009-05-08T11:19:30.607 回答
2

编辑:[过时的答案]

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

于 2009-05-08T16:56:19.573 回答
-3

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

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

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 新];

 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”之类的名称时才有效电话”,但它为您提供了一个起点

好吧...它为您提供了一系列匹配的项目:) 因此,如果与该阵列有多个联系人,您只需要使用运气并使用第一个或通过多张卡片工作并从每张卡片中获取您需要的东西.

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

于 2017-06-07T13:39:22.463 回答