質問

iPhoneユーザーが私のアドレス帳情報をインポートできるようにQRコードを作成しようとしています。私はこれを次のようにやっています:

  • 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 が認識する別のカード形式はありますか?
役に立ちましたか?

解決

[更新 - 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 を介して Web ページから iPhone に連絡先をダウンロードする別の方法の完全な説明です。基本的な考え方は、モバイル サファリによって処理されるカレンダー イベントに必要な連絡先情報をファイルとして添付することです。連絡先ファイル自体は、単純な PHP スクリプトを使用してオンザフライでカレンダー ファイル内に Base64 エンコードされます。それでは続きを読んでください...

Basic layout of embedded VCARD in VCALENDAR file

ソースコードが欲しいだけですか?ここ [iphone-contact-download-demo] からダウンロードすると、完全に動作する HTML5 Web アプリが作成され、自由にコピーして複製したり、次のサイトにアクセスしたりできます。 http://iphone.mobicontact.info 動作デモ用。このデモでは、オフライン時に使用できるようにコンテンツを iPhone または HTML5 サポート ブラウザにダウンロードする HTML5 キャッシュ マニフェストを使用します。「オフライン Web アプリ」について詳しく知りたい場合は、Google で検索してください。

iPhoneのvcalendarに埋め込まれたvcard for iPhoneダウンロードは、モバイルSafariを使用してWebページからiPhoneに直接連絡先ファイル(VCARD形式データ)をダウンロードすることができないことを読んだことがあるかもしれません。ブラウザーは、.vcf 拡張子と MIME タイプ (text/x-vcard) を処理すべきものとして認識しません。余談ですが、Android やその他のほとんどのモバイル デバイスは、VCARD ファイルを十分に簡単に処理できるはずです。標準自体は山のように古いものです。

また、ユーザーの電子メール アドレスを要求して連絡先ファイルを電子メールで送信するか、Google マップのエントリへのリンクを作成してそこから連絡先情報を抽出することで、実行可能なことを実現できるということも読んだことがあるかもしれません (Google マップのエントリを取得するには数週間かかります)イギリスで)。

これらはどちらも実行可能なソリューションですが、いわゆるユーザーフレンドリーとは言えず、クライアントにモバイル Web アプリで連絡先をダウンロードする際にどちらかを受け入れてもらおうとしましたが、失敗しました。

ここで、VCARD (.vcf) ファイルのサポートを追加するいくつかのサードパーティ アプリをダウンロードできることにも言及しておきます。QRAFTER や VCARD GETTER などは、Kerem Erkan の優れた QR リーダーと、このテーマと iPad ソリューションに関するブログから提供されています。および HIPSCAN vcard インポーター。しかし、読者がこれらのアプリをインストールしていると仮定するのは私の考えでは行き過ぎであるため、電子メール、Google マップ、サードパーティ製アプリに代わるソリューションを探しました。

続行する前に、問題を詳しく説明するリンクが多数あります。

Stack Overflowには、vcardのダウンロード(thesheep.co.uk)を強制するサブジェクトにいくつかのスレッドがあります(thesheep.co.uk)コードトレインからの電子メールソリューションと関連するブログは、ここにGoogleマップを使用する可能性のあるソリューションもあります。これについては、Dataplex のこの記事でも取り上げています。Jonas Schmid は、ファイル タイプを正しく提供することについて語ります。MacRumours スレッド

そこで、iPhone は IOS5 以降、Web ページからダウンロードした vcalendar ファイルをサポートしているのではないかと考えました。通常、VCALENDAR ファイルには .ics 拡張子が付いており、ファイルを開いてカレンダーに保存できるウィンドウを表示するモバイル サファリによって処理されます。Apple と Mobile Safari が VCAL ファイルをサポートしているのに VCARD ファイルをサポートしていないというのは信じられないことですが、それはまさにその通りです。では、VCARD ファイルを VCALENDAR ファイルに添付できたらどうなるでしょうか?

最初の障害は、カレンダー イベントに添付ファイルを取得することです。

最初に、Windows で Outlook カレンダーの予定に添付ファイルを追加しようとしましたが、Web ページからリンクされたときに正しくダウンロードされず、期待していた結果も得られませんでした。そこで、結局のところ、iPhone にダウンロードしようとしているので、Apple ソフトウェアを使用してみることにしました。Apple のデフォルトのカレンダー アプリケーション「iCal」を使用すると、基本的な問題が 1 つ発生します。それは、イベント/カレンダーの予定に添付ファイルを追加できないということです。そこで、「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 つのイベントだけが得られます。既存のカレンダーを使用している場合に発生するすべてのイベントではなく、新しいイベントを作成し、好きな名前を付けて、任意の日時を指定します。(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 連絡先.vcf:QkVHSU46VkNBUkQNClZFUlNJT046M...etc...base64エンコードされたvcard]そこで、私は、iPhoneによってまだ添付ファイルの有効なカレンダーイベントとして認識されている絶対的な最小値が得られるまで(ここでは試行錯誤)、すべての余分なものをすべて取り除きました(ここで試行錯誤しました)。これを行う理由は、最終的な Web ページでカレンダー イベントを作成する PHP ファイルをできるだけ簡単にするためです。これを縮小したものの vcal-minimal を次に示します。

したがって、前述のとおり、連絡先ダウンロード ソリューションを実装するのに上記のすべては必要ありません。私は、Apple が X-APPLE-FILENAME 連絡先ラインを使用してファイルを添付する方法を理解する方法を示したかっただけです。そしてもちろん、base64 エンコードを使用して VCARD データをエンコードする方法も異なります。これで、VEVENT をオンザフライで作成し、Mobile Safari 経由で iPhone に直接ダウンロードできる VCARD を添付するために必要な情報がすべて揃いました。

1)ダウンロードしたい連絡先ファイル (.vcf) をアップロードします。このファイルは、iPhone 以外に直接ダウンロードするか、iPhone 用に Base64 エンコードするために必要になります。

2)次のようなカレンダー イベントをオンザフライで生成する PHP ファイルへのリンクを作成します。おそらく以下のような HTML5 モバイル アプリで Contact iPhone をダウンロードします。Simple link to the PHP file to download the contact within VCALENDAR

3) ここのコード iphonecontact-source-code を使用して vcal.php を作成またはアップロードします。この PHP ファイルは、ダウンロードされるカレンダー ファイルに正しいヘッダー/コンテンツ タイプを適用します。その後、「vcal-from-file.php」で実行したようにカレンダー ファイルのコンテンツを直接「iphonecontact.ics」で取得するか、 「vcal.php」に示されているように、その場でカレンダーを作成します。後者は、ダウンロードの日時を示すタイムスタンプ付きのカレンダー イベントが表示されるため、私が推奨する方法です。

4)それだけです!これで準備は完了です。iPhone で Web ページを参照し、リンクをクリックして「vcal.php」を実行します。ブラウザに iphonecontact.ics ファイルが表示され、電話のカレンダー アプリケーションで開くように求められます。Calendar appointment downloaded from web page

5)「...で開く」を選択すると、カレンダーの予定と添付された連絡先ファイルが表示されます。Calendar event with attached contact file

6) カレンダーイベントのタイトルを、埋め込み連絡先ファイルの処理方法をユーザーに伝えるのに役立つものに設定していることに注目してください (イベントの SUMMARY フィールドを設定する行が vcal.php にあることがわかります)。それでは、添付された連絡先ファイルをクリックしてください...Opened contact file

7)そして「新しい連絡先を作成」すれば、もうすぐです...Contact SAVED!!!

連絡先を保存して、Apple があなたに飛び越えさせた輪を息をひそめながら罵ってください。

ここで、HTML5 Web アプリでこのテクニックを使用した私の経験に基づいて、ここで言及したい点がいくつかあります。

キャッシュ マニフェストの使用 - カレンダー ファイル (iphonecontact.ics) がキャッシュされていた場合、そのファイルを処理するときに予期しない動作や問題が発生しました - 動作させることができなかったので、マニフェストから除外しました。つまり、常にダウンロードされることになります。 - ソース コードは、この zip ファイル iphonecontact-source-code に含まれています。

もちろん、ユーザー エージェント スニッフィングを実行して、「vcal.php」PHP ファイル内で VCALENDAR ファイルを iPhone に提供し、VCARD ファイル自体を他のすべてのブラウザに提供するかどうかを検出することもできます。これは非常に簡単なチェックであり、Google 検索で詳細に文書化されているため、必要に応じてそれを理解するのはあなたに任せます。必要な場合は、ここにコードを投稿してください。

それくらいだと思います - 要約すると次のようになります。

Mobile safari は VCARD (.vcf) ファイルを直接サポートしませんが、VCALENDAR (.ics) ファイルをサポートします。

  • 現在の最良の解決策は、ユーザーの電子メール アドレスを要求して連絡先に電子メールを送信するか、Google マップのリンクに連絡先を埋め込むか、VCARDS を処理するアプリをダウンロードすることです。
  • Apple はカレンダー ファイルへの添付をサポートしていますが、簡単ではないため、これがどのように行われるかを理解すれば、PHP で行うことができます。
  • VCARD を VCALENDAR ファイルに埋め込むと、ユーザーはさらに 1 ~ 2 回クリックするだけで連絡先をアドレス帳に保存できるようになります。

このソリューションが気に入っていただければ幸いです。Apple が折れて Mobile Safari が VCARD ファイルを受け入れることを許可するまでは、このソリューションはうまくいくと思います。

次回まで...

他のヒント

私はちょうど以降iOS5をからモバイルサファリによって処理されたカレンダーファイルへの添付ファイルとして連絡先ファイルを添付する方法について説明します私のブログ上の代替ソリューションを公開しています。

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

ブログは、ソースコードやプロセス全体の画像を含む完全なソリューションを示し、そのように私は、スタックオーバーフローの上にここに置くことができるものよりも読みずっと簡単です。注意すべき主な点は、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 - (私のブログ上の完全な詳細)以下のコードを

<?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";
?>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top