我知道ios swift有一个Contacts Framework,我可以在其中获取联系人,但我找不到任何方法来获取所有联系人,我可以访问该数组中的每个联系人.获取联系人的所有方法似乎都需要某种条件.有什么方法可以将所有联系人聚集在一起吗?
谢谢
我尝试CNContactPickerViewController使用该UIViewControllerRepresentable协议在 SwiftUI 应用程序内部呈现。正如我已经阅读的那样,似乎有一个已知问题无法正常工作,但我使用此处描述的解决方法使其正常工作。
但是,每当CNContactPickerViewController出现或取消响应时,我的输出日志中都会出现以下错误:
[PPT] 创建与 PPT 通信所需的 CFMessagePort 时出错。
我试图找到对此的解释,但似乎互联网上的任何地方都没有答案。有人知道这个错误来自哪里,PPT是什么?此错误CNContactPickerViewController是否与 SwiftUI 无法正常工作有关?
我第一次在 iOS 14 beta 和 Xcode 12 beta 中注意到这个错误,它仍然存在于 iOS 14.2 和 Xcode 12.2。我不知道错误是否也出现在 iOS 13 上。
我已经发布了关于此的反馈报告。
[似乎在iOS 10中修复!]因此以下内容仅适用于iOS 9 ...
我一直在试验Apple新的Contacts框架,我发现CNContactViewController的三种形式之一存在一个巨大的错误.它破坏了周围的界面,使你的应用变得无用; 用户卡住了.
为了使这个bug易于查看,我在https://github.com/mattneub/CNContactViewControllerBug上发布了一个示例项目.
要进行实验,请运行该项目并执行以下步骤:
点击按钮(未知人员).
如果请求,授予访问权
您将在我们的导航界面中显示部分联系人(请注意顶部的"返回"按钮).
点按添加到现有联系人.出现联系人选择器.
点按取消.实际上你从这里做什么并不重要,但点击取消是最简单的,也是达到错误的最快方法.
我们现在回到部分联系,但导航界面已经消失.用户无法从此界面中退出.该应用程序被软管.
只是为了澄清,以下是您需要采取的步骤的屏幕截图:
点按添加到现有联系人即可查看:
点按取消即可看到此内容; 观察它与第一个屏幕截图相同,但导航栏消失了:
我已经尝试了很多方法来解决这个bug,但似乎没办法.据我所知,此窗口由"进程外"框架呈现,不属于您的应用程序.你无法摆脱它.
那么问题是什么?我猜是这样的:任何人都可以告诉我一种方法来使这个视图控制器(在这种形式下)可用吗?有没有找到的解决方法?
编辑此错误出现在iOS 9.0中,仍然存在于iOS 9.1中.在评论中,@ ServgeSkopus报告说切换到已弃用的通讯簿框架没有帮助; bug在某处的底层结构中.
我可以观察CNContactStoreDidChangeNotification应用程序处于后台状态时更改联系人数据库的时间.我很确定只添加了一个观察者NSNotificationCenter.NSNotificationCenter即使我只添加一个新联系人,问题是发布多次(2,3,5甚至更多次).问题出在哪儿?
我正在将已弃用的通讯簿框架中的应用程序迁移到新的"联系人框架".该应用程序使用ABAddressBookRegisterExternalChangeCallback时,另一个应用程序更改联系人通知.
我无法在Contacts Framework中找到相同的功能.苹果文件说,将使用与默认通知中心的CNContactStoreDidChangeNotification通知:
在另一个更改发生时发布通知
CNContactStore.
根据Apple的建议,我的代码如下:
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "contactsChanged:",
name: CNContactStoreDidChangeNotification,
object: nil)
Run Code Online (Sandbox Code Playgroud)
但是,我发现这种方法存在两个问题:
如果我在我的应用程序中进行更改时记录通知的调试描述,我会得到如下内容:
NSConcreteNotification 0x7d3370e0 {name = CNContactStoreDidChangeNotification; userInfo = {
CNNotificationOriginationExternally = 1;
CNNotificationSourcesKey = (
);
}}
Run Code Online (Sandbox Code Playgroud)
如果更改是在外部进行的:
NSConcreteNotification 0x7bf7a690 {name = CNContactStoreDidChangeNotification; userInfo = {
CNNotificationOriginationExternally = 1;
CNNotificationSourcesKey = (
);
}}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,没有什么明显可以区分它们.
任何人都可以告诉我如何从联系人框架中获得相同的行为,因为人们可以得到ABAddressBookRegisterExternalChangeCallback?
我的iOS应用程序会不时检查联系人并将新内容导入到自己的数据库中.
我通过identifier字段检查该联系人是否已存在,通常由UUID填充:
CNContactStore *store = [CNContactStore new];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *keys = @[CNContactNamePrefixKey,
CNContactGivenNameKey,
CNContactMiddleNameKey,
CNContactFamilyNameKey,
CNContactInstantMessageAddressesKey];
NSString *containerId = store.defaultContainerIdentifier;
NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];
NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&err];
for (CNContact *contact in cnContacts) {
...
NSString *contactId = [contact identifier];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"uuid == %@", contactId]];
...
}
Run Code Online (Sandbox Code Playgroud)
有时标识符除了UUID包含:ABPerson字符串(例如9326A125-3C0A-494F-9E50-BBFCF1140EF0:ABPerson),并且此类联系仅出现一次.下次出现相同的联系,但与另一个UUID和没有:ABPerson.
因此,我的联系人导入器认为他们是2个不同的联系人并保存2次.
:ABPersonCNContact标识符中的字符串是什么?
我知道带有类的AddressBook框架ABPerson,但是我使用Contacts框架来处理设备联系人,为什么会:ABPerson …
我已经CNContactPickerViewController使用内置iOS CNContactPickerDelegate来获取联系号码,
在CNContactPickerViewController屏幕中,当我点击顶部的搜索字段并搜索名称时,我需要将该名称添加到我的选择中,但在点击联系人后没有任何反应.
我到处搜索,并找到任何解决方案
我是否需要在代码中添加任何内容,或者是iOS 9错误
@IBAction func AddBtnKlkFnc(sender: AnyObject)
{
let contactPicker = CNContactPickerViewController()
contactPicker.delegate = self
contactPicker.displayedPropertyKeys =
[CNContactPhoneNumbersKey]
self.presentViewController(contactPicker, animated: true, completion: nil)
}
func contactPicker(picker: CNContactPickerViewController, didSelectContacts ContctAryVar: [CNContact])
{
for ContctVar in ContctAryVar
{
let ContctDtlVar = ContctDtlCls()
ContctDtlVar.ManNamVar = CNContactFormatter.stringFromContact(ContctVar, style: .FullName)!
for ContctNumVar: CNLabeledValue in ContctVar.phoneNumbers
{
var MobNumVar = ((ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String)!
if(MobNumVar.Len() > 10)
{
MobNumVar = MobNumVar.GetLstSubSrgFnc(10)
}
ContctDtlVar.MobNumVar = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新格式化联系人的姓名CNContactFormatter.看起来,我没有获取联系人所需的所有名称属性.
Terminating app due to uncaught exception 'CNPropertyNotFetchedException', reason: 'A property was not requested when contact was fetched.'
Run Code Online (Sandbox Code Playgroud)
有谁知道哪些是必需的?我尝试在其他几个人中抓住以下内容而没有运气:
CNContactNamePrefixKey,
CNContactGivenNameKey,
CNContactFamilyNameKey,
CNContactMiddleNameKey,
CNContactPreviousFamilyNameKey,
CNContactNameSuffixKey,
CNContactNicknameKey,
CNContactPhoneticGivenNameKey,
CNContactPhoneticMiddleNameKey,
CNContactPhoneticFamilyNameKey,
CNContactOrganizationNameKey,
CNContactDepartmentNameKey,
CNContactJobTitleKey,
Run Code Online (Sandbox Code Playgroud)
无论是CNContactFomatter类参考,也没有取出方法的文档提供任何线索.
谢谢!
很快..我有这个代码添加新的联系人,它一直工作,直到我的代码转换为Swift 3,现在它接受所有属性,除了电子邮件我得到两个错误:
1-Argument类型'String?' 不符合预期类型'NSCopying'
2-Argument类型'String?' 不符合预期类型'NSSecureCoding'
当我尝试向联系人添加电子邮件时,这是我的代码:
let workEmail = CNLabeledValue(label:"Work Email", value:emp.getEmail())
contact.emailAddresses = [workEmail]
Run Code Online (Sandbox Code Playgroud)
任何帮助?
我想在我的应用程序的iOS移动联系人中添加一个自定义隐藏字段.
是否可以在iOS移动联系人中添加具有价值的新隐藏字段?CNMutableContact是否允许我添加新的自定义属性?
cncontact ×10
ios ×8
swift ×6
ios9 ×2
contacts ×1
formatting ×1
objective-c ×1
search ×1
swift2 ×1
swiftui ×1