美文网首页
iOS 通讯录的访问

iOS 通讯录的访问

作者: 秋叶红90 | 来源:发表于2021-03-22 17:32 被阅读0次

导入框架Contacts

import Contacts

权限判断

    /// 加载通讯录
    func requestContact(currentVC:UIViewController){
        
        let status  = CNContactStore.authorizationStatus(for: .contacts)
        var success:(()->Void) = {
            [weak self] in
            let store = CNContactStore()
            if let contacts =  self?.getAllContactData(store: store) {
                self?.dataArray = contacts
                self?.tableView.reloadData()
            }
            
        }
        var fail:(()->Void) = {
            [weak self] in
            
            let alert = UIAlertController(title: "Request Access Permissions", message: "Gets the address book access?", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "Default action"), style: .default, handler: { [weak self]_ in
                if #available(iOS 10.0, *) {
                    
                    UIApplication.shared.open(URL.init(string: UIApplication.openSettingsURLString)!, options: [:]) { (flag) in
                        
                    }
                } else {
                    UIApplication.shared.openURL(URL.init(string: UIApplication.openSettingsURLString)!)
                }
            }))
            
            alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: "Default action"), style: .cancel, handler: { _ in
                NSLog("The \"OK\" alert occured.")
            }))
            currentVC.present(alert, animated: true, completion: nil)
            
            
        }
        
        switch status {
        case .authorized:
            do{
                success()
            }
        case .notDetermined:
            do{
                let store = CNContactStore()
                store.requestAccess(for: .contacts, completionHandler: { (isOk, error) in
                    
                    if isOk {
                        DispatchQueue.main.async {
                            success()
                        }
                    }else{
                        DispatchQueue.main.async {
                            fail()
                        }
                    }
                })
            }
        case .restricted, .denied:
            fail()
            break
        @unknown default:
            fail()
            break
        }
        
    }

    func getAllContactData(store:CNContactStore) -> [[String:Any]]{
        
        let keys = [CNContactPhoneNumbersKey,CNContactGivenNameKey,CNContactFamilyNameKey,CNContactMiddleNameKey]
        let request = CNContactFetchRequest.init(keysToFetch: keys as[CNKeyDescriptor])
    
        var tempArr = [[String:Any]]()
        do{
            try store.enumerateContacts(with: request, usingBlock: { (contact, stop) in
                
                let giveName:String = contact.givenName
                let middleName:String = contact.middleName
                let famliyName:String = contact.familyName
                
                let nameString = (middleName + " " + giveName + " " + famliyName)
                
                let phoneNumbers = contact.phoneNumbers
                if let phone = phoneNumbers.first {
                    tempArr.append(["name":nameString,"cellphone":phone])
                }
            })
        }
        catch{
            
        }
        
        return tempArr
    }

添加

//新增一个联系人
     func  addContact() {
         //创建通讯录对象
         let  store =  CNContactStore ()
         
         //创建CNMutableContact类型的实例
         let  contactToAdd =  CNMutableContact ()
         
         //设置姓名
         contactToAdd.familyName =  "张"
         contactToAdd.givenName =  "飞"
         
         //设置昵称
         contactToAdd.nickname =  "fly"
         
         //设置头像
         let  image =  UIImage (named:  "fei" )!
         contactToAdd.imageData =  UIImagePNGRepresentation (image)
         
         //设置电话
         let  mobileNumber =  CNPhoneNumber (stringValue:  "18510002000" )
         let  mobileValue =  CNLabeledValue (label:  CNLabelPhoneNumberMobile ,
                                          value: mobileNumber)
         contactToAdd.phoneNumbers = [mobileValue]
         
         //设置email
         let  email =  CNLabeledValue (label:  CNLabelHome , value:  "feifei@163.com"  as  NSString )
         contactToAdd.emailAddresses = [email]
         
         //添加联系人请求
         let  saveRequest =  CNSaveRequest ()
         saveRequest.add(contactToAdd, toContainerWithIdentifier:  nil )
         
         do {
             //写入联系人
             try store.execute(saveRequest)
             print ( "保存成功!" )
         } catch {
             print (error)
         }
     }

修改

func  editContact() {
         //创建通讯录对象
         let  store =  CNContactStore ()
         
         //获取Fetch,并且指定要获取联系人中的什么属性
         let  keys = [ CNContactFamilyNameKey ,  CNContactGivenNameKey ,  CNContactNicknameKey ]
         
         //创建请求对象,需要传入一个(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'类型的数组
         let  request =  CNContactFetchRequest (keysToFetch: keys  as  [ CNKeyDescriptor ])
         
         //遍历所有联系人
         do {
             try store.enumerateContacts(with: request, usingBlock: {
                 (contact :  CNContact , stop :  UnsafeMutablePointer < ObjCBool >) ->  Void  in
                 
                 let  mutableContact = contact.mutableCopy()  as !  CNMutableContact
                 
                 //获取姓名
                 let  lastName = mutableContact.familyName
                 let  firstName = mutableContact.givenName
                 //判断是否符合要求
                 if  lastName ==  "张"  && firstName ==  "飞" {
                     //设置昵称
                     mutableContact.nickname =  "小飞飞"
                     
                     //修改联系人请求
                     let  request =  CNSaveRequest ()
                     request.update(mutableContact)
                     do {
                         //修改联系人
                         try store.execute(request)
                         print ( "修改成功!" )
                     } catch {
                         print (error)
                     }
                 }
             })
         } catch {
             print (error)
         }
     }

删除

func  deleteContact() {
         //创建通讯录对象
         let  store =  CNContactStore ()
         
         //获取Fetch,并且指定要获取联系人中的什么属性
         let  keys = [ CNContactFamilyNameKey ,  CNContactGivenNameKey ,  CNContactNicknameKey ]
         
         //创建请求对象,需要传入一个(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'类型的数组
         let  request =  CNContactFetchRequest (keysToFetch: keys  as  [ CNKeyDescriptor ])
         
         //遍历所有联系人
         do {
             try store.enumerateContacts(with: request, usingBlock: {
                 (contact :  CNContact , stop :  UnsafeMutablePointer < ObjCBool >) ->  Void  in
                 
                 let  mutableContact = contact.mutableCopy()  as !  CNMutableContact
 
                 //获取姓名
                 let  lastName = mutableContact.familyName
                 let  firstName = mutableContact.givenName
                 //判断是否符合要求
                 if  lastName ==  "张"  && firstName ==  "飞" {
                     //删除联系人请求
                     let  request =  CNSaveRequest ()
                     request.delete(mutableContact)
                     
                     do {
                         //执行操作
                         try store.execute(request)
                         print ( "删除成功!" )
                     } catch {
                         print (error)
                     }
                 }
             })
         } catch {
             print (error)
         }
     }

相关文章

  • 重点 (二十九) : 通讯录

    如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework ...

  • AddressBookFramework & Conta

    iOS之前是使用 AddressBookFramework 访问通讯录,但从 iOS 9.0 开始被 Contac...

  • iOS学习笔记29-系统服务(二)通讯录

    一、通讯录 iOS中的通讯录是存储在数据库中的,由于iOS的权限设计,开发人员是不允许直接访问通讯录数据库的,实现...

  • ios 访问通讯录

    - (void)requestAuthorizationForAddressBook { // 判断当前的...

  • iOS 访问通讯录

    iOS 9 之后,苹果增加新特性的库 - ContactsUI.framework 和 Contacts.fram...

  • iOS 通讯录的访问

    导入框架Contacts 权限判断 添加 修改 删除

  • iOS13&Xcode11适配问题

    1.通讯录权限问题iOS 13中将禁止应用开发者访问用户通讯录备注信息,需将keys中的CNContactNote...

  • 调用系统通讯录

    #import "ViewController.h" //iOS6开始, 要访问通讯录, 必须先授权. 不授权上架...

  • 获取系统通讯录

    支持本文作者Mr_洛先森,请阅读原文获取通讯录样式: 在ios中,有两个框架可以访问用户的通讯录 AddressB...

  • iOS10 权限崩溃问题

    iOS10上,若你的项目访问了隐私数据,比如:相机,相册,通讯录等,app会直接Crash了,这是因为iOS10对...

网友评论

      本文标题:iOS 通讯录的访问

      本文链接:https://www.haomeiwen.com/subject/muxthltx.html