一、创建项目

这个很简单,就不多说了

二、实现 UITableView 以及相关布局

也不复杂,不会的可以参考一下我的另一篇,都是最基础的

三、添加权限

获取通讯录数据需要添加请求访问通讯录的权限,第二个就是访问通讯录权限,没有权限当然就获取不到了

四、代码展示

TelController.swift

获取通讯录数据需要

import Contacts

继承 ,UITableViewDataSource, UITableViewDelegate

TelModel 是自定义的一个 model ,下面也有代码展示

import UIKit
import Contactsclass TelController: BaseController, UITableViewDataSource, UITableViewDelegate{//通讯录数据集var telArray:Array  = [TelModel]()//列表@IBOutlet weak var tableView: UITableView!override func viewDidLoad() {super.viewDidLoad()print(content ?? "tel-content-null")// Do any additional setup after loading the view.//1.获取授权状态let status = CNContactStore.authorizationStatus(for: .contacts)//2.判断授权状态,如果未授权,发起授权请求,如果已授权,就直接遍历通讯录获取数据if status == .notDetermined {let contactStore = CNContactStore()contactStore.requestAccess(for: .contacts, completionHandler: { (isRight: Bool, nil) inif isRight {print("授权成功")//遍历联系人列表self.getContatList()} else {print("用户未授权")}})}else{//遍历联系人列表self.getContatList()}}//列表长度设置func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return telArray.count}//设置联系人数据func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell:TelCell = tableView.dequeueReusableCell(withIdentifier: "TelCellId", for:indexPath) as! TelCellcell.telName.text = telArray[indexPath.row].namereturn cell}//点击联系人-拨打电话去func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {//alerts2(contents: telArray[indexPath.row].tel ?? "电话为空!")callPhone(telArray[indexPath.row].tel ?? "电话为空!")}/**调用时间:*作用:遍历通讯录*/private func getContatList() {//判断是否有权读取通讯录let status = CNContactStore.authorizationStatus(for: .contacts)guard status == .authorized else {return}//1.创建通讯录对象let store = CNContactStore()//2.定义要获取的属性键值let key = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey]//3.获取请求对象let request = CNContactFetchRequest(keysToFetch: key as [CNKeyDescriptor])//4.遍历所有联系人do {try store.enumerateContacts(with: request, usingBlock: { (contact: CNContact, stop: UnsafeMutablePointer<ObjCBool>) in//4.1获取姓名let lastName = contact.familyNamelet firstName = contact.givenNamelet telModel:TelModel = TelModel()telModel.name = "\(lastName)\(firstName)"print("姓名:\(lastName)\(firstName)")//4.2获取电话号码let phoneNumbers = contact.phoneNumbersfor phoneNumber in phoneNumbers {print(phoneNumber.value.stringValue)telModel.tel = phoneNumber.value.stringValue}self.telArray.append(telModel)//去掉联系人姓名为空或者 电话为空的数据if(telModel.name == "" || telModel.tel == ""){self.telArray.remove(at: self.telArray.count-1)}//在主线程中刷新数据DispatchQueue.main.async(execute: {self.tableView.reloadData()})//                //获取姓名
//                let lastName = contact.familyName
//                let firstName = contact.givenName
//                print("姓名:\(lastName)\(firstName)")
//
//                //获取昵称
//                let nikeName = contact.nickname
//                print("昵称:\(nikeName)")
//
//                //获取公司(组织)
//                let organization = contact.organizationName
//                print("公司(组织):\(organization)")
//
//                //获取职位
//                let jobTitle = contact.jobTitle
//                print("职位:\(jobTitle)")
//
//                //获取部门
//                let department = contact.departmentName
//                print("部门:\(department)")
//
//                //获取备注
//                let note = contact.note
//                print("备注:\(note)")
//
//                //获取电话号码
//                print("电话:")
//                for phone in contact.phoneNumbers {
//                    //获得标签名(转为能看得懂的本地标签名,比如work、home)
//                    let label = CNLabeledValue<NSString>.localizedString(forLabel: phone.label!)
//                    //获取号码
//                    let value = phone.value.stringValue
//                    print("\t\(label):\(value)")
//                }
//
//                //获取Email
//                print("Email:")
//                for email in contact.emailAddresses {
//                    //获得标签名(转为能看得懂的本地标签名)
//                    let label = CNLabeledValue<NSString>.localizedString(forLabel: email.label!)
//                    //获取值
//                    let value = email.value
//                    print("\t\(label):\(value)")
//                }
//
//                //获取地址
//                print("地址:")
//                for address in contact.postalAddresses {
//                    //获得标签名(转为能看得懂的本地标签名)
//                    let label = CNLabeledValue<NSString>.localizedString(forLabel: address.label!)
//                    //获取值
//                    let detail = address.value
//                    let contry = detail.value(forKey: CNPostalAddressCountryKey) ?? ""
//                    let state = detail.value(forKey: CNPostalAddressStateKey) ?? ""
//                    let city = detail.value(forKey: CNPostalAddressCityKey) ?? ""
//                    let street = detail.value(forKey: CNPostalAddressStreetKey) ?? ""
//                    let code = detail.value(forKey: CNPostalAddressPostalCodeKey) ?? ""
//                    let str = "国家:\(contry) 省:\(state) 城市:\(city) 街道:\(street) 邮编:\(code)"
//                    print("\t\(label):\(str)")
//                }
//
//                //获取纪念日
//                print("纪念日:")
//                for date in contact.dates {
//                    //获得标签名(转为能看得懂的本地标签名)
//                    let label = CNLabeledValue<NSString>.localizedString(forLabel: date.label!)
//                    //获取值
//                    let dateComponents = date.value as DateComponents
//                    let value = NSCalendar.current.date(from: dateComponents)
//                    let dateFormatter = DateFormatter()
//                    dateFormatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
//                    print("\t\(label):\(dateFormatter.string(from: value!))")
//                }
//
//                //获取即时通讯(IM)
//                print("即时通讯(IM):")
//                for im in contact.instantMessageAddresses {
//                    //获得标签名(转为能看得懂的本地标签名)
//                    let label = CNLabeledValue<NSString>.localizedString(forLabel: im.label!)
//                    //获取值
//                    let detail = im.value
//                    let username = detail.value(forKey: CNInstantMessageAddressUsernameKey) ?? ""
//                    let service = detail.value(forKey: CNInstantMessageAddressServiceKey) ?? ""
//                    print("\t\(label):\(username) 服务:\(service)")
//                }
//
//                print("----------------")})} catch {print("读取通讯录出错")}}/// 拨打电话func callPhone(_ phone: String) {if phone.isEmpty {print("电话号码异常")} else {var tel = "tel://"+phone//去掉空格-不然有些电话号码会使 URL 报 niltel = tel.replacingOccurrences(of: " ", with: "", options: .literal, range: nil);print(tel)if let urls = URL(string: tel){//ios 10.0以上和一下调用不同的方法拨打电话-默认都会弹框询问if #available(iOS 10.0, *) {UIApplication.shared.open(urls, options: [:], completionHandler: {(success) inprint("Open \(phone): \(success)")})} else {UIApplication.shared.openURL(urls)}}else{print("url 为空!")}}}
}

TelModel.swift

import UIKitclass TelModel: NSObject {//联系人姓名var name:String?//联系人电话var tel:String?
}

TelCell.swift

import UIKitclass TelCell: UITableViewCell {@IBOutlet weak var telName: UILabel!override func awakeFromNib() {super.awakeFromNib()// Initialization code}override func setSelected(_ selected: Bool, animated: Bool) {super.setSelected(selected, animated: animated)// Configure the view for the selected state}}

IOS Swift 5.0 获取通讯录列表拨打电话相关推荐

  1. IOS Swift 5.0 获取图片-相册、拍照

    一.创建项目 这个很简单,创建好了看下面的就行了 二.添加权限 拍照和获取相册都需要先设置权限 三.布局 实现一个简单的布局,同一个界面,一个按钮 Button,一张图片 ImageView 四.实现 ...

  2. 动态申请权限---通讯录 及获取通讯录列表

    private static String[] PERMISSIONS_STORAGE = {//动态申请权限列表 // "android.permission.WRITE_CONTACTS ...

  3. android6.0获取通讯录权限

    android6.0中,获取通讯录的权限是     <uses-permission android:name="android.permission.GET_ACCOUNTS&quo ...

  4. Android7.0+ 获取WiFi列表以及连接WiFi

    获取WiFi列表并连接 这段时间项目中涉及到需要获取WiFi列表以及连接,在这里记录下 其中就有一个坑,在Android7.0以上还需要打开定位(也就是手机中"位置信息") Wif ...

  5. iOS swift 位置 定位 获取海拔

    我自己的另外一篇博客(推荐):ios swift 获取手机位置 定位 Swift - 使用CoreLocation实现定位(经纬度.海拔.速度.距离等)

  6. android和php通讯录,获得通讯录并拨打电话 Android

    由于通讯录在手机里是以数据库贮存的 所以我们可以通过getContentResolver来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息, 当然 ...

  7. Android 12.0 禁用和启用拨打电话功能实现

    1.项目需求 在12.0的产品定制化开发中,在一些wifi产品的产品开发中,对于系统4g部分的功能需要裁剪 比如拨打电话 接听电话 短信功能等这部分 需要禁用系统对应的功能,接下来就来初步分析下系统中 ...

  8. html双击回顶部,百度/微信小程序点击按钮回到顶部(scrollTop=0)/点击拨打电话...

    一.HTML部分 二.JS部分页面滚动回到顶部 1.监听页面滚动事件 onPageScroll(e) { // console.log(e.scrollTop) if (e.scrollTop > ...

  9. iOS 新浪微博-5.0 首页微博列表

    首页显示微博列表,是微博的核心部分,这一章节,我们主要是显示出微博的列表. 导入第三方类库 pod 'SDWebImage', '~> 3.7.3' pod 'MJRefresh', '~> ...

最新文章

  1. Y项目轶事之入场半个月
  2. Android --- 微信支付时出现错误:错误的签名,验签失败,return_code=FAIL
  3. 山特UPS电源三种工作模式解析
  4. java 8 Stream中操作类型和peek的使用
  5. 精华文稿 | 工业场景中机器人定位导航技术
  6. python writelines_Python文件writelines()方法
  7. Android开发——通过扫描二维码,打开或者下载Android应用
  8. 酒精传感器实验-传感器原理及应用实验
  9. 知弥深度清理大师隐私政策
  10. sim868 建立tcp链接时的步骤所对应hex码
  11. java now_Java LocalDateTime now()用法及代码示例
  12. php实时股票,PHP实现股票趋势图和柱形图
  13. rear和length表示的循环队列
  14. 三八女神节礼物排行,2022年三八节送女人什么礼物好?
  15. python白噪声检验_时间序列 平稳性检验 白噪声 峰度 偏度
  16. 第一次作业:读博文有感
  17. epoll的反应堆实现模式
  18. jacky自问自答-java并发编程
  19. 产品经理培训行业---以起点学院为主体的相关竞品分析报告
  20. 用友BQ商业智能平台报表功能

热门文章

  1. oracle 创建空间索引
  2. C4D快速入门教程——布尔运算
  3. Direct exchange
  4. html字体加粗字号为2,【css】文字基本样式(颜色、倾斜、加粗、字号、行高、字体)...
  5. zookeeper入门 - 3 - API常用函数功能与参数详解
  6. 开发工具-Github
  7. 大数据架构之Hadoop生态圈
  8. ​安利一款追书软件,完全免费的哦
  9. 台式电脑计算机为什么没有EF盘,打开电脑,D、E、F盘不见了,怎么处理?
  10. 【FJWC】day1简要题解