如何从网页中将联系人添加到iPhone的通讯录?

35
在桌面Mac世界中,如果我点击网页中链接到VCF文件的链接,这个文件将在通讯录应用程序中打开。 但是,在iPhone世界中,这样做会显示“下载失败。Safari无法下载此文件”的消息。 所以,我的问题是,是否可以从网页向iPhone的通讯录添加联系人?
我拥有原始VCF文件和数据的hCard微格式版本,因此解决方案不必与下载原始文件相关 - 如果需要,我可以重新处理数据。唯一的要求是从Mobile Safari中查看的网页中将联系人添加到iPhone的通讯录中。
那么,有什么想法吗?
5个回答

21
[更新 - 2013年9月 - iOS7现在支持直接从网页下载VCARD并导入到本机联系人应用程序,因此只有在iOS6及以下版本不支持它时才需要下面的解决方案 - 随着苹果公司接受这一功能,情况可能会改变]
[更新于2013年1月 - 现已添加用户代理嗅探并合并为一个download.php文件,该文件检测iOS、Mobile Safari、UiWebView场景,以防止“Farme Load Interrupted”错误,并向所有获取.vcf嵌入.ics的Apple设备提供.vcf文件。] 请参见更新的完整解决方案 以下是通过Mobile Safari将联系人从网页下载到iPhone的替代方法的完整描述。基本思路是将所需的联系人信息作为文件附加在日历事件中,该事件由移动Safari处理。联系人文件本身在使用简单的PHP脚本动态生成的日历文件中进行base64编码。因此,请继续阅读...

Basic layout of embedded VCARD in VCALENDAR file

只想要源代码?在这里下载 [iphone-contact-download-demo] 一个完全可用的HTML5 Web App,您可以自由复制和再生或者转到http://iphone.mobicontact.info查看一个工作演示。该演示使用了HTML5缓存清单,可以将内容下载到您的iPhone或支持HTML5的浏览器上供离线使用。如果您想了解更多关于"离线Web应用程序"的详情,请谷歌搜索。

在日历中嵌入VCARD以便iPhone下载 您可能已经知道,使用Mobile Safari无法直接从网页下载联系人文件(VCARD格式数据为.vcf文件)。浏览器无法识别.vcf扩展名和Mime类型(text/x-vcard)作为需要处理的信息。另外,Android和大多数其他移动设备可以轻松处理VCARD文件-标准本身就古老。

您也许会读到一些成果,并且请求用户的电子邮件地址,然后向他们发送联系人文件,或创建一个链接到Google Map条目并从中提取联系信息(在英国需要几周时间才能获得Google Map条目)。

虽然这两种方法都是可行的解决方案,但我认为它们并不用户友好。我曾试图说服我的一位客户在移动 Web 应用程序上接受其中之一,但未能成功。

此时,我还应该提到您可以下载一些第三方应用程序来添加对 VCARD (.vcf) 文件的支持,例如 Kerem Erkan 的出色 QR 阅读器和他关于此主题和 iPad 解决方案的博客上的 QRAFTER 和 VCARD GETTER,以及 HIPSCAN vcard 导入程序。但我认为假设您的读者已安装了这些应用程序是太过乐观了,因此我寻找了一种替代解决方案,而不是使用电子邮件、Google 地图或第三方应用程序。

在继续之前,有许多链接描述了该问题:

Stack Overflow 上有几个与此主题相关的线程 强制 vCard 下载 (thesheep.co.uk) Code Train 的电子邮件解决方案及其相关博客,点击此处获取 vCard 下载选项 这里还有一个可能的解决方案使用 Google 地图。Dataplex 也涵盖了这篇文章。 Jonas Schmid 谈论了正确提供文件类型的方法。 MacRumours 线程

然后我开始思考,iPhone在IOS5及以上版本支持从网页下载的vcalendar文件。VCALENDAR文件通常具有.ics扩展名,并由移动Safari处理,弹出一个窗口,可以打开和保存到日历中。我发现令人难以置信的是,苹果和移动Safari支持VCAL文件但不支持VCARD文件,但事实就是如此。那么如果我能将VCARD文件附加到VCALENDAR文件上会怎样呢?
首先要克服的障碍是在日历事件中添加附件...
起初,我尝试在Windows的Outlook日历约会中添加附件,虽然可能,但从网页链接时未正确下载,而且肯定没有产生我想要的结果。因此,我决定尝试使用苹果软件,毕竟我们正在尝试下载到iPhone上。使用苹果的默认日历应用程序“iCal”存在一个根本性问题 - 无法向事件/日历约会添加附件!所以我谷歌了“在OSX中向日历事件添加附件”或类似的内容,并找到了这篇优秀的文章,指引我朝着正确的方向前进。 在OSX中向日历约会添加附件。 几分钟后,我安装了BusyCal,并成功创建了一个事件并将VCARD文件附加到其中(先前从我的OSX联系人中保存/导出)。此步骤仅为了理解添加附件时创建的文件格式-您无需安装BusyCal即可实现下面描述的解决方案,但我包括它以供参考,以便您可以看到如何将VCARD嵌入VCALENDAR / VEVENT(.ics)文件。
我使用的步骤是在运行OSX Lion的苹果iMac上完成的。

将联系人从您的联系人/通讯录导出以创建VCARD文件(.vcf) - 您可以使用文本编辑器编辑此文件以剥离所有额外的内容,例如UID和PROD-ID。BEGIN: VCARD 版本:3.0 N:Contact;iPhone;;; FN:iPhone Contact 电子邮件;类型=INTERNET;类型=WORK;类型=pref:iphone@mobicontact.info 电话;类型=CELL;类型=VOICE;类型=pref:012-345-6789 END: VCARD 创建一个新日历 - 可以随意命名,我使用了“vcal” - 在“我的Mac”区域,这样当您导出此日历以生成.ics文件时,您只会得到带有附加卡片的单个事件,而不是如果您使用现有日历可能拥有的所有事件。 创建一个新事件 - 随意命名 - 并赋予其任意时间和日期。 将来自(1)的VCARD文件附加到此新事件 - 请参见屏幕截图。BusyCal on iMac allows attachements to VCALENDAR appointments 将事件保存到日历中。 从BusyCal的主菜单中,将日历导出到本地磁盘上的.ics文件 - 在此处下载zip文件-->带有附加联系人文件的Apple日历事件。 现在,您可以使用您喜欢的文本编辑器来检查苹果如何在日历事件中存储附件,结果是使用:ATTACH;VALUE=BINARY;ENCODING=BASE64;FMTTYPE=text/directory; X-APPLE-FILENAME=iPhone Contact.vcf: QkVHSU46VkNBUkQNClZFUlNJT046M...等等... [base64编码的VCARD] 因此,我随后剥离了所有我不需要的额外内容(在这里进行试验和错误),直到我仍然被iPhone识别为带有附件的有效日历事件的绝对最少。 这样做的原因是使创建最终网页上的日历事件的PHP文件尽可能简单 - 这是我将其减少到的vcal-minimal。

所以,以上所有内容都不是实现联系人下载解决方案所必需的 - 我只是想向您展示我如何理解苹果使用X-APPLE-FILENAME联系人行附加文件的方式。当然,他们如何使用base64编码对VCARD数据进行编码。现在我们拥有了所有需要创建VEVENT并将VCARD附加到其中的信息,可以通过Mobile Safari直接下载到iPhone。

1)上传您想要下载的联系人文件(.vcf)- 您需要此文件以便可以将其直接下载到非iPhone或对iPhone进行base64编码。

2)创建指向PHP文件的链接,该文件将动态生成日历事件,例如: 在HTML5移动应用程序中下载iPhone联系人,如下所示: Simple link to the PHP file to download the contact within VCALENDAR

3) 创建或上传包含此处iphonecontact-source-code代码的vcal.php。该PHP文件应用正确的头/内容类型以下载日历文件,然后您可以选择直接获取日历文件内容"iphonecontact.ics",就像在"vcal-from-file.php"中一样,或者像"vcal.php"中所示动态生成日历。我更喜欢后者,因为您会得到一个带有时间戳的漂亮的日历事件,显示下载的时间和日期。

4) 就是这样!现在在您的iPhone上浏览网页并单击链接执行"vcal.php"。您的浏览器现在应该显示iphonecontact.ics文件,并要求您在手机日历应用程序中打开它 Calendar appointment downloaded from web page

5) 选择“在...中打开”,然后您将看到日历约会和附加的联系人文件。 Calendar event with attached contact file

6)请注意我如何将日历事件的标题设置为有用的内容,以告诉用户如何处理嵌入的联系人文件(您可以在vcal.php中看到设置事件SUMMARY字段的行)。现在单击附加的联系人文件...

Opened contact file

7)然后“创建新联系人”,你就快完成了... Contact SAVED!!!

保存联系人并在心里咒骂苹果让你跳过这些步骤!

现在根据我在使用此技术的经验,我想提出几点说明:

使用缓存清单-如果已缓存,则在提供日历文件(iphonecontact.ics)时可能会出现一些意外行为/问题-我无法使其正常工作,因此将其从清单中排除,这意味着它始终会被下载-源代码包含在此zip文件iphonecontact-source-code中。

我添加了一些用户代理嗅探来检测“vcal.php”或您称之为什么(在最新的在线示例中为download.php)PHP文件是否向iPhone提供VCALENDAR文件,向所有其他浏览器提供VCARD文件本身。

请注意,如果在UiWebView应用程序中查看,则会将用户重定向到一个页面,该页面显示使用Mobile Safari打开(如我的博客上某人建议的),否则您会遇到可怕的“Frame Load Interrupted”错误。
我想这就是所有内容了 - 所以总结一下:
移动Safari不直接支持VCARD(.vcf)文件,但支持VCALENDAR(.ics)文件。
目前最好的解决方案是通过请求用户的电子邮件地址来通过电子邮件发送联系人,或将联系人嵌入谷歌地图链接中,或下载处理VCARDS的应用程序。
苹果确实支持日历文件的附件,但不容易,因此一旦我们知道如何做到这一点,我们可以在PHP中完成它。
将VCARD嵌入VCALENDAR文件中,以允许用户只需单击几下即可将联系人保存到他们的通讯簿中。
希望您喜欢这个解决方案 - 这是我认为我们能够获得的最好的方案,直到苹果放弃并允许移动Safari接受VCARD文件。
直到下次...

当我删除了你的其他答案时,我们仍然停留在原地。你必须做更多的事情,而不仅仅是发布博客链接。否则,当您更改URL或您的博客停止运行时会发生什么?我们将失去宝贵的信息。 - George Stocker
我将完整的解决方案重新托管在repl.it上,因为原始网站已经无法访问:https://mobicontact.nmu131.repl.co - nmu

11

虽然略微超出了我的最初要求的范围,但我已经找到了一个我能够使用的解决方案。

事实证明,如果您收到一个包含vcard附件的电子邮件,则可以打开此附件并将其添加到您的地址簿中。因此,如果您不提供vcard下载链接给iPhone用户,而是提供一种通过电子邮件发送vcard的方式,那么他们就能够将该卡添加到他们的地址簿中。

这是一个稍微绕路的解决方案,但在苹果公司不允许您本地执行此操作时,这是我能够想到的最佳解决方案。毕竟,这比什么都不做要好得多。

最终我写了一篇关于此的博客文章:从网页向您的iPhone地址簿添加vCard


4
如果链接失效会发生什么?那么这个答案对其他人就没有用了。请在这里包含相关部分。 - George Stocker
您介意发布一下PHP代码,以便将VCARD作为附件发送电子邮件吗? - donturner

6
截至本篇文章,对于谷歌员工而言,在iOS 7(beta 6)中,该文件可以直接打开到联系人应用程序并保存。

如果文件只包含一个联系人,则为“是”。对于多个联系人则为“否”。 - boxed

3

我已经成功地将以下资源应用到Web应用程序中:

已确认在Android、IOS和Outlook上正常工作。


那对于一个VCF文件中的多个联系人有效吗? - boxed

0
根据参考库,无法将联系人添加到iPhone的通讯录中。 可用的方案有:邮件、电话、短信、地图、YouTube和iTunes链接。 iPhone URL Scheme Reference

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接