我正在尝试创建一个二维码,以便iPhone用户可以导入我的地址簿信息.我是这样做的:
将VCF(vcard)文件放在我的Web服务器上
创建包含此URL的QR图像.
http://markharrison.net/mh-vcf-small.png
这适用于我的桌面浏览器(它使用地址簿应用程序打开vcard).
在iPhone上,QR阅读器成功告诉safari访问vcard,但之后safari抱怨它不知道如何处理vcard.我已经确认Content-Type: text/x-vcard
正在发送.
所以,我的问题:
如何让Safari识别我的vcard?
Safari还能识别出另一种卡片格式吗?
Steve Grove.. 15
[更新 - 2013年9月 - iOS7现在支持直接下载VCARD文件并导入到本机联系人应用程序]
function isiOS7($user_agent=NULL) { if(!isset($user_agent)) { $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; } return (strpos($user_agent, 'OS 7') !== FALSE); } # Output file contents - simple version if(!isIphone() || isiOS7()) { # Send correct headers header("Content-type: text/x-vcard; charset=utf-8"); // Alternatively: application/octet-stream // Depending on the desired browser behaviour // Be sure to test thoroughly cross-browser header("Content-Disposition: attachment; filename=\"iphonecontact.vcf\";"); # Output file contents echo file_get_contents("iphonecontact.vcf"); exit(); }
以下是通过Mobile Safari将联系人从网页下载到iPhone的替代方法的完整描述.基本思想是将所需的联系信息作为文件附加到由移动野生动物园处理的日历事件中.联系人文件本身使用简单的PHP脚本动态地在日历文件中进行base64编码.所以请继续阅读......
只想要源代码?这里[iphone接触下载,试玩]为全面工作的HTML5 Web应用程序,你可以自由复制和复制或去下载吧http://iphone.mobicontact.info了工作演示.该演示使用HTML5缓存清单,该清单将内容下载到支持iphone或HTML5的浏览器,以便在脱机时使用.如果您想了解更多信息,请访问google了解有关"离线网络应用"的更多详情.
用于iPhone下载的VCALENDAR中的嵌入式VCARD您可能已经读过,无法使用Mobile Safari从网页直接将联系人文件(VCARD格式数据为.vcf文件)下载到您的iPhone.浏览器只是无法将.vcf扩展名和mime类型(text/x-vcard)识别为应该处理的内容.另外,Android和大多数其他移动设备应该能够轻松处理VCARD文件 - 标准本身就像山丘一样古老!
您可能还读过,通过请求用户的电子邮件地址,然后通过电子邮件发送联系人文件或创建指向Google地图条目的链接并从中提取联系信息(谷歌地图条目需要数周才能实现),可以实现可行的工作.在英国).
虽然这些都是可行的解决方案,但它们并不是我称之为用户友好的方式,我试图让我的客户接受其中任何一个用于在移动网络应用上下载联系人,但未成功.
现在,我还要提到你可以下载一些第三方应用程序来增加对VCARD(.vcf)文件的支持 - 比如来自Kerem Erkan优秀QR阅读器的QRAFTER和VCARD GETTER以及他关于这个主题和iPad解决方案的博客,和HIPSCAN vcard导入程序.但假设您的读者安装了这些应用程序是我认为的一步太远,所以我搜索了电子邮件,谷歌地图和第三方应用程序的替代解决方案.
在继续之前,有许多链接更详细地描述了这个问题:
堆栈溢出在主题上有几个线程强制vCard下载(thesheep.co.uk)EMAIL解决方案和Code Train中的相关博客vCard下载选项此处还有一个可能的解决方案.Dataplex的这篇文章也涵盖了这一点.Jonas Schmid谈到正确提供文件类型.MacRumours线程
然后我想到,iPhone DOES支持从IOS5开始从网页下载的vcalendar文件.VCALENDAR文件通常具有.ics扩展名,并由移动safari处理,打开一个窗口,可以打开文件并将其保存到日历中.我发现Apple和Mobile Safari支持VCAL文件但不支持VCARD文件令人难以置信,但事实就是如此.那么如果我可以将VCARD文件附加到VCALENDAR文件呢?
第一个障碍是在日历活动中获得附件......
最初我尝试在Windows中添加附件到Outlook日历约会,虽然从网页链接时可能无法正确下载,但肯定没有产生我追求的结果.所以,我决定尝试使用Apple软件,毕竟我们正试图下载到iPhone上.使用Apple的默认日历应用程序"iCal"提出了一个基本问题 - 您无法在事件/日历约会中添加附件!所以我用Google搜索"在OSX中添加附件到日历事件"或类似内容,并发现这篇优秀的文章指出了我正确的方向.
在OSX中向日历约会添加附件.
所以,几分钟后,用安装BusyCal的副本,我能够创建一个事件并附加一个vCard文件给它(先前保存/ OSX中从我的联系人导出).此步骤仅用于了解将附件添加到日历项时创建的文件的格式 - 您不需要安装BusyCal来实现下面描述的解决方案,但我将其包含在内以供参考,以便您可以看到VCARD如何嵌入在VCALENDAR/VEVENT(.ics)文件中.
我使用的步骤是在运行OSX Lion的Apple iMac上:
从联系人/地址簿导出联系人以创建VCARD文件(.vcf) - 您可以使用文本编辑器编辑此文件,以删除所有额外的内容,如UID和PROD-ID(如果您愿意).
BEGIN:VCARD
VERSION:3.0
N:Contact;iPhone;;;
FN:iPhone Contact
EMAIL;type=INTERNET;type=WORK;type=pref:iphone@mobicontact.info
TEL;type=CELL;type=VOICE;type=pref:012-345-6789
END:VCARD
创建一个新的日历 - 按照你喜欢的方式调用它,我在"我的Mac"区域使用"vcal",这样当你导出这个日历来生成.ics文件时,所有你得到的就是带有附加卡的单个事件而不是您使用现有日历时可能拥有的所有事件.创建一个新事件 - 称之为您喜欢的任何事件 - 并给它一个任意的时间和日期.将(1)中的VCARD文件附加到此新事件 - 请参阅屏幕截图.
将活动保存到日历.从BusyCal的主菜单中,将日历导出到本地磁盘上的.ics文件 - 在此处下载zip文件 - >附带联系人文件的Apple日历事件.您现在可以使用自己喜欢的文本编辑器来检查Apple如何在日历事件中存储附件,结果是使用:ATTACH; VALUE = BINARY; ENCODING = BASE64; FMTTYPE = text/directory; X-APPLE-FILENAME = iPhone Contact.vcf:QkVHSU46VkNBUkQNClZFUlNJT046M ...等... [base64编码的VCARD]然后我删除了我不需要的所有额外的东西(这里是试验和错误),直到我有绝对最小值仍然被iPhone识别为带有附件的有效日历活动.这样做的原因是使在最终网页上创建日历事件的PHP文件尽可能简单 - 这是我将其减少到的最小值.
因此,正如我所说,以上所有内容都没有必要实现联系人下载解决方案 - 我只想告诉您如何使用X-APPLE-FILENAME联系线了解Apple如何附加文件.当然,他们如何使用base64编码对VCARD数据进行编码.所以现在我们拥有了动态创建VEVENT所需的所有信息,并将VCARD附加到它们上,可以通过Mobile Safari直接下载到iPhone.
1)上传您要下载的联系人文件(.vcf) - 您将需要此文件,以便您可以将其直接下载到非iphone或base64编码为iPhone.
2)创建一个PHP文件的链接,该文件将动态生成日历事件,例如:下载联系人iPhone可能在HTML5移动应用程序中,如下所示:
3)使用iphonecontact-source-code中的代码创建或上传vcal.php.此PHP文件为要下载的日历文件应用正确的标题/内容类型,然后您可以选择直接获取日历文件内容"iphonecontact.ics",如"vcal-from-file.php"中所示,或生成飞行中的日历,如"vcal.php"所示.后者是我首选的方法,因为你得到一个很好的带时间戳的日历事件,显示下载的时间和日期.
4)就是这样!你们都已经设置好了 - 现在浏览到iphone上的网页,然后点击链接执行"vcal.php".您的浏览器现在应该显示iphonecontact.ics文件,并要求您在手机日历应用程序中打开它
5)选择"打开...",您将看到日历约会和附加的联系人文件.
6)注意我如何将日历事件的标题设置为有用的信息告诉用户如何处理嵌入的联系人文件(您可以在vcal.php中看到为事件设置SUMMARY字段的行).现在点击附加的联系人文件......
7)然后"创建新的联系人",你几乎就在那里......
保存接触并诅咒苹果让你跳过的箍环!
现在根据我在HTML5网络应用上使用这种技术的经验,我想提到几点:
使用缓存清单 - 我有一些意外的行为/问题服务于日历文件(iphonecontact.ics),如果它已被缓存 - 我只是无法让它工作,所以我从清单中排除它,这意味着它总是下载 - 源代码包含在此zip文件中iphonecontact-source-code.
你当然可以做一些用户代理嗅探,在"vcal.php"PHP文件中检测是否将VCALENDAR文件提供给iPhone,将VCARD文件本身提供给所有其他浏览器.它是一个简单的检查,并通过谷歌搜索记录良好,所以如果你需要,我会留下你想出来,如果你这样做,可以随意发布代码.
我认为就是这样 - 所以总结一下:
Mobile safari不直接支持VCARD(.vcf)文件,但支持VCALENDAR(.ics)文件.
目前最好的解决方案是通过请求用户电子邮件地址向联系人发送电子邮件,或者将联系人嵌入谷歌地图链接或下载处理VCARDS的应用程序.
Apple确实支持日历文件的附件,但不容易,所以一旦我们知道如何完成,我们就可以用PHP来完成.
将VCARD嵌入到VCALENDAR文件中,以允许用户只需额外点击一两次就可以将联系人保存到他们的地址簿中.
我希望你喜欢这个解决方案 - 它就像我认为的那样好,直到Apple放弃并允许Mobile Safari接受VCARD文件.
直到下一次...
[更新 - 2013年9月 - iOS7现在支持直接下载VCARD文件并导入到本机联系人应用程序]
function isiOS7($user_agent=NULL) { if(!isset($user_agent)) { $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; } return (strpos($user_agent, 'OS 7') !== FALSE); } # Output file contents - simple version if(!isIphone() || isiOS7()) { # Send correct headers header("Content-type: text/x-vcard; charset=utf-8"); // Alternatively: application/octet-stream // Depending on the desired browser behaviour // Be sure to test thoroughly cross-browser header("Content-Disposition: attachment; filename=\"iphonecontact.vcf\";"); # Output file contents echo file_get_contents("iphonecontact.vcf"); exit(); }
以下是通过Mobile Safari将联系人从网页下载到iPhone的替代方法的完整描述.基本思想是将所需的联系信息作为文件附加到由移动野生动物园处理的日历事件中.联系人文件本身使用简单的PHP脚本动态地在日历文件中进行base64编码.所以请继续阅读......
只想要源代码?这里[iphone接触下载,试玩]为全面工作的HTML5 Web应用程序,你可以自由复制和复制或去下载吧http://iphone.mobicontact.info了工作演示.该演示使用HTML5缓存清单,该清单将内容下载到支持iphone或HTML5的浏览器,以便在脱机时使用.如果您想了解更多信息,请访问google了解有关"离线网络应用"的更多详情.
用于iPhone下载的VCALENDAR中的嵌入式VCARD您可能已经读过,无法使用Mobile Safari从网页直接将联系人文件(VCARD格式数据为.vcf文件)下载到您的iPhone.浏览器只是无法将.vcf扩展名和mime类型(text/x-vcard)识别为应该处理的内容.另外,Android和大多数其他移动设备应该能够轻松处理VCARD文件 - 标准本身就像山丘一样古老!
您可能还读过,通过请求用户的电子邮件地址,然后通过电子邮件发送联系人文件或创建指向Google地图条目的链接并从中提取联系信息(谷歌地图条目需要数周才能实现),可以实现可行的工作.在英国).
虽然这些都是可行的解决方案,但它们并不是我称之为用户友好的方式,我试图让我的客户接受其中任何一个用于在移动网络应用上下载联系人,但未成功.
现在,我还要提到你可以下载一些第三方应用程序来增加对VCARD(.vcf)文件的支持 - 比如来自Kerem Erkan优秀QR阅读器的QRAFTER和VCARD GETTER以及他关于这个主题和iPad解决方案的博客,和HIPSCAN vcard导入程序.但假设您的读者安装了这些应用程序是我认为的一步太远,所以我搜索了电子邮件,谷歌地图和第三方应用程序的替代解决方案.
在继续之前,有许多链接更详细地描述了这个问题:
堆栈溢出在主题上有几个线程强制vCard下载(thesheep.co.uk)EMAIL解决方案和Code Train中的相关博客vCard下载选项此处还有一个可能的解决方案.Dataplex的这篇文章也涵盖了这一点.Jonas Schmid谈到正确提供文件类型.MacRumours线程
然后我想到,iPhone DOES支持从IOS5开始从网页下载的vcalendar文件.VCALENDAR文件通常具有.ics扩展名,并由移动safari处理,打开一个窗口,可以打开文件并将其保存到日历中.我发现Apple和Mobile Safari支持VCAL文件但不支持VCARD文件令人难以置信,但事实就是如此.那么如果我可以将VCARD文件附加到VCALENDAR文件呢?
第一个障碍是在日历活动中获得附件......
最初我尝试在Windows中添加附件到Outlook日历约会,虽然从网页链接时可能无法正确下载,但肯定没有产生我追求的结果.所以,我决定尝试使用Apple软件,毕竟我们正试图下载到iPhone上.使用Apple的默认日历应用程序"iCal"提出了一个基本问题 - 您无法在事件/日历约会中添加附件!所以我用Google搜索"在OSX中添加附件到日历事件"或类似内容,并发现这篇优秀的文章指出了我正确的方向.
在OSX中向日历约会添加附件.
所以,几分钟后,用安装BusyCal的副本,我能够创建一个事件并附加一个vCard文件给它(先前保存/ OSX中从我的联系人导出).此步骤仅用于了解将附件添加到日历项时创建的文件的格式 - 您不需要安装BusyCal来实现下面描述的解决方案,但我将其包含在内以供参考,以便您可以看到VCARD如何嵌入在VCALENDAR/VEVENT(.ics)文件中.
我使用的步骤是在运行OSX Lion的Apple iMac上:
从联系人/地址簿导出联系人以创建VCARD文件(.vcf) - 您可以使用文本编辑器编辑此文件,以删除所有额外的内容,如UID和PROD-ID(如果您愿意).
BEGIN:VCARD
VERSION:3.0
N:Contact;iPhone;;;
FN:iPhone Contact
EMAIL;type=INTERNET;type=WORK;type=pref:iphone@mobicontact.info
TEL;type=CELL;type=VOICE;type=pref:012-345-6789
END:VCARD
创建一个新的日历 - 按照你喜欢的方式调用它,我在"我的Mac"区域使用"vcal",这样当你导出这个日历来生成.ics文件时,所有你得到的就是带有附加卡的单个事件而不是您使用现有日历时可能拥有的所有事件.创建一个新事件 - 称之为您喜欢的任何事件 - 并给它一个任意的时间和日期.将(1)中的VCARD文件附加到此新事件 - 请参阅屏幕截图.
将活动保存到日历.从BusyCal的主菜单中,将日历导出到本地磁盘上的.ics文件 - 在此处下载zip文件 - >附带联系人文件的Apple日历事件.您现在可以使用自己喜欢的文本编辑器来检查Apple如何在日历事件中存储附件,结果是使用:ATTACH; VALUE = BINARY; ENCODING = BASE64; FMTTYPE = text/directory; X-APPLE-FILENAME = iPhone Contact.vcf:QkVHSU46VkNBUkQNClZFUlNJT046M ...等... [base64编码的VCARD]然后我删除了我不需要的所有额外的东西(这里是试验和错误),直到我有绝对最小值仍然被iPhone识别为带有附件的有效日历活动.这样做的原因是使在最终网页上创建日历事件的PHP文件尽可能简单 - 这是我将其减少到的最小值.
因此,正如我所说,以上所有内容都没有必要实现联系人下载解决方案 - 我只想告诉您如何使用X-APPLE-FILENAME联系线了解Apple如何附加文件.当然,他们如何使用base64编码对VCARD数据进行编码.所以现在我们拥有了动态创建VEVENT所需的所有信息,并将VCARD附加到它们上,可以通过Mobile Safari直接下载到iPhone.
1)上传您要下载的联系人文件(.vcf) - 您将需要此文件,以便您可以将其直接下载到非iphone或base64编码为iPhone.
2)创建一个PHP文件的链接,该文件将动态生成日历事件,例如:下载联系人iPhone可能在HTML5移动应用程序中,如下所示:
3)使用iphonecontact-source-code中的代码创建或上传vcal.php.此PHP文件为要下载的日历文件应用正确的标题/内容类型,然后您可以选择直接获取日历文件内容"iphonecontact.ics",如"vcal-from-file.php"中所示,或生成飞行中的日历,如"vcal.php"所示.后者是我首选的方法,因为你得到一个很好的带时间戳的日历事件,显示下载的时间和日期.
4)就是这样!你们都已经设置好了 - 现在浏览到iphone上的网页,然后点击链接执行"vcal.php".您的浏览器现在应该显示iphonecontact.ics文件,并要求您在手机日历应用程序中打开它
5)选择"打开...",您将看到日历约会和附加的联系人文件.
6)注意我如何将日历事件的标题设置为有用的信息告诉用户如何处理嵌入的联系人文件(您可以在vcal.php中看到为事件设置SUMMARY字段的行).现在点击附加的联系人文件......
7)然后"创建新的联系人",你几乎就在那里......
保存接触并诅咒苹果让你跳过的箍环!
现在根据我在HTML5网络应用上使用这种技术的经验,我想提到几点:
使用缓存清单 - 我有一些意外的行为/问题服务于日历文件(iphonecontact.ics),如果它已被缓存 - 我只是无法让它工作,所以我从清单中排除它,这意味着它总是下载 - 源代码包含在此zip文件中iphonecontact-source-code.
你当然可以做一些用户代理嗅探,在"vcal.php"PHP文件中检测是否将VCALENDAR文件提供给iPhone,将VCARD文件本身提供给所有其他浏览器.它是一个简单的检查,并通过谷歌搜索记录良好,所以如果你需要,我会留下你想出来,如果你这样做,可以随意发布代码.
我认为就是这样 - 所以总结一下:
Mobile safari不直接支持VCARD(.vcf)文件,但支持VCALENDAR(.ics)文件.
目前最好的解决方案是通过请求用户电子邮件地址向联系人发送电子邮件,或者将联系人嵌入谷歌地图链接或下载处理VCARDS的应用程序.
Apple确实支持日历文件的附件,但不容易,所以一旦我们知道如何完成,我们就可以用PHP来完成.
将VCARD嵌入到VCALENDAR文件中,以允许用户只需额外点击一两次就可以将联系人保存到他们的地址簿中.
我希望你喜欢这个解决方案 - 它就像我认为的那样好,直到Apple放弃并允许Mobile Safari接受VCARD文件.
直到下一次...
我刚刚在我的博客上发布了一个替代解决方案,该解决方案描述了如何将联系人文件作为附件添加到日历文件中,该日历文件由iOS5以后的移动safari处理.
http://mobicontact.info/iphone/download-contact-from-web-page/
该博客显示了完整的解决方案,包括整个过程的源代码和图像,因此比我在Stack Overflow上提供的内容更容易阅读.需要注意的要点是Apple使用:
ATTACH;VALUE=BINARY;ENCODING=BASE64;FMTTYPE=text/directory; X-APPLE-FILENAME=iPhone Contact.vcf: QkVHSU46VkNBUkQNClZFUlNJT046M…etc… [base64 encoded VCARD]
用于VCALENDAR文件中的嵌入式VCARD.创建一个VCALENDAR文件,然后在其中对您的VCARD进行base64编码 - 下面的代码片段(我博客上的完整详细信息)