首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CNContact保存联系人时不发送联系人图像

基础概念

CNContact 是苹果提供的用于处理联系人信息的框架,它允许开发者在 iOS 和 macOS 应用中读取、创建和修改用户的联系人信息。CNContact 提供了一个抽象的接口来处理联系人数据,包括姓名、电话号码、电子邮件地址、照片等。

保存联系人时不发送联系人图像的原因

当使用 CNContact 保存联系人时,如果不发送联系人图像,可能是因为以下几个原因:

  1. 权限问题:应用没有获得访问用户相册的权限。
  2. 用户选择:用户在添加或编辑联系人时没有选择上传照片。
  3. 代码逻辑:在保存联系人时,代码逻辑中没有包含处理图像的部分。

解决方法

1. 检查和请求权限

首先,确保你的应用已经获得了访问用户相册的权限。你可以在 Info.plist 文件中添加以下键值对:

代码语言:txt
复制
<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的相册以获取联系人照片</string>

然后在代码中请求权限:

代码语言:txt
复制
import Photos

func requestPhotoLibraryPermission() {
    PHPhotoLibrary.requestAuthorization { status in
        switch status {
        case .authorized:
            print("已授权访问相册")
        case .denied, .restricted, .notDetermined:
            print("未授权访问相册")
        @unknown default:
            fatalError()
        }
    }
}

2. 处理用户选择的图像

当用户在添加或编辑联系人时,确保你处理了用户选择的图像。你可以使用 UIImagePickerController 来让用户选择照片:

代码语言:txt
复制
import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func selectPhoto(_ sender: UIButton) {
        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        imagePickerController.sourceType = .photoLibrary
        present(imagePickerController, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let selectedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.image = selectedImage
        }
        dismiss(animated: true, completion: nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
}

3. 保存联系人图像

在保存联系人时,确保你包含了处理图像的逻辑。以下是一个示例代码:

代码语言:txt
复制
import Contacts

func saveContact(withName name: String, phoneNumber: String, email: String, image: UIImage?) {
    let contactStore = CNContactStore()
    let contact = CNMutableContact()
    contact.givenName = name
    contact.phoneNumbers = [CNLabeledValue(label: CNLabelPhoneNumberMobile, value: CNPhoneNumber(stringValue: phoneNumber))]
    contact.emailAddresses = [CNLabeledValue(label: CNLabelWork, value: email as NSString)]

    if let image = image {
        let data = image.jpegData(compressionQuality: 1.0)
        contact.image = data
    }

    let saveRequest = CNSaveRequest()
    saveRequest.add(contact, toContainerWithIdentifier: nil)

    do {
        try contactStore.execute(saveRequest)
        print("联系人保存成功")
    } catch {
        print("保存联系人时出错: \(error)")
    }
}

应用场景

  • 通讯录应用:在通讯录应用中,用户可以添加、编辑和删除联系人,并上传联系人的照片。
  • 社交应用:在社交应用中,用户可以导入通讯录并上传联系人的照片,以便在应用中进行识别和匹配。

参考链接

通过以上步骤,你应该能够解决在使用 CNContact 保存联系人时不发送联系人图像的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS 通讯录相关序一、介绍二、弹出系统通讯录程序三、代理方法四、不需要弹出联系人控制器就可以获取联系人信息的方法五、iOS 9 新出的点击通讯录的获取信息的办法

逻辑结构 3.授权相关: (1)从iOS6开始,必须得到用户授权访问通讯录才能在AppStore上架(即使授权也有时候可以访问通讯录) (2)申请通讯录访问授权的代码,通常放在AppDelegate...1.第一个代理方法:选中某个联系人时调用(iOS8之后实现后再无法调用第2个的方法) - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController...通过ABAddressBookSave函数保存刚才所作的修改 可以通过ABAddressBookHasUnsavedChanges函数判断是否有未保存的修改 当决定是否更改通讯录数据库后,你可以分别使用...AbAddressBookSave 或 ABAddressBookRevert 方式来保存或放弃更改 2、 添加群组的步骤大体和添加联系人一致 通过ABPersonCreate函数创建一个新的组(返回...分别为单选和多选两组,都实现的时候,多选优先执行,单选执行。

1.8K60

Contacts Journal CRM Mac(联系人管理软件)

Contacts Journal CRM mac版是Macos上一款联系人管理软件,可以为您创建联系人关系网,并且还能根据您输入的联系人地址来制作联系人地图,当您需要去寻找联系人时会帮您自动的规划路径,...联系人日记将在您通过应用程序呼叫,发送电子邮件或发送消息时自动添加日志。待办事项为每个联系人创建一个后续列表。您可以设置特定时间的警报,将会议添加到日历,设置定期任务等。...轻松地在所有联系人中引用所有ToDos以获得完整的图片。跟踪您的文件附上每个联系人的文件和文件,以便将所有相关信息保存在一个地方。...在Mac上,您还可以拖放文件并将其保存在应用程序中。您还可以从Mail应用程序拖放电子邮件。按位置跟踪查看包含所有联系人地址的地图,按距离当前位置排序。非常适合寻找附近的联系人以及路线规划。...您还可以选择不同的引脚颜色来对联系人进行颜色编码。

61230
  • Contacts Journal CRM mac版(客户管理软件)激活版

    Contacts Journal CRM mac版是Macos上一款客户管理软件,可以为您创建联系人关系网,并且还能根据您输入的联系人地址来制作联系人地图,当您需要去寻找联系人时会帮您自动的规划路径,节省您的时间...联系人日记将在您通过应用程序呼叫,发送电子邮件或发送消息时自动添加日志。待办事项为每个联系人创建一个后续列表。您可以设置特定时间的警报,将会议添加到日历,设置定期任务等。...轻松地在所有联系人中引用所有ToDos以获得完整的图片。跟踪您的文件附上每个联系人的文件和文件,以便将所有相关信息保存在一个地方。...在Mac上,您还可以拖放文件并将其保存在应用程序中。您还可以从Mail应用程序拖放电子邮件。按位置跟踪查看包含所有联系人地址的地图,按距离当前位置排序。非常适合寻找附近的联系人以及路线规划。...您还可以选择不同的引脚颜色来对联系人进行颜色编码。

    64810

    Material Design —Chips

    Chips Chips是一种小块的用来呈现复杂实体的块,如联系人。 Chips可能包含照片,文字,规则,icon或联系人等实体。 联系人Chips可以以紧凑的方式呈现联系人信息。...可删除Chips ---- 联系人Chips 用户可以使用联系人Chips以紧凑的方式呈现用户拥有的联系人信息。...当用户开始输入联系人姓名,查看联系人的地址并选择正确的联系人时,Chips被调用并插入到文本字段(通常是“To”字段)。 联系人Chips可以直接从联系人菜单添加到文本字段。...联系人Chips能让用户有效地确认将消息发送给正确的人。 ? 左:用户可确认接受者名字    右:用户可以选择联系人Chips上的收件地址 ?...联系人Chips的四种状态:Normal, Focused, Pressed, 和 Activated

    1K150

    从 0 到 1 开发一个聊天通讯 服务 复盘总结

    功能: 查找联系人 有通知某人操作 功能分析 「功能1: 查找联系人」 通过现有联系人json 数据来 查找输入的联系人进行匹配。...(简单) 「功能2:通知某人」 当用户点击到某个联系人时,将点击的人 放到输入框里 显示 @xxx [ 经过格式化处理 ] , 并将选中的联系人信息加入到发送消息的 json 对象中。...有多种实现方案,当用户点击了某联系人时,将触发事件,携带值传递给父组件[聊天组件的入口 index.vue ] 接收,然后将值传递给 聊天主体组件 ,通过 在 聊天主体组件 中 通过 $refs 进行传递值...「删除选中的联系人」 由于这块是采用的可编辑属性, 我们可以获取选中的人,但「无法直接判断是删除的哪个人」,这时,只能通过判断 innerHTML 中是否包含某联系人,来进行删除已保存联系人。...如果连接已经关闭,则此方法执行任何操作。

    82830

    Selenium WebDriver—如何测试REST API

    如果监视Chrome-network中的Network,可以看到发送了一些API GET请求来获取联系人列表。 如果你不确定在哪里检查,在Chrome页面按下F12,Chrome开发工具将会出现。...,修改联系人,删除联系人等 2- GET Request: 一旦应用程序启动,可以使用API GET请求获取联系人列表,以便在应用程序中显示数据。..., body.getArray().length(), "The contacts not equals with Body length"); 3- POST Request: 每当我们试图添加新的联系人时...POST请求创建新的联系人了(发送POST请求之后,在这里还可以通过UI界面进行检查联系人是否成功显示在UI界面,此处不做详细Demo) String postApi = "https://restool-sample-app.herokuapp.com...4- 编辑请求 要编辑联系人,我们需要发送如下所示的PUT请求。

    1.7K10

    IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总

    4)手机联系人: 绑定手机联系人的微信帐号,可以查看到手机通讯录联系人已开通了微信的朋友,并直接添加对方为微信好友。 5.5 好友人数上限 微信最多可以添加 5000 个好友。...6.6 群保存规则 微信群需要手动添加到通讯录才会永久保存,否则它只会保存在本地,一旦你卸载APP后,它就会消失。除非有群内成员发送消息,你才能再次看到,除次之外,你没有别的方法可以找回它。...6.8 加群验证规则 1)当群人数小于40人时,好友可以自由加入或被邀请加入; 2)当群人数超过40人时,加群邀请需要对方同意; 3)当群人数超过100人时,对方需要通过实名验证才能接受邀请(微信中可以通过绑定银行卡进行实名验证...3)不让他(她)看我的朋友圈(即内容更新给好友): 对方查看您的朋友圈显示是空白的,不会显示您发送过的任何朋友圈消息。...* 保存的位置:收藏里面的内容是保存在服务器中的,只要你主动删除,会一直存在。 * 单个文件大小限制:可以收藏的单个文件大小不能超过 25 M。

    2.4K30

    c++实现个人通讯录

    期末考试作业: 主要结合教材1-4章所学知识开发一个个人版通讯录,要求通讯录可以实现以下功能: 添加联系人 删除联系人 查找联系人 联系人列表 通讯录存盘 读出通讯录 退出 功能提示: 为存储通讯录中联系人信息...初步设想用数组来存储这些联系人信息,数组大小就是通讯录的容量,每个数组元素是一个类对象,当添加联系人时,需要查找数组中是否有空位,如果有,则将联系人添加进来;当删除一个联系人时,将这个位置标记为空,可以用于下一次添加...另外还需要设计第二个类AddresdBook,成员包括第一个类对象的数组、通讯录中联系人个数;并且定义一些成员函数:添加、删除、查找、列表显示联系人,存盘读盘等。...; void searchPostCodedress2(char na[]);//根据姓名查找联系人; void Save(); //实现保存功能; void Put(...{ color(03); cout<<"当前通讯录联系人有:"<<n<<"个 "<<endl<<"通讯录中最多可以添加"<<100-n<<"个联系人"<<endl; cout<<

    69350

    IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总

    4)手机联系人: 绑定手机联系人的微信帐号,可以查看到手机通讯录联系人已开通了微信的朋友,并直接添加对方为微信好友。 5.5 好友人数上限 微信最多可以添加 5000 个好友。...6.6 群保存规则 微信群需要手动添加到通讯录才会永久保存,否则它只会保存在本地,一旦你卸载APP后,它就会消失。除非有群内成员发送消息,你才能再次看到,除次之外,你没有别的方法可以找回它。...6.8 加群验证规则 1)当群人数小于40人时,好友可以自由加入或被邀请加入; 2)当群人数超过40人时,加群邀请需要对方同意; 3)当群人数超过100人时,对方需要通过实名验证才能接受邀请(微信中可以通过绑定银行卡进行实名验证...3)不让他(她)看我的朋友圈(即内容更新给好友): 对方查看您的朋友圈显示是空白的,不会显示您发送过的任何朋友圈消息。 ?...* 保存的位置:收藏里面的内容是保存在服务器中的,只要你主动删除,会一直存在。 * 单个文件大小限制:可以收藏的单个文件大小不能超过 25 M。

    1.9K20

    【C语言】通讯录实现(下)

    void SaveContact(Contact* pc)//保存联系人到文件中 { FILE* pf = fopen("contact.dat", "wb");//打开文件 if (pf ==...void LoadContact(Contact* pc)//加载已保存联系人数据 { //打开文件 FILE* pf = fopen("contact.dat", "rb"); //以二进制形式读文件...= tmp; //将保存联系人写入当前通讯录 pc->sz++; //写入一个sz通讯录联系人数量加一和增加联系人函数一样 } printf...>capacity = DEFAULT_SZ;//使用了宏定义DEFAULT_SZ=3容量 pc->sz = 0; } int CheckCapacity(Contact* pc)//增容函数 加联系人时如果空间不够就增容...的位置开始读写到文件中 } //关闭文件 fclose(pf); pf = NULL; } 4.结语 三版通讯录循序渐进,从最开始的定容增删查改等功能的实现(上篇),到可以不定容的通讯录(中篇),最后到可以保存数据到文件并从文件中加载保存联系人

    8410

    Selenium结合Unirest和JTwig进行API测试

    如果监视Chrome-network中的Network,可以看到发送了一些API GET请求来获取联系人列表。 如果你不确定在哪里检查,在Chrome页面按下F12,Chrome开发工具将会出现。...,修改联系人,删除联系人等 2- GET Request: 一旦应用程序启动,可以使用API GET请求获取联系人列表,以便在应用程序中显示数据。..., body.getArray().length(), "The contacts not equals with Body length"); 3- POST Request: 每当我们试图添加新的联系人时...POST请求创建新的联系人了(发送POST请求之后,在这里还可以通过UI界面进行检查联系人是否成功显示在UI界面,此处不做详细Demo) String postApi = "https://restool-sample-app.herokuapp.com...4- 编辑请求 要编辑联系人,我们需要发送如下所示的PUT请求。

    1.4K20

    iOS开发之AddressBookUI框架详解

    其中封装好了一套选择联系人,查看联系人的界面,在需要时开发者可以直接调用。当然对于联系人界面,开发者也可以进行完全的自定义,下面链接博客中介绍了如何使用AddressBook框架操作通讯录与联系人。...ABPeoplePickerNavigationController:从通讯录选择联系人界面视图控制器 ABPersonViewController:联系人详情界面视图控制器 ABUnknownPersonViewController...:一个未在当前通讯录中的联系人查看界面,可以添加和编辑 二、ABNewPersonViewController新建联系人界面     ABNewPersonViewController类的使用非常简单,...    ABPeoplePickerNavigationController是用户通讯录界面,开发者在需要用户选择联系人时,可以直接调用这个界面来让用户进行选择,示例如下: ABPeoplePickerNavigationController...,ABUnknownPersonViewController则不然,你可以使用一个通讯录中不存在的联系人对象来进行界面的渲染,并且支持用户选择将此联系人存入通讯录中。

    71000

    【安全的办公和生产力应用程序】上海道宁为您提供用于安全编辑和协作的软件——ONLYOFFICE

    多媒体:播放视频和音乐,查看图像:BMP、JPG、JPEG、PNG、GIF、TIF、TIFF、AVI、MPG、MPEG、MP3、WEBP等。...客户关系管理整合:将电子邮件线程或单独的消息链接到 CRM 联系人、案例或机会,并准备好所有相关的信件。文档集成:将文档模块中的文件附加到您的电子邮件中,以便快速交换信息。...日历集成:向您的日历活动发送邀请,并通知客人您所做的任何更改。从第三方日历获取邀请并回复。...03、客户关系管理使用CRM软件的基本功能构建您的客户数据库、管理业务流程、分析潜在交易成功率并跟踪销售:联系人、交易机会、任务、在线潜在客户表单和通信历史记录。...05、日历创建个人时间表和共享日历,能够授予特定人员访问权限或安排小组会议。

    2.9K10

    腾讯待办怎么用?来看看这篇超详细的入门指南

    ① 绑定“腾讯待办”公众号 ② 通过文本创建待办 直接在公众号对话框输入待办内容(例如:“11.1 00:30 付尾款”)后发送就会自动创建一条待办了,创建后点击查看详情可以查看或设置任务详情。...③ 通过语音创建待办 可通过向公众号发送语音的方式创建新的待办,具体请参考: 如何创建周期性任务 进入待办详情页点击“日期”,根据需要选择重复类型并完成设置。...02 分享待办/分组 待办详情页分享 在待办详情点击参与人后通过添加联系人或分享(也可以在待办详情页直接分享)的方式添加参与人 注意: ① 首次请先通过分享的方式添加参与人,好友接收同时会成为你的联系人...,下次可直接通过添加联系人的方式添加参与人。...② 通过添加联系人方式添加好友为参与人时,好友会收到小程序/公众号/APP提醒,只有当好友点击提醒接收后方可算完成添加。

    1.7K20

    腾讯待办怎么用?来看看这篇超详细的入门指南

    ① 绑定“腾讯待办”公众号 ② 通过文本创建待办 直接在公众号对话框输入待办内容(例如:“11.1 00:30 付尾款”)后发送就会自动创建一条待办了,创建后点击查看详情可以查看或设置任务详情。...③ 通过语音创建待办 可通过向公众号发送语音的方式创建新的待办,具体请参考: 如何创建周期性任务 进入待办详情页点击“日期”,根据需要选择重复类型并完成设置。...02 分享待办/分组 待办详情页分享 在待办详情点击参与人后通过添加联系人或分享(也可以在待办详情页直接分享)的方式添加参与人 注意: ① 首次请先通过分享的方式添加参与人,好友接收同时会成为你的联系人...,下次可直接通过添加联系人的方式添加参与人。...② 通过添加联系人方式添加好友为参与人时,好友会收到小程序/公众号/APP提醒,只有当好友点击提醒接收后方可算完成添加。

    2.6K10

    c语言实现通讯录

    结构体数组 的每个成员保存联系人的具体信息特征....用一个参数 sz 记录当前联系人个数. 1.2 通讯录功能介绍: 1.添加联系人 2.删除联系人 3.修改联系人 4.查询联系人 5.展示通讯录 效果展示: 二、通讯录的实现: 2.1...char addr[ADDR_MAX]; //地址 }peo; //创建通讯录类型 typedef struct Contact { peo data[N];//结构体数组,数组每个成员都是结构体,其中保存联系人的信息...我们知道,后面我们需要实现下列功能 删除联系人 修改联系人 这些功能都需要先找到目标联系人,所以我们先实现这个函数,后续需要在删除联系人和修改联系人时,可以直接调用该函数即可, 为了更好让该函数可以被其他函数复用...3.能否保存以前的通讯录信息,当我们下次打开通讯录后,通讯录还保存以前的信息. …… 这些优化,会涉及到文件等后需要学习的知识,下回牛牛在细细分解.今天就到这里啦!!

    98830
    领券