iPhone: как заставить safari распознать vcard?

Я пытаюсь создать QR-код, чтобы пользователи iPhone могли импортировать информацию о моей адресной книге. Я делаю это:

  • размещение файла VCF (vcard) на моем веб-сервере
  • создание QR-изображения, содержащего этот URL.

http://markharrison.net/mh-vcf-small.png

это работает на моем настольном браузере (он открывает vcard с приложением адресной книги).

на iPhone, считыватель QR успешно сообщает safari для доступа к vcard, но затем safari жалуется, что не знает, как обрабатывать vcard. Я подтвердил это Content-Type: text/x-vcard отправлено.

Итак, мои вопросы:

  • как заставить Safari распознать мою vcard?
  • есть ли другой формат карты, который распознает safari?

2 ответов


[UPDATED-Sep 2013-iOS7 теперь поддерживает прямую загрузку файлов VCARD и импорт в приложение native Contacts]

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();
}

ниже приводится полное описание альтернативного способа загрузки контактов с веб-страницы на iPhone с помощью мобильного Safari. Основная идея состоит в том, чтобы прикрепить необходимую контактную информацию в виде файла в событии календаря, которое обрабатывается mobile safari. Сам файл контакта base64 закодирован в файле календаря на лету с помощью простой PHP скрипт. Так что читайте дальше...

Basic layout of embedded VCARD in VCALENDAR file

просто хотите исходный код? Загрузите его здесь [iphone-contact-download-demo] для полностью работающего веб-приложения HTML5, которое вы можете скопировать и воспроизвести или перейти кhttp://iphone.mobicontact.info для рабочей демонстрации. Демонстрация использует манифест кэша HTML5, который загружает контент на ваш iphone или HTML5, поддерживающий браузер для использования в автономном режиме. Пожалуйста, google для получения более подробной информации о "offline web apps", если ты хочешь знать больше.

встроенный VCARD в VCALENDAR для iPhone Скачать Возможно, вы читали, что невозможно загрузить файлы контактов (данные формата VCARD as .vcf файл) прямо на ваш iPhone с веб-страницы с помощью мобильного Safari. Браузер просто не распознает .расширение vcf и тип mime (text/x-vcard) как то, что он должен обрабатывать. В стороне, Android и большинство других мобильных устройств должны иметь возможность обрабатывать файлы VCARD достаточно легко - сам стандарт так же стар как холмы!

вы, возможно, также прочитали, что можно достичь чего-то работоспособного, запросив адрес электронной почты пользователей, а затем отправить им контактный файл или создать ссылку на запись Карты Google и извлечь контактную информацию из этого (запись Карты Google требует недель, чтобы достичь в Великобритании).

хотя это оба жизнеспособных решения, они не то, что я бы назвал удобным для пользователя, и я безуспешно пытался заставить моего клиента принять либо один из них для их контакта скачать на мобильном веб-приложении.

теперь на этом этапе я должен также упомянуть, что вы можете скачать некоторые сторонние приложения, которые добавляют поддержку VCARD (.vcf) файлы-такие как QRAFTER и vCard GETTER как от превосходного QR-ридера Керема Эркана и его блога на эту тему и решение iPad, и импортер hipscan vcard. Но предполагая, что ваши читатели установили эти приложения, на мой взгляд, слишком далеко, поэтому я искал альтернативное решение для электронной почты, google карты и сторонние приложения.

прежде чем я продолжу, есть много ссылок, описывающих проблему более подробно:

переполнение стека имеет несколько потоков на эту тему Forcing vCard загрузить (thesheep.co.Великобритания) Решение электронной почты и связанный блог из кода поезда здесь параметры vCard для загрузки Также возможное решение с помощью карты Google. И это также охватывается этой статьей из Dataplex. Jonas Schmid рассказывает о обслуживании типов файлов правильно. MacRumours thread

затем я подумал, что iPhone поддерживает файлы vcalendar, загруженные с веб-страницы с IOS5. Файлы VCALENDAR обычно имеют a .расширение ics и обрабатываются mobile safari, вызывая окно, в котором файл может быть открыт и сохранен в календаре. Я считаю невероятным, что Apple и Mobile Safari поддерживают файлы VCAL, но не файлы VCARD, но это именно так. Так что, если бы я мог прикрепить файл VCARD к VCALENDAR файл?

первое препятствие - получение вложения в событии календаря...

Первоначально я попытался добавить вложение в назначение календаря Outlook В Windows, которое, хотя и возможно, не загружалось правильно при подключении с веб-страницы и, конечно, не дало результата, который я был после. Итак, я решил попробовать использовать программное обеспечение Apple, поскольку, в конце концов, мы пытаемся загрузить на iPhone. Использование приложения календаря Apple по умолчанию "iCal" представляет одну фундаментальную проблему - вы не можете добавлять вложения в событие / календарь встречи! Поэтому я погуглил "добавление вложений в события календаря в OSX" или аналогичные и нашел эту отличную статью, которая указала мне в правильном направлении.

добавление вложений в календарь встреч в OSX.

Итак, через несколько минут и с установленной копией BusyCal я смог создать событие и прикрепить к нему файл VCARD (ранее сохраненный/экспортированный из моих контактов в OSX). Этот шаг необходимо только понять формат файла, созданного при добавлении вложения в элемент календаря - вам не нужно устанавливать BusyCal для реализации решения, описанного ниже, но я включаю его для справки, чтобы вы могли видеть, как VCARD встроен в VCALENDAR/VEVENT (.ICS-файл.

шаги, которые я использовал, были на Apple iMac под управлением OSX Lion:

экспорт контакта из контактов/адресной книги для создания файла 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 Создайте новый календарь-называйте его как хотите, я использовал "vcal" - в области" на моем Mac", чтобы при экспорте этого календаря генерировать .ics файл, все, что вы получаете, это одно событие с прикрепленной картой, а не все события, которые вы могли бы иметь, если вы используете существующий календарь. Создайте новое событие-назовите его как хотите - и дайте ему произвольное время и дату. Прикрепите файл VCARD из (1) к этому новому событию - смотрите скриншот.BusyCal on iMac allows attachements to VCALENDAR appointments Сохраните событие в календаре. Из главного меню BusyCal экспортируйте календарь в an .ics-файл на локальном диске-загрузите zip-файл здесь --> событие Apple calendar с прикрепленным файлом контакта. Теперь вы можете использовать свой любимый текстовый редактор, чтобы проверить, как вложения Apple store в событиях календаря и результат использует: ATTACH; VALUE=BINARY; ENCODING=BASE64;FMTTYPE=text / directory; X-APPLE-имя файла=iPhone Контакт.фдв: QkVHSU46VkNBUkQNClZFUlNJT046M...так далее... [base64 закодированный файл vCard] Поэтому я удалил все лишние вещи, которые мне не нужны (проб и ошибок здесь), пока у меня не было абсолютного минимума, который все еще был признан iPhone как действительное событие календаря с вложением. Причина этого заключается в том, чтобы сделать PHP - файл, который создает событие календаря на конечной веб-странице, как можно проще-вот vcal-минимальный из того, к чему я его сократил.

Итак, все вышеперечисленное, как я уже сказал, нет необходимости реализовывать решение для загрузки контактов - я просто хотел показать вам, как я понял, как Apple прикрепляет файлы, используя контактную линию X-APPLE-FILENAME. И, конечно же, как они кодируют данные VCARD, используя кодировку base64. Итак, теперь у нас есть вся информация, необходимая для создания VEVENTs на лету и прикрепления к ним VCARDs, которые можно загрузить прямо на iPhone через Mobile Safari.

1) Загрузить файл контакта (.vcf) вы хотите быть загружены - вам это понадобится файл, так что вы можете загрузить его прямо на не-iphones или base64 кодировать его для iPhone.

2) Создайте ссылку на файл PHP, который будет генерировать событие календаря на лету, например: Скачать Contact iPhone возможно в мобильном приложении HTML5, как показано ниже: Simple link to the PHP file to download the contact within VCALENDAR

3) Создайте или загрузите vcal.php с кодом здесь iphonecontact-исходный код. Этот файл PHP применяет правильный тип заголовка / содержимого для файла календаря, который будет загружен, тогда у вас есть выбор либо получение содержимого файла календаря напрямую " iphonecontact.ics "как сделано в" vcal-from-file.php " или создание календаря на лету, как показано в "vcal.РНР." Последний является моим предпочтительным методом, потому что вы получаете хорошее событие календаря с отметкой времени, показывающее время и дату загрузки.

4) Вот оно! Вы все готовы-Теперь перейдите на веб-страницу на вашем iphone и нажмите ссылку, чтобы выполнить "vcal.РНР." Теперь ваш браузер должен показать 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!!!

сохранить контакт и проклятие под дыханием на обручи Яблоко заставило вас прыгать через!

теперь есть несколько моментов, которые я хотел бы упомянуть здесь, основываясь на моем опыте использования этой техники в веб-приложениях HTML5:

использование манифеста кэша-у меня было неожиданное поведение / проблемы с обслуживанием файла календаря (iphonecontact.ics), если бы он был кэширован - я просто не мог заставить его работать, поэтому я исключите его из манифеста, что означает, что он всегда загружается - исходный код включен в этот zip-файл iphonecontact-source-code.

вы могли бы, конечно, сделать какой-то агент пользователя нюхает, чтобы обнаружить в " vcal.php " PHP-файл должен ли служить файлу VCALENDAR для iPhone и самому файлу VCARD для всех других браузеров. Его достаточно простая проверка и хорошо документирована через поиск google, поэтому я оставлю это вам, чтобы выяснить, если вам нужно, и не стесняйтесь публиковать код здесь, если вы делаете.

я думаю, что об этом-так резюмировать:

Mobile safari не поддерживает VCARD (.VCF) файлы напрямую, но поддерживает VCALENDAR (.ICS-файл.

  • текущие лучшие решения-отправить контакт по электронной почте, запросив адрес электронной почты пользователей или встроить контакт в ссылку Google map или загрузить приложение, которое обрабатывает VCARDS.
  • Apple поддерживает вложения в файлы календаря, но не так легко, как мы знаем как это делается мы можем сделать это в PHP.
  • вставьте VCARD в файл VCALENDAR, чтобы пользователь мог сохранить контакт в свою адресную книгу одним или двумя щелчками мыши.

Я надеюсь, вам понравится это решение - это так же хорошо, как я думаю, что мы получим, пока Apple не смягчится и не позволит Mobile Safari принимать файлы VCARD.

до следующего раза...


Я только что опубликовал альтернативное решение в своем блоге, в котором описывается, как прикрепить файл контакта в качестве вложения в файл календаря, который обрабатывается mobile safari от iOS5 и далее.

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]

для встроенного VCARD в файлах VCALENDAR. Создайте файл VCALENDAR, а затем base64 Закодируйте свою VCARD в нем-фрагмент кода ниже (полная информация в моем блоге)

<?php
# Send correct headers      
header("Content-type: text/x-vcalendar; 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.ics\";");
# Output file contents - simple version
#echo file_get_contents("iphonecontact.ics");

# Generate file contents - advanced version
# BEGIN:VCALENDAR
# VERSION:2.0
# BEGIN:VEVENT
# DTSTART;TZID=Europe/London:20120617T090000
# DTEND;TZID=Europe/London:20120617T100000
# SUMMARY:iPhone Contact
# DTSTAMP:20120617T080516Z
# ATTACH;VALUE=BINARY;ENCODING=BASE64;FMTTYPE=text/directory;
#  X-APPLE-FILENAME=iphonecontact.vcf:
#  QkVHSU46VkNBUkQNClZFUlNJT046My4wDQpOOkNvbnRhY3Q7aVBob25lOzs7DQpGTjppUGhvbm
#  UgQ29udGFjdA0KRU1BSUw7VFlQRT1JTlRFUk5FVDtUWVBFPVdPUks6aXBob25lQHRoZXNpbGlj
#  b25nbG9iZS5jb20NClRFTDtUWVBFPUNFTEw7VFlQRT1WT0lDRTtUWVBFPXByZWY6KzQ0MTIzND
#  U2Nzg5MA0KRU5EOlZDQVJE
# END:VEVENT
# END:VCALENDAR

echo "BEGIN:VCALENDAR\n";
echo "VERSION:2.0\n";
echo "BEGIN:VEVENT\n";
echo "SUMMARY:Click attached contact below to save to your contacts\n";
$dtstart = date("Ymd")."T".date("Hi")."00";
echo "DTSTART;TZID=Europe/London:".$dtstart."\n";
$dtend = date("Ymd")."T".date("Hi")."01";
echo "DTEND;TZID=Europe/London:".$dtend."\n";
echo "DTSTAMP:".$dtstart."Z\n";
echo "ATTACH;VALUE=BINARY;ENCODING=BASE64;FMTTYPE=text/directory;\n";
echo " X-APPLE-FILENAME=iphonecontact.vcf:\n";
$vcard = file_get_contents("iphonecontact.vcf");        # read the file into memory
$b64vcard = base64_encode($vcard);                      # base64 encode it so that it can be used as an attachemnt to the "dummy" calendar appointment
$b64mline = chunk_split($b64vcard,74,"\n");             # chunk the single long line of b64 text in accordance with RFC2045 (and the exact line length determined from the original .ics file exported from Apple calendar
$b64final = preg_replace('/(.+)/', ' ', $b64mline);   # need to indent all the lines by 1 space for the iphone (yes really?!!)
echo $b64final;                                         # output the correctly formatted encoded text
echo "END:VEVENT\n";
echo "END:VCALENDAR\n";
?>