我使用新的 CNContactPickerViewController 从地址簿中选择联系人并在我的应用程序中使用它们。
当我按下按钮时,我调用此代码:
let contactPicker = CNContactPickerViewController()
contactPicker.delegate = self
contactPicker.predicateForEnablingContact = NSPredicate(format: "emailAddresses.@count > 0")
presentViewController(contactPicker, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
我使用以下 CNContactPickerDelegate 方法来选择多个联系人:
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) {
selectedRecipients = contacts.map { $0.emailAddresses.first!.value as! String }
tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
这有助于我填充一个名为“selectedRecipients”的数组(基本上是一组 emailAddresses 字符串)
这工作正常。但是,如果我之前选择了联系人,我希望contactPicker在初始化时预先选择联系人,即在出现时将联系人显示为已选择。有没有办法做到这一点?
谢谢
我似乎无法弄清楚如何从联系人那里获取用户"我的卡".我正在使用swift开发本机Mac应用程序.
如何实现与iOS Apple Maps中相同的联系人选择器?
从图片中可以看到,在“地图”应用中,您可以在收藏夹位置和联系人之间切换。我想在选择器和一些自定义表格之间进行切换,而无需关闭动画,并使用像这样的通用控件UISegmentedControl。
我没有提出CNContactPickerViewController或实施问题UISegmentedControl。我在将工具栏添加到时遇到问题CNContactPickerViewController。
我试图将其推入我的尝试UINavigationController并没有成功。
我尝试添加UIToolbar但CNContactPickerViewController
没有添加UINavigationController。
我也尝试将其添加到子视图中, childViewControllers
CNContactPickerViewController的实例无法推入堆栈。
任何建议表示赞赏:)
知道为什么有些人CNContacts回来时电话号码是空的吗?
我不断得到这样的输出:
"phoneNumbers=(not fetched), emailAddresses=(not fetched),"
Run Code Online (Sandbox Code Playgroud)
例如,当我从模拟器的内置联系人应用程序中获取联系人时,我会得到混合结果:
"John Appleseed" 确实返回了电话号码,但"Kate Bell"没有返回- 尽管她显然有电话号码。这很奇怪,因为我肯定CNContactPhoneNumbersKey在我的获取请求中使用。
这是我的代码:
let fetchKeys = [ CNContactEmailAddressesKey, CNContactPhoneNumbersKey,
CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName) ]
let contactFetchRequest = CNContactFetchRequest(keysToFetch: fetchKeys)
do {
try self.contactsStore.enumerateContactsWithFetchRequest(contactFetchRequest) {
fetchedContact, stop in
print("fetched Contact is: \n\(fetchedContact.description)")
}
}
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,输出显示有时获取的联系人会返回电话号码,有时则不会。电子邮件也是如此:有时会被退回,有时不会。
这种情况在模拟器中以及当我在 iPhone 上运行时都会发生。
知道这里会发生什么吗?
CNContact 是否有任何 icloud 标识符可以跨设备保留和重用?
这个想法是能够从不同的 iOS 设备再次拉出 CNContact。
文档对此没有任何说明。我知道以前的 ABAddressbook 框架也没有,但我希望苹果可以为此做点什么。
使用UIActivityViewController将.vcf共享给WhatsApp失败,显示插件net.whatsapp.WhatsApp.ShareExtension失效错误
共享图像或文本正在使用UIActivityViewController工作,但共享.vcf不适用于whatsapp(适用于邮件/消息/信使等).
NSData *pVcfData = [CNContactVCardSerialization dataWithContacts:[NSArray arrayWithObject:pContact] error:&pError]; // creating contact data from CNContactVCardSerialization
NSURL *pFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:pFileNameWithAllowedCharacters]]; // wrote the data to file
NSError *pWriteError = nil;
if ([pVcfData writeToURL:pFileURL options:NSDataWritingAtomic error:&pWriteError])
{
NSArray *pActivityItems = @[pFileURL]; // passed the file URL as ActivityItem for UIActivityViewController
UIActivityViewController *pActivityVC = [[UIActivityViewController alloc] initWithActivityItems:pActivityItems applicationActivities:nil];
[pActivityVC setValue:pContactName forKey:@"subject"];
[self presentViewController:pActivityVC animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
除了.vcf之外,还有其他方法可以与whatsapp共享联系吗?请分享任何建议.
我想以编程方式将一个联系人链接到第二个联系人...
我已通过手机链接它,但找不到任何代码。
var store = CNContactStore()
let contact = try store.unifiedContact(withIdentifier: contactIdentifier, keysToFetch:keysToFetch as! [CNKeyDescriptor])
let contactToUpdate = contact.mutableCopy() as! CNMutableContact
/* edit or append contact information */
let saveRequest = CNSaveRequest()
saveRequest.update(contactToUpdate)
try store.execute(saveRequest)
Run Code Online (Sandbox Code Playgroud)
我正在使用 Native CNContactViewController 添加联系人,一旦保存了联系人,它就会返回带有“:ABPerson”后缀的联系人标识符,当我在联系人列表中交叉检查时,同一联系人会显示不同的标识符。
有谁知道如何获取实际的联系人标识符?
创建代码:
- (IBAction)didSelectedAddContact:(id)sender {
CNMutableContact *contact = [CNMutableContact new];
CNContactViewController *contactController = [CNContactViewController viewControllerForNewContact:contact];
NSLog(@"contact id : %@", contact.identifier);
contactController.allowsEditing = true;
contactController.allowsActions = true;
contactController.delegate = self;
[self.navigationController pushViewController:contactController animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
委托回调:
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact{
_contact = contact;
[viewController.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
下面的函数返回 nil:
- (CNContact*) getContactFromStoreForIdentifier:(NSString*) identifier
{
CNContact *updatedContact = nil;
id descriptor = [CNContactViewController descriptorForRequiredKeys];
CNContactStore *store = [CNContactStore new];
NSError *error;
updatedContact = [store unifiedContactWithIdentifier:identifier
keysToFetch:@[descriptor]
error:&error];
// …Run Code Online (Sandbox Code Playgroud) There are many possible variants of this question, but take as an example the CNAuthorizationStatus returned by CNContactStore.authorizationStatus(for: .contacts), which can be notDetermined, restricted, denied, or authorized. My goal is to always show the current authorization status in my app's UI.
To expose this to SwiftUI, I might make an ObservableObject called ModelData with a contacts property:
final class ModelData: ObservableObject {
@Published var contacts = Contacts.shared
}
Run Code Online (Sandbox Code Playgroud)
Where contacts contains my contact-specific model code, …
我想将数据存储在属于 的一部分的联系人存储中CNContact。是否有一个属性NSObject或我可以存储数据结构或对象CNContact的内容?NSDate我希望能够跟上CNContact上次修改 a 的时间。
我还没有找到苹果公司给我们提供的任何具体方法来做到这一点。我不想将修改日期保存在UserDefaultsCloudKit 或 Core Data 或任何其他持久数据方式中。我不想使用 的 Note 属性CNContact,因为用户可以更改它。的dates实例属性CNContact仅是 get ,我还没有找到任何使用该属性来做我想做的事情的方法。
另一种方法是比较哈希值或使用or运算符isEqual的方法。那行得通吗?CNContact=====