标签: contacts-framework

使用"联系人"框架获取本地化的电话标签

我正在尝试使用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中已弃用.

ios cncontact cncontactstore contacts-framework

10
推荐指数
2
解决办法
2490
查看次数

Swift使用Contacts Framework,使用电话号码搜索以获取名称和用户图像

我有一个返回格式为电话号码的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)

我觉得我正在倒退但不确定前进的方向..任何想法?

ios swift cncontact contacts-framework

10
推荐指数
1
解决办法
2万
查看次数

使用联系人框架创建新组,CNErrorDomain Code = 2

我尝试使用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)

ios ios9 cncontact cncontactstore contacts-framework

7
推荐指数
1
解决办法
1803
查看次数

将图像保存为联系人图片,并在来电时显示

要求:我将一些联系人与图片一起保存到用户的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是如何做到的?我在这里错过了什么?

iphone objective-c ios contacts-framework

7
推荐指数
1
解决办法
1178
查看次数

IOS9联系人框架无法更新链接的联系人

在设备上的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" …

cocoa-touch ios ios9 contacts-framework

5
推荐指数
1
解决办法
507
查看次数

iOS9 Contacts Framework从新保存的联系人获取标识符

我在保存请求后直接需要新创建的联系人的标识符.用例:在我的应用程序中,用户创建一个新联系人并为他们提供一些属性(例如姓名,地址......),之后他可以保存联系人.此方案正如预期的那样工作.我的代码看起来像这样:

    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)

但在我看来,这似乎有点不洁,因为这种接触可能只有一个名称,而且可能存在多个名称.像创建标识符的回调之类的东西会很好.但事实并非如此.还有其他方法可以解决这个问题吗?

ios swift cncontact cncontactstore contacts-framework

5
推荐指数
1
解决办法
838
查看次数

CNContact 设备之间的唯一 ID

我在尝试访问多个设备之间的同一个联系人时遇到了一些问题。我的目标是让用户选择联系人并选择电话号码和电子邮件地址,然后将其存储在数据库中。如果用户在另一台设备上打开应用程序,我希望选择相同的联系人。

我希望在这种情况下使用 CNContact.identifier,但它似乎是设备特定的 id。我可以存储每个设备的标识符,但这需要用户匹配联系人,这并不理想。

这看起来并不困难,但显然我错过了一些东西。想法?

contacts ios swift contacts-framework

5
推荐指数
1
解决办法
557
查看次数

无法在 Swift 中更新联系人的电话号码

在发布这个问题之前浏览了许多博客、问题和文章。我无法在 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 contacts-framework

5
推荐指数
1
解决办法
1032
查看次数

以编程方式在swift中的特定时间删除地址簿中的联系人

我试图以编程方式在特定时间从地址簿中删除联系人.甚至可以在Swift中使用Apple吗?我已经熟悉了,CNContactStore因为我已经开始在电话簿中添加联系人了.授予访问联系人等的权限.但我不知道如何以特定时间以编程方式从地址簿(永远)中删除联系人.

任何帮助表示赞赏!

ios swift contacts-framework

4
推荐指数
1
解决办法
3778
查看次数

iOS因信号9终止而被终止

我正在制作一个iOS应用程序,并且在iOS世界中是新手。在这个应用程序中,我想访问用户联系人。一切进展顺利,运作良好。但是我经历了一个惊人的行为,因为我是android开发人员,所以在Android中还从未见过。

在iOS中访问用户联系人,我使用的是Contacts Framework。我认为它比iOS中的其他任何版本都相对容易和快捷。但是,我无法完全利用这一点。让我告诉你我做了什么,我遇到了什么问题。

在ViewController和User上请求权限的过程是通过Dialog询问联系人权限的提示。如果用户允许许可,一切都会顺利进行,但是当用户不允许许可时,就会出现麻烦。

访问用户联系人更为必要,因为我的应用程序的整个工作和基本业务构想都取决于用户联系人。现在要处理这个问题,当用户不允许权限时,我将显示另一个对话框,告诉他必须允许权限,以便App可以继续进行。

现在,我将用户带到他可以允许该权限的设置,或者他可以简单地再次返回。现在结账2件

情况1:当用户进入“设置”屏幕并在未经允许的情况下再次返回时,当我将用户带到“设置”屏幕时,除了允许其返回我的应用程序外,我尝试再次向他显示相同的对话框,以在每种情况下均允许其访问权限。一切顺利。我的意思是出于测试目的,我多次重复相同的步骤,我的意思是我不允许自己的“联系人”权限,这需要我进行设置,从设置屏幕返回到我的应用程序,然后我又能看到与我相同的对话框设置屏幕。这可以

情况2:当用户进入设置屏幕并且他允许该权限时:在这里,当用户允许该权限时,我在日志中收到消息“来自调试器的消息:由于信号9而终止”。当我回到我的应用程序时,它又重新开始了。看来我的应用程序重新打开或在后台崩溃。

重要说明:为此,我检查了我的记忆或任务在后台执行的所有操作,但后台没有任何操作。崩溃前我的内存大小为54.78 mb。而且我不认为这值得担心。

有人知道发生了什么吗?

xcode ios swift contacts-framework

4
推荐指数
2
解决办法
1705
查看次数

iOS 8.0和9.0中的AddressBook和Contacts框架

我正在尝试构建一个应用程序,用于从用户联系人中获取联系人列表,并在应用程序的自定义UI中呈现它.我想支持iOS 8和iOS9但问题是在iOS9中不推荐使用AddressBook框架的方法,而Contacts Framework不支持iOS 8.0.有没有办法可以同时支持8和9?

提前致谢!

addressbook ios8 ios9 contacts-framework

3
推荐指数
1
解决办法
3223
查看次数