2009-12-12 149 views
10

我正在嘗試創建QR碼,以便iPhone用戶可以導入我的地址簿信息。iPhone:如何讓Safari瀏覽器識別電子名片?

  • 把一個VCF(虛擬卡)的文件我的Web服務器
  • 創建包含該網址的QR圖像:我做這個。

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

這是工作在我的桌面瀏覽器(它打開與地址簿應用程序的虛擬卡)。

在iPhone上,QR閱讀器成功告訴safari訪問vcard,但safari卻抱怨說它不知道如何處理vcard。我已確認Content-Type: text/x-vcard正在發送。

所以,我的問題:

  • 我如何獲得的Safari承認我的名片?
  • safari是否還有另外一種卡片格式?
+0

你看到了嗎? http://stackoverflow.com/questions/1773876/how-to-add-a-contact-to-the-iphones-address-book-from-a-web-page – wkw 2009-12-12 05:32:45

+0

我應該添加,雖然它不解決你的問題,別人試圖做同樣的事情,發現它的工作(顯然)從電子郵件味精。所以......哼。 – wkw 2009-12-12 05:34:42

+0

VCARD .vcf文件現在直接在iOS7中支持,因此我的答案不需要該操作系統。嘗試訪問http://mobicontact.info/iphone/ios7-supports-vcard-vcf-download-at-last/瞭解更多詳情。此外,您現在可以在您的網站上託管一個VCARD文件,甚至通過QR碼提供鏈接,它應該可以工作。 – 2013-09-19 11:14:34

回答

13

[增訂日 - 9月2013 - 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的替代方法的完整說明。基本的想法是將所需的聯繫信息作爲文件附加到由移動Safari瀏覽器處理的日曆事件中。聯繫人文件本身是使用簡單的PHP腳本在日曆文件中進行base64編碼的。因此,閱讀...

Basic layout of embedded VCARD in VCALENDAR file

只是想的源代碼?在此處下載它[iphone-contact-download-demo],您可以免費複製和複製完整正常工作的HTML5 Web應用程序,或轉至http://iphone.mobicontact.info進行演示。該演示使用HTML5緩存清單,將內容下載到您的iPhone或支持HTML5的瀏覽器以供離線時使用。請谷歌瞭解更多關於「離線網絡應用程序」的細節,如果你想知道更多。

用於iPhone的VCALENDAR嵌入式VCARD下載 您可能已經閱讀過無法下載聯繫人文件(VCARD格式數據爲。vcf文件)使用Mobile Safari從網頁直接導入您的iPhone。瀏覽器無法識別.vcf擴展名和MIME類型(文本/ x-vcard)作爲它應該處理的內容。另外,Android和大多數其他移動設備應該能夠輕鬆處理VCARD文件 - 標準本身就像山丘一樣古老!

您也許已經閱讀過,可以通過請求用戶的電子郵件地址,然後通過電子郵件向聯繫人文件發送電子郵件或創建指向Google Map條目的鏈接並從中提取聯繫人信息(Google Map條目需要數週才能在英國獲得)。

雖然這些都是可行的解決方案,但它們並不是我稱之爲用戶友好型的,我試圖讓我的客戶接受他們中的任何一個,以便在移動網絡應用程序上聯繫下載。

現在我應該提及您可以下載一些第三方應用程序,它們可以添加對VCARD(.vcf)文件的支持 - 例如QRer和QRer GETTER都來自Kerem Erkan出色的QR閱讀器和他的關於該主題的博客和iPad解決方案以及HIPSCAN vcard導入器。但假設您的讀者安裝了這些應用程序,我認爲這太過分了,所以我搜索了另一種電子郵件,谷歌地圖和第三方應用程序的解決方案。

我繼續之前,有許多環節描述更詳細的問題:

堆棧溢出,關於這個問題的 強制電子名片下載線程數(thesheep.co.uk) 的電子郵件解決方案,並從相關博客此處的代碼訓練電子名片選項可供下載 此處還有一個使用Google地圖的可能解決方案。 Dataplex的這篇文章也介紹了這一點。 Jonas Schmid談到正確地提供文件類型。 MacRumours線程

然後我想到了,iPhone支持從iOS5以上的網頁下載vcalendar文件。 VCALENDAR文件通常具有.ics擴展名,並通過移動Safari瀏覽器處理,打開一個窗口,可在其中打開文件並將其保存到日曆中。我發現Apple和Mobile Safari支持VCAL文件但不支持VCARD文件是令人難以置信的,但事實就是如此。那麼,如果我可以將VCARD文件附加到VCALENDAR文件?

第一個障礙是獲得一個日曆事件的附件...

起初我嘗試添加附件在Windows Outlook日曆約會,而這可能從一個網頁鏈接,肯定沒」時,沒有正確下載噸產生我以後的結果。所以,我決定嘗試使用Apple軟件,因爲畢竟我們正試圖下載到iPhone上。使用Apple的默認日曆應用程序「iCal」存在一個基本問題 - 您無法將附件添加到事件/日曆約會中!所以我搜索了一下「向OSX中的日曆事件添加附件」或類似內容,並發現了這篇出色的文章,指出了我的正確方向。

將附件添加到OSX中的日曆約會中。

所以幾分鐘後,安裝了BusyCal的一個副本後,我能夠創建一個事件並附加一個VCARD文件(之前從OSX中的聯繫人保存/導出)。此步驟僅用於瞭解將附件添加到日曆項目時創建的文件的格式 - 您不需要安裝BusyCal來實現下面所述的解決方案,但是我將其包含在內以供參考,以便您可以看到VCARD嵌入在VCALENDAR/VEVENT(.ics)文件中。

的步驟我以前是在一臺蘋果電腦運行的是OSX獅子:

出口從通訊錄中聯繫人/地址簿創建vCard文件(的.vcf) - 你可以用文本編輯器編輯這個文件如果你喜歡,可以去掉所有額外的東西,比如UID和PROD-ID。 BEGIN:VCARD VERSION:3.0 N:Contact;iPhone;;; FN:iPhone Contact EMAIL;type=INTERNET;type=WORK;type=pref:[email protected] TEL;type=CELL;type=VOICE;type=pref:012-345-6789 END:VCARD 在「在我的Mac」區域中創建一個新日曆 - 稱爲您喜歡的,我使用「vcal」 - 這樣當您導出此日曆以生成.ics文件時,所有您獲得的是單個事件附加的卡片,而不是您使用現有日曆時可能遇到的所有事件。 創建一個新事件 - 將其稱爲任何你喜歡的事物 - 並給它任意的時間和日期。 將(1)中的VCARD文件附加到此新事件中 - 請參見截圖。 BusyCal on iMac allows attachements to VCALENDAR appointments 將活動保存到日曆。 從BusyCal的主菜單中,將日曆導出到本地磁盤上的.ics文件 - 在此處下載zip文件 - >附帶聯繫人文件的Apple日曆事件。 現在,您可以使用自己喜歡的文本編輯器來檢查Apple如何在日曆事件中存儲附件,結果是使用:ATTACH; VALUE = BINARY; ENCODING = BASE64; FMTTYPE = text/directory; X-APPLE-FILENAME = iPhone Contact.vcf: QkVHSU46VkNBUkQNClZFUlNJT046M ...等等... [base64編碼的VCARD] 所以我然後剝去了所有額外的東西,我不需要(這裏試驗和錯誤),直到我有iPhone仍然將其視爲具有附件的有效日曆活動的絕對最小值。這樣做的原因是讓PHP文件在最終的網頁上儘可能簡單地創建日曆事件 - 這裏是我簡化它的vcal-minimal。

因此,正如我所說的,上述所有內容都不需要實現聯繫人下載解決方案 - 我只是想告訴您如何瞭解Apple如何使用X-APPLE-FILENAME聯繫線附加文件。當然,他們如何使用base64編碼對VCARD數據進行編碼。因此,現在我們擁有了所有需要的信息,以便即時創建VEVENT並將VCARD附加到它們,可以通過Mobile Safari直接下載到iPhone。

1)上傳您要下載的聯繫人文件(.vcf) - 您需要這個文件,以便您可以將其直接下載到非iphones或base64編碼爲iPhone。

2)創建一個鏈接到一個PHP文件,將動態生成的日曆事件,如: 下載跟iPhone也許在HTML5移動應用程序如下圖所示: Simple link to the PHP file to download the contact within VCALENDAR

3)創建或上傳vcal.php與代碼在這裏iphonecontact-source-code。該PHP文件爲要下載的日曆文件應用正確的標題/內容類型,然後您可以選擇直接在「vcal-from-file.php」中獲取日曆文件內容「iphonecontact.ics」,或者生成在「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!!!

保存在你的呼吸接觸和詛咒籃球蘋果讓你跳過!

現在有幾個點,我想基於使用的HTML5網頁應用這種技術我的經驗在這裏提到:

使用緩存清單 - 我有服務於日曆一些意想不到的行爲/問題文件(iphonecontact.ics) - 如果它已被緩存 - 我只是無法讓它工作,所以我排除它從清單,這意味着它總是下載 - 源代碼包含在此zip文件iphonecontact源代碼。

你當然可以做一些用戶代理嗅探來檢測「vcal.php」PHP文件中是否將VCALENDAR文件提供給iPhone,並將VCARD文件發送給所有其他瀏覽器。它是一個簡單的檢查,並通過谷歌搜索很好地記錄,所以我會留給你,如果你需要,並隨時在這裏發佈的代碼,如果你這樣做,你要弄清楚。

我認爲這就是它 - 這樣總結:

移動Safari瀏覽器不支持電子名片(的.vcf)文件直接但不支持VCALENDAR(的.ics)文件。

  • 目前最好的解決方案是通過請求用戶的電子郵件地址向聯繫人發送電子郵件或嵌入在一個谷歌地圖鏈接中的聯絡或下載,處理電子名片的應用程序。
  • Apple確實支持日曆文件的附件,但不容易,所以一旦我們知道如何做到這一點,我們可以在PHP中完成。
  • 將VCARD嵌入到VCALENDAR文件中,允許用戶只需額外點擊一兩次即可將聯繫人保存到他們的地址簿中。

我希望你喜歡這個解決方案 - 它和我認爲的一樣好,直到Apple放鬆並允許Mobile Safari接受VCARD文件。

直到下一次...

9

我剛剛在我的博客上發表了一個替代解決方案,它描述瞭如何將聯繫人文件附加到日曆文件,該日曆文件由iOS5以上的移動Safari進行處理。

http://mobicontact.info/iphone/download-contact-from-web-page/

的博客顯示,包括源代碼和全過程的圖像和完整的解決方案,因此是比我可以把這裏堆棧溢出容易得多閱讀。需要注意的要點是,蘋果公司使用:

ATTACH;VALUE=BINARY;ENCODING=BASE64;FMTTYPE=text/directory; 
X-APPLE-FILENAME=iPhone Contact.vcf: 
QkVHSU46VkNBUkQNClZFUlNJT046M…etc… [base64 encoded VCARD] 

嵌入式VCARD在VCALENDAR文件中。創建一個VCALENDAR文件,然後BASE64內其編碼的電子名片 - 下面的代碼片段(在我的博客的全部細節)

<?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('/(.+)/', ' $1', $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"; 
?>