IOS Swift 5.0 获取通讯录列表拨打电话
一、创建项目
这个很简单,就不多说了
二、实现 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 获取通讯录列表拨打电话相关推荐
- IOS Swift 5.0 获取图片-相册、拍照
一.创建项目 这个很简单,创建好了看下面的就行了 二.添加权限 拍照和获取相册都需要先设置权限 三.布局 实现一个简单的布局,同一个界面,一个按钮 Button,一张图片 ImageView 四.实现 ...
- 动态申请权限---通讯录 及获取通讯录列表
private static String[] PERMISSIONS_STORAGE = {//动态申请权限列表 // "android.permission.WRITE_CONTACTS ...
- android6.0获取通讯录权限
android6.0中,获取通讯录的权限是 <uses-permission android:name="android.permission.GET_ACCOUNTS&quo ...
- Android7.0+ 获取WiFi列表以及连接WiFi
获取WiFi列表并连接 这段时间项目中涉及到需要获取WiFi列表以及连接,在这里记录下 其中就有一个坑,在Android7.0以上还需要打开定位(也就是手机中"位置信息") Wif ...
- iOS swift 位置 定位 获取海拔
我自己的另外一篇博客(推荐):ios swift 获取手机位置 定位 Swift - 使用CoreLocation实现定位(经纬度.海拔.速度.距离等)
- android和php通讯录,获得通讯录并拨打电话 Android
由于通讯录在手机里是以数据库贮存的 所以我们可以通过getContentResolver来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息, 当然 ...
- Android 12.0 禁用和启用拨打电话功能实现
1.项目需求 在12.0的产品定制化开发中,在一些wifi产品的产品开发中,对于系统4g部分的功能需要裁剪 比如拨打电话 接听电话 短信功能等这部分 需要禁用系统对应的功能,接下来就来初步分析下系统中 ...
- html双击回顶部,百度/微信小程序点击按钮回到顶部(scrollTop=0)/点击拨打电话...
一.HTML部分 二.JS部分页面滚动回到顶部 1.监听页面滚动事件 onPageScroll(e) { // console.log(e.scrollTop) if (e.scrollTop > ...
- iOS 新浪微博-5.0 首页微博列表
首页显示微博列表,是微博的核心部分,这一章节,我们主要是显示出微博的列表. 导入第三方类库 pod 'SDWebImage', '~> 3.7.3' pod 'MJRefresh', '~> ...
最新文章
- Y项目轶事之入场半个月
- Android --- 微信支付时出现错误:错误的签名,验签失败,return_code=FAIL
- 山特UPS电源三种工作模式解析
- java 8 Stream中操作类型和peek的使用
- 精华文稿 | 工业场景中机器人定位导航技术
- python writelines_Python文件writelines()方法
- Android开发——通过扫描二维码,打开或者下载Android应用
- 酒精传感器实验-传感器原理及应用实验
- 知弥深度清理大师隐私政策
- sim868 建立tcp链接时的步骤所对应hex码
- java now_Java LocalDateTime now()用法及代码示例
- php实时股票,PHP实现股票趋势图和柱形图
- rear和length表示的循环队列
- 三八女神节礼物排行,2022年三八节送女人什么礼物好?
- python白噪声检验_时间序列 平稳性检验 白噪声 峰度 偏度
- 第一次作业:读博文有感
- epoll的反应堆实现模式
- jacky自问自答-java并发编程
- 产品经理培训行业---以起点学院为主体的相关竞品分析报告
- 用友BQ商业智能平台报表功能