UzumakiItachi
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

UzumakiItachi

起风了,唯有努力生存。
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • WebPack

  • 浏览器相关

  • 工程化相关

  • 工作中遇到的问题以及解决方案

    • 解决浏览器返回页面不刷新的问题
    • 前端如何下载文件流
    • uniapp APP端实现更新最新安装包
    • GitHub Actions Process completed with exit code 128 的解决方案
    • 保留文字输入的空格和换行
    • 缩放适配大屏页
    • 一次性加载n多张图片的性能优化方案
    • NOT-Cool 低代码页面架构思路
    • h5下载vcard快捷保存联系人信息
      • 前言
      • vcard
      • h5下载vcf
    • 结合elementui实现的动态主题
    • 解决monorepo场景下子包作为依赖项在开发和生产暴露文件的问题
    • 给npm配置github令牌
    • 移动端电子印章解决方案
    • 小程序canvas绘制海报中遇到的一些坑
    • 超详细的虚拟列表实现过程
    • 小程序实现一个事件中心
    • 请求超时后如何优雅的重新请求
    • 超详细的大文件上传实现方案
    • 仿抖音短视频组件实现方案
    • swiper渲染大量数据的优化方案
    • 前端检测更新,自动刷新网页
  • Git

  • Vite

  • 一些小工具

  • 算法

  • 服务器

  • HTTP

  • 技术
  • 工作中遇到的问题以及解决方案
hanhanbuku
2023-07-27
目录

h5下载vcard快捷保存联系人信息

# 前言

下载vcard(.vcf)文件可以在移动端快捷保存联系人信息,相当于一个电子名片,用户只需要扫描二维码进入电子名片网页,点击保存既可弹出联系人信息弹窗快捷保存电话号码之类的信息。

# vcard

vcf文件其实就是对信息的一个描述,他是一个字符串格式,大体格式如下

    `BEGIN:VCARD\nVERSION:3.0\nN;CHARSET=UTF-8: ; ${联系人姓名};;;\nFN;CHARSET=UTF-8: ${联系人姓名}  \nTITLE;CHARSET=UTF-8:${联系人职位,标签等}\nORG;CHARSET=UTF-8:${联系人公司名称}\nADR;PREF=1;Address=\"${联系人地址}\":;;${联系人地址}\nTEL;TYPE=mobile:${联系人手机号}\nTEL;TYPE=work:${联系人工作号码}\nEMAIL;Email:${联系人邮箱地址}\nURL;TYPE=profile:${联系人个人网址}\nURL;TYPE=work:${联系人公司网址}\nEND:VCARD`
1

具体的可以百度一下vcard格式,上面那份数据是针对ios系统的联系人信息格式,安卓可能会有些许字段不同,基于系统

# h5下载vcf

这一步其实很简单,就是将这一段数据生成一个文件流,然后用a标签下载就可以了。

const handleSave =()=>{
  let file = new File([
    `BEGIN:VCARD\nVERSION:3.0\nN;CHARSET=UTF-8: ; ${data[props.dataKey].full_name};;;\nFN;CHARSET=UTF-8: ${data[props.dataKey].full_name}  \nTITLE;CHARSET=UTF-8:${data[props.dataKey].title}\nORG;CHARSET=UTF-8:${data[props.dataKey].COMPANY}\nADR;PREF=1;Address=\"${data[props.dataKey].ADDRESS}\":;;${data[props.dataKey].ADDRESS}\nTEL;TYPE=mobile:${data[props.dataKey].mobile}\nTEL;TYPE=work:${data[props.dataKey].workTel}\nEMAIL;Email:${data[props.dataKey].email}\nURL;TYPE=profile:${window.location.href}\nURL;TYPE=work:${data[props.dataKey].WEBSITE}\nEND:VCARD`
  ],'',{ type: "text/vcard;charset=utf-8" })
  const a = document.createElement('a')
  const href = window.URL.createObjectURL(file)
  a.href = href
  a.target = 'blank'
  a.download = `${data[props.dataKey].full_name}'s Contact.vcf`
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
}
1
2
3
4
5
6
7
8
9
10
11
12
13

可以用file也可以用blob。但是要注意,生成的文件类型要写成text/vcard,这样在ios端可以直接唤醒通讯录,非常的方便。不然的话浏览器会把他当成一个普通的文件让用户下载,下载下来之后需要手动的去分享到通讯录才能将信息带过去。

编辑 (opens new window)
上次更新: 2023/08/03, 11:22:20
NOT-Cool 低代码页面架构思路
结合elementui实现的动态主题

← NOT-Cool 低代码页面架构思路 结合elementui实现的动态主题→

最近更新
01
前端检测更新,自动刷新网页
06-09
02
swiper渲染大量数据的优化方案
06-06
03
仿抖音短视频组件实现方案
02-28
更多文章>
Theme by Vdoing | Copyright © 2023-2025 UzumakiItachi | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式