我正在尝试使用CNContact.My获取本地化的电话标签值到目前为止:
NSError *error = nil;
CNContactFetchRequest *fetchRequest =[[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];
[addressBook enumerateContactsWithFetchRequest:fetchRequest error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
CNLabeledValue *phoneNumberValue = contact.phoneNumbers.firstObject;
NSString *label = phoneNumberValue.label;
NSLog(@"Phone Label: %@",label); //Logs value like _$!<Home>!$_
CNPhoneNumber *phoneNumber = phoneNumberValue.value;
NSString *phoneNumberString = phoneNumber.stringValue;
NSLog(@"Phone No: %@",phoneNumberString);
}];
Run Code Online (Sandbox Code Playgroud)
问题是手机标签返回原始值,如_$!<Home>!$_
,_$!<Mobile>!$_
.但我需要像Home,Mobile这样的纯文本.有什么办法可以使用Contact框架获取本地化值.我不想使用Addressbook,因为它在iOS 9中已弃用.
我有一个返回格式为电话号码的API:+ 1415xxxxxxx(E164)
现在这些数字被放入UITableView的Cell中并按预期显示,但是我希望能够搜索手机上的用户联系人以查看是否存在匹配 - 如果是这样也会传回名字,姓氏和已知照片.
看看Apple页面(https://developer.apple.com/library/watchos/documentation/Contacts/Reference/Contacts_Framework/index.html)我需要
import ContactsUI
Run Code Online (Sandbox Code Playgroud)
但是我不确定,我是否将contactDB加载到字典中然后进行搜索?我可以通过名称找到很多东西,而不是通过数字搜索:
let predicate = CNContact.predicateForContactsMatchingName("Sam")
Run Code Online (Sandbox Code Playgroud)
我试图找到一个我可以调用的函数,使用PhoneNumber进行搜索并返回FirstName,FamilyName和Image.
func searchForContactUsingNumber(PhoneNumber: String)
{
// Search Via phoneNumber
let store = CNContactStore()
let contacts = try store.unifiedContactsMatchingPredicate(CNContact.predicateForContactsMatchingPhoneNumber(PhoneNumber), keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey,CNContactImageData])
return FirstName, GivenName,UIImage
}
Run Code Online (Sandbox Code Playgroud)
我觉得我正在倒退但不确定前进的方向..任何想法?
我尝试使用Contacts Framework创建和保存组.首先,用户授权应用程序进行联系人访问.提供了一个viewcontroller,并且+按钮用户显示带有textfield的alertview.
用户键入他想要的组名称,然后单击警报视图的按钮(保存).
这是保存新组的代码.组名称可用,但无论如何都无法保存此组:
CNContactStore *contactStore = [CNContactStore new];
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error){
if (granted) {
CNMutableGroup *newGroup = [CNMutableGroup new];
CNSaveRequest *saveRequest = [CNSaveRequest new];
[newGroup setName:groupName];
//when saving to container with identifier nil, we get this error:
//Error Domain=CNErrorDomain Code=2 "(null)" UserInfo={CNInvalidRecords=(
//"<CNMutableGroup: 0x10a059f20: identifier=2F4981B9-8A47-45A4-8841-1FA5A09584A4:ABGroup, name=gghh>"
[saveRequest addGroup:newGroup toContainerWithIdentifier:nil];
[contactStore executeSaveRequest:saveRequest error:&error];
if (error){
//error saving group
//NSLog(@"error message: %@",error);
} else {
//if no errors, reload tableview
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
} …
Run Code Online (Sandbox Code Playgroud) 要求:我将一些联系人与图片一起保存到用户的iPhone中(尺寸与设备相同).我希望每当联系人呼叫该设备时,此图片都会显示在FULLSCREEN上.
注意示例: 当呼叫者被识别为垃圾邮件时,Truecaller iOS应用程序显示为红色图像
代码:这是我用来保存联系人数据的代码.我在用Contacts.framework
CNMutableContact *newContact = [CNMutableContact new];
newContact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"blue_bg.png"]);
newContact.contactType = CNContactTypePerson;
newContact.givenName = user.firstName;
newContact.middleName = user.middleName;
newContact.familyName = user.lastName;
NSArray *numbers = [[NSArray alloc] initWithArray:@[[CNLabeledValue labeledValueWithLabel:@"Main" value:[CNPhoneNumber phoneNumberWithStringValue:user.mobileNumber.stringValue]]]];
newContact.phoneNumbers = numbers;
CNContactStore *store = [CNContactStore new];
CNSaveRequest *saveReq = [CNSaveRequest new];
[saveReq addContact:newContact toContainerWithIdentifier:nil];
NSError *error = nil;
[store executeSaveRequest:saveReq error:&error];
if (error) {
NSLog(@"Contact Save ERROR: %@", error.localizedDescription);
}
Run Code Online (Sandbox Code Playgroud)
当前场景:我在iOS中获取此图像,Contacts App
但当用户在iPhone上调用时,它不会显示.Truecaller是如何做到的?我在这里错过了什么?
在设备上的AddressBook中,我有一条与Facebook联系人记录链接的记录.我用CNContactFetchRequest将它带到CNContact:
contactFetchRequest.mutableObjects = true
contactFetchRequest.unifyResults = false
Run Code Online (Sandbox Code Playgroud)
获得后,我修改它,然后我尝试更新它:
let store = CNContactStore()
let saveRequest = CNSaveRequest()
if contact != nil {
mutableContact = contact!.mutableCopy() as! CNMutableContact
saveRequest.updateContact( mutableContact )
} else {
mutableContact = CNMutableContact()
saveRequest.addContact( mutableContact, toContainerWithIdentifier:nil )
}
// Modify mutableContact
mutableContact.jobTitle = "Worker";
do {
// Will fails with error
try store.executeSaveRequest(saveRequest)
} catch let error as NSError {
BCRLog(error)
self.isFailed = true
} catch {
self.isFailed = true
}
Run Code Online (Sandbox Code Playgroud)
在执行executeSaveRequest时,我发现了一个错误:
NSError with domain:CNErrorDomain,code:500(witch is CNErrorCodePolicyViolation),_ userInfo:{"NSUnderlyingError":{"ABAddressBookErrorDomain" …
我在保存请求后直接需要新创建的联系人的标识符.用例:在我的应用程序中,用户创建一个新联系人并为他们提供一些属性(例如姓名,地址......),之后他可以保存联系人.此方案正如预期的那样工作.我的代码看起来像这样:
func createContact(uiContact: Contact, withImage image:UIImage?, completion: String -> Void)
{
let contactToSave = uiContact.mapToCNContact(CNContact()) as! Cnmutablecontawctlet
if let newImage = image
{
contactToSave.imageData = UIImageJPEGRepresentation(newImage, 1.0)
}
request = CNSaveRequest()
request.addContact(contactToSave, toContainerWithIdentifier: nil)
do
{
try self.contactStore.executeSaveRequest(request)
print("Successfully saved the CNContact")
completion(contactToSave.identifier)
}
catch let error
{
print("CNContact saving faild: \(error)")
completion(nil)
}
}
Run Code Online (Sandbox Code Playgroud)
Contact Object(uiContact)只是CNContact的包装器.在闭包完成时,我需要返回标识符,但此时我无权访问它们,因为他是在写入过程之后由系统创建的.一种解决方案可能是使用谓词获取新保存的CNContact
public func unifiedContactsMatchingPredicate(predicate: NSPredicate, keysToFetch keys: [CNKeyDescriptor]) throws -> [CNContact]
Run Code Online (Sandbox Code Playgroud)
但在我看来,这似乎有点不洁,因为这种接触可能只有一个名称,而且可能存在多个名称.像创建标识符的回调之类的东西会很好.但事实并非如此.还有其他方法可以解决这个问题吗?
我在尝试访问多个设备之间的同一个联系人时遇到了一些问题。我的目标是让用户选择联系人并选择电话号码和电子邮件地址,然后将其存储在数据库中。如果用户在另一台设备上打开应用程序,我希望选择相同的联系人。
我希望在这种情况下使用 CNContact.identifier,但它似乎是设备特定的 id。我可以存储每个设备的标识符,但这需要用户匹配联系人,这并不理想。
这看起来并不困难,但显然我错过了一些东西。想法?
在发布这个问题之前浏览了许多博客、问题和文章。我无法在 Swift 中使用联系人框架更新联系人的电话号码。
let store = CNContactStore()
OperationQueue().addOperation{[store] in
let predicate = CNContact.predicateForContacts(matchingName: "XYZ")
let toFetch = [CNContactPhoneNumbersKey, CNContactGivenNameKey]
do{
let contacts = try store.unifiedContacts(matching: predicate,
keysToFetch: toFetch as [CNKeyDescriptor])
for Contact in contacts{
let XYZ = Contact.mutableCopy() as! CNMutableContact
print("Name: ", XYZ.givenName)
print(XYZ.phoneNumbers.count)
for CNPhoneNumber in XYZ.phoneNumbers{
print("Phone number: ", CNPhoneNumber.value)
var text = CNPhoneNumber.value.stringValue
let matchText = text.starts(with: "011 91")
if(matchText == true){
let start = text.index(text.startIndex, offsetBy: 0);
let end = text.index(text.startIndex, offsetBy: 8);
text.replaceSubrange(start..<end, with: "+91") …
Run Code Online (Sandbox Code Playgroud) 我试图以编程方式在特定时间从地址簿中删除联系人.甚至可以在Swift中使用Apple吗?我已经熟悉了,CNContactStore
因为我已经开始在电话簿中添加联系人了.授予访问联系人等的权限.但我不知道如何以特定时间以编程方式从地址簿(永远)中删除联系人.
任何帮助表示赞赏!
我正在制作一个iOS应用程序,并且在iOS世界中是新手。在这个应用程序中,我想访问用户联系人。一切进展顺利,运作良好。但是我经历了一个惊人的行为,因为我是android开发人员,所以在Android中还从未见过。
在iOS中访问用户联系人,我使用的是Contacts Framework。我认为它比iOS中的其他任何版本都相对容易和快捷。但是,我无法完全利用这一点。让我告诉你我做了什么,我遇到了什么问题。
我在ViewController和User上请求权限的过程是通过Dialog询问联系人权限的提示。如果用户允许许可,一切都会顺利进行,但是当用户不允许许可时,就会出现麻烦。
访问用户联系人更为必要,因为我的应用程序的整个工作和基本业务构想都取决于用户联系人。现在要处理这个问题,当用户不允许权限时,我将显示另一个对话框,告诉他必须允许权限,以便App可以继续进行。
现在,我将用户带到他可以允许该权限的设置,或者他可以简单地再次返回。现在结账2件
情况1:当用户进入“设置”屏幕并在未经允许的情况下再次返回时,当我将用户带到“设置”屏幕时,除了允许其返回我的应用程序外,我尝试再次向他显示相同的对话框,以在每种情况下均允许其访问权限。一切顺利。我的意思是出于测试目的,我多次重复相同的步骤,我的意思是我不允许自己的“联系人”权限,这需要我进行设置,从设置屏幕返回到我的应用程序,然后我又能看到与我相同的对话框设置屏幕。这可以
情况2:当用户进入设置屏幕并且他允许该权限时:在这里,当用户允许该权限时,我在日志中收到消息“来自调试器的消息:由于信号9而终止”。当我回到我的应用程序时,它又重新开始了。看来我的应用程序重新打开或在后台崩溃。
重要说明:为此,我检查了我的记忆或任务在后台执行的所有操作,但后台没有任何操作。崩溃前我的内存大小为54.78 mb。而且我不认为这值得担心。
有人知道发生了什么吗?
我正在尝试构建一个应用程序,用于从用户联系人中获取联系人列表,并在应用程序的自定义UI中呈现它.我想支持iOS 8和iOS9但问题是在iOS9中不推荐使用AddressBook框架的方法,而Contacts Framework不支持iOS 8.0.有没有办法可以同时支持8和9?
提前致谢!
ios ×9
swift ×6
cncontact ×4
ios9 ×3
addressbook ×1
cocoa-touch ×1
contacts ×1
ios8 ×1
iphone ×1
objective-c ×1
xcode ×1