2009-12-12 1 views
10

iPhoneユーザーが自分のアドレス帳情報をインポートできるようにQRコードを作成しようとしています。このURLが含まれているQRイメージを作成し、私のウェブサーバ iPhone:サファリにvcardを認識させるには?

  • にVCF(vCardの)ファイルを置く

    • :私がすることによってこれをやっています。

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

    これは(それがアドレス帳アプリでのvCardを開きます)私のデスクトップブラウザに取り組んでいます。

    iPhoneでは、QRリーダーが正常にSafariにVcardにアクセスするように指示しますが、Safariはvcardの処理方法がわからないことを訴えます。 Content-Type: text/x-vcardが送信されていることを確認しました。

    だから、私の質問:

    • どのように私はSafariが、私のvcardを認識するのですか?
    • サファリが認識する別のカードフォーマットがありますか?
  • +0

    は、あなたはこれを見ましたか? http://stackoverflow.com/questions/1773876/how-to-add-a-contact-to-the-iphones-address-book-from-a-web-page – wkw

    +0

    私は追加しておくべきですが、そうではありませんあなたの問題を解決し、他の誰かが同じことをやろうとしていて、それが電子メールのメッセージから(明らかに)動作することを発見しました。だから...ハム。 – wkw

    +0

    VCARD .vcfファイルはiOS7で直接サポートされるようになりましたので、私の答えはそのOSでは必要ありません。詳細については、http://mobicontact.info/iphone/ios7-supports-vcard-vcf-download-at-last/を参照してください。さらに、あなたのウェブサイトでVCARDファイルをホストし、QRコード経由でリンクを提供することもできます。 –

    答えて

    13

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

    次に、モバイルSafari経由でWebページからiPhoneに連絡先をダウンロードする代替方法の完全な説明を示します。基本的な考え方は、必要な連絡先情報をモバイルサファリで処理されるカレンダーイベントのファイルとして添付することです。連絡先ファイル自体は、単純なPHPスクリプトを使用して、カレンダーファイルでオンザフライでBase64エンコードされています。だから... ...

    Basic layout of embedded VCARD in VCALENDAR file

    を読みだけでソースコードをしたいですか?自由にコピーして再生できるHTML5 Webアプリケーションを完全に動作させるには、ここをクリックしてください(iphone-contact-download-demo)。または、デモ用のhttp://iphone.mobicontact.infoにアクセスしてください。このデモでは、HTML5キャッシュマニフェストを使用して、iphoneやHTML5対応ブラウザにコンテンツをダウンロードし、オフラインで使用するようにしています。詳細を知りたい場合は、「オフラインWebアプリケーション」の詳細についてはgoogleをご覧ください。

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

    また、ユーザーの電子メールアドレスを要求して連絡先ファイルを電子メールで送信するか、Googleマップのエントリへのリンクを作成してその連絡先情報を抽出することで、英国では数週間必要です)。

    これらはどちらも実行可能なソリューションですが、私はユーザーフレンドリーとは言いません。私はモバイルクライアントの連絡先のいずれかをモバイルWebアプリケーションで受け入れるようにしました。

    この時点で、Kerem Erkanの優れたQRリーダーとそのブログの両方からQRAFTERやVCARD GETTERなど、VCARD(.vcf)ファイルのサポートを追加するサードパーティのアプリケーションをダウンロードできることにも言及する必要がありますiPadソリューション、HIPSCAN vcardインポーターなどがあります。しかし、あなたの読者にこれらのアプリがインストールされていると仮定すると、私の意見では遠すぎるので、私は電子メール、Googleマップ、サードパーティ製アプリケーションの代替ソリューションを探しました。

    スタックオーバーフローが対象 強制vCardのダウンロードにいくつかのスレッドを持っている(thesheep.co.uk) メールソリューションやから関連するブログ:私は継続する前に

    は、より詳細に問題を記述した多くのリンクがありますコード列はここにあります。vCardのダウンロードオプション Googleマップを使用したソリューションもあります。これはDataplexのこの記事でもカバーされています。 Jonas Schmidは、ファイルタイプを正しく提供することについて話します。 MacRumoursスレッド

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

    最初の障害は、カレンダーイベントで添付ファイルを取得している...

    「当初、私は、Webページからリンクされたときに可能ながら、正しくダウンロードしていない、WindowsのOutlookのカレンダーの予定に添付ファイルを追加しようと、確かにdidnのtは私が後になった結果をもたらす。だから、結局のところ、私たちはiPhoneにダウンロードしようとしているので、Appleのソフトウェアを試してみることにしました。 Appleのデフォルトのカレンダーアプリケーション「iCal」を使用すると、イベント/カレンダーの予定に添付ファイルを追加することはできません。だから私は "OSXのカレンダーのイベントに添付ファイルを追加する"と似て、私は正しい方向に私を指摘したこの優れた記事を見つけた。

    OSXのカレンダーアポイントに添付ファイルを追加する。

    BusyCalがインストールされているので、イベントを作成してVCARDファイルを添付することができました(以前はOSXの連絡先から保存/エクスポートされていました)。この手順は、添付ファイルがカレンダーアイテムに追加されたときに作成されるファイルの形式を理解するためにのみ必要です。以下で説明するソリューションを実装するためにBusyCalをインストールする必要はありませんが、VCARD VCALENDAR/VEVENT(.ics)ファイルに埋め込まれています。

    私が使用した手順はOSXライオンを実行しているアップルのiMacにあった:

    エクスポート連絡先から連絡先/ 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 このカレンダーをエクスポートして.icsファイルを生成すると、あなたは好きなものを呼び出すことができます。 "vcal"を "On my Mac"領域に使用すると、既存のカレンダーを使用している場合に発生するすべてのイベントではなく、添付されたカード。 新しいイベントを作成します - 好きなものを呼び出し、任意の時刻と日付を付けます。 (1)からのこの新しいイベントにVCARDファイルを添付してください - screenshotを参照してください。 BusyCal on iMac allows attachements to VCALENDAR appointments イベントをカレンダーに保存します。 BusyCalのメインメニューからカレンダーをローカルディスク上の.icsファイルにエクスポートする - ここでzipファイルをダウンロードする - >連絡先ファイルが添付されたAppleカレンダーのイベント。 お気に入りのテキストエディタを使用して、Appleがカレンダーイベントの添付ファイルをどのように保存しているかを調べることができるようになりました。結果は次のとおりです。 X-APPLE-FILENAME = iPhone Contact.vcf: QkVHSU46VkNBUkQNClZFUlNJT046M ... etc ... [base64でエンコードされたVCARD] だから私は必要でなかった余分なものをすべて取り除いたiPhoneが添付ファイル付きの有効なカレンダーイベントとして認識していた絶対最小値。これを行う理由は、カレンダーイベントを作成するPHPファイルを最終的なWebページにできるだけ簡単にすることです。ここでは縮小したもののvcal-minimalです。

    私が言ったように、コンタクトダウンロードソリューションを実装する必要はありません。AppleがX-APPLE-FILENAMEコンタクトラインを使ってAppleにファイルを添付する仕組みを理解したかっただけです。もちろん、それらがどのようにしてVCARDデータをBase64エンコーディングでエンコードしているのですか?これで、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)を作成またはアップロードvcal.phpここにiphonecontact-source-codeというコードを入れてください。この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)カレンダーイベントのタイトルを、埋め込み連絡先ファイルの処理方法をユーザーに伝えるために役立つもの(vcalの行が表示されます)を確認します。イベントのSUMMARYフィールドを設定するPHP)。だから今 Opened contact file

    7)そして...「新しい連絡先を作成」とあなたはほとんどそこにいる...添付連絡先ファイルをクリックし Contact SAVED!!!

    保存で息の下での接触と呪いフープアップルはあなたがジャンプを作った!

    は今、私はHTML5のWebアプリにこの技術を使用して、私の経験に基づいて、ここで言及したいポイントがいくつかあります:

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

    VCALENDARファイルをiPhoneに、VCARDファイル自体を他のすべてのブラウザに提供するかどうかを、 "vcal.php" PHPファイルで検出するユーザーエージェントの盗聴を行うことはもちろん可能です。その単純な十分なチェックとよくGoogle検索を介して文書化されているので、もしあなたがする必要があればそれを理解するためにそれを残して、ここでコードを投稿して自由に感じてください。

    私はそれはそれについてだと思う - ので、要約する:

    モバイルサファリはVCARD(の.vcf)ファイルを直接しかしVCALENDAR(.ICS)ファイルをサポートしていないをサポートしていません。

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

    あなたはこのソリューションが好きです。アップルが謝罪して、モバイルSafariでVCARDファイルを受け入れるまでは、これでいいと思います。

    は、次の時間まで...

    9

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

    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] 
    

    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"; 
    ?> 
    
    関連する問題