这是 iOS 模拟器上,通许录的截图:
这是执行代码后,获取到的通许录信息:
可以看到通许录的联系方式和姓名,都直接被明文的方式拿到了。这一点我觉得苹果方面做的很差,应该设计成还需要调用苹果的接口解密的机制,苹果方面需要对解密方做好安全校验或者备案的机制才能解密。
当然,我们得在 App 第一次运行是允许它获取通许录。通常很多 App 在第一次运行时,请求很多权限,普通用户没有安全意识一路点过去,很容易中招。
很多人给家人的备注不是姓名而是称呼,这样攻击者很容易知道你们的关系。
从前就看到过相关报道,攻击者称某人出车祸了在医院,给其妈妈打电话要求先转钱帮忙缴费,母亲爱子心切就把钱转给了骗子。
import SwiftUI
import Contacts
struct ContentView: View {
@State private var contacts: [CNContact] = []
var body: some View {
VStack {
Button("请求通讯录权限") {
requestContactsPermission()
}
.padding()
List(contacts, id: \.identifier) { contact in
Text("\(contact.givenName) \(contact.familyName)")
}
}
}
func requestContactsPermission() {
let contactStore = CNContactStore()
switch CNContactStore.authorizationStatus(for: .contacts) {
case .authorized:
fetchContacts()
case .notDetermined:
contactStore.requestAccess(for: .contacts) { (granted, error) in
if granted {
DispatchQueue.main.async {
self.fetchContacts()
}
} else {
print("用户拒绝了通讯录权限")
}
}
case .denied, .restricted:
print("通讯录权限被拒绝或受到限制")
@unknown default:
break
}
}
func fetchContacts() {
do {
let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
let request = CNContactFetchRequest(keysToFetch: keysToFetch as [CNKeyDescriptor])
try CNContactStore().enumerateContacts(with: request) { contact, _ in
contacts.append(contact)
print(contact.givenName, contact.familyName, contact.phoneNumbers.first?.value.stringValue)
}
} catch {
print("无法获取通讯录信息: \(error.localizedDescription)")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
骗子可恨。我们作为普通用户应该提高自身防范意识,对于 App 一切权限的申请,需要考虑合理性,不要一路点过去。
像通迅录这种权限,骗子获取到后肯定直接上传了,事后再关闭权限也于事无补,所以需要谨慎再谨慎。
也逐渐理解了,我们国家网站需要备案,后续逐渐 App、小程序等都需要备案,虽然作为开发者会有一些麻烦,但是这样更少人会被骗,我觉得这是值得的。
如今信息被滥用,甚至一些正常业务的 App 也会卖收集到的用户信息。
所以我的建议是,这种隐私度极高的权限不要轻易给出。