こんにちは!林です。
今回は、iPhone アプリ開発者 / ウェブ開発者向けの記事です。
みなさんは、iPhone の Safari にある「ホーム画面に追加」という機能をご存知でしょうか。
以下の図のように見ているウェブページを、ホーム画面にアプリのように置くことができる機能です。
ホームに置かれたアイコンをタップすると、Safari が起動し、そのウェブページを閲覧できる仕組みになっています。
頻繁に使うページをホームに置いておくと大変便利です。
この機能を利用して、
アイコンから任意のアプリ(※1) を起動する JavaScript
を作成しました。
※1 URI スキームに対応しているアプリのみ対応しています。
使い方
設置方法は </head> の直前に1行、スクリプトタグを追加するだけです。
※ デフォルトでは、Sleipnir Mobile で開くようになっています。
<script type="text/javascript" src="http://www.bearfactory.jp/labs/js/iphone-openapps.js"></script>
オプション
HTML5 で追加された data 属性をオプション項目として利用することで Sleipnir Mobile 以外のアプリやアドレスを設定することができます。
以下、オプションの使用例です。
<script data-openapps-scheme="hatenabookmark" data-openapps-uri="http://www.sleipnirstart.com/" type="text/javascript" src="http://www.bearfactory.jp/labs/js/iphone-openapps.js"></script>
<script data-openapps-schemeuri="ghttp://www.sleipnirstart.com/" type="text/javascript" src="http://www.bearfactory.jp/labs/js/iphone-openapps.js"></script>
- data-openapps-scheme : アプリを開くための URI スキームを入力する。
2と組み合わせ可。
指定しない場合の値 : sleipnir
(例:ghttp、hatenabookmark、sleipnir) - data-openapps-uri : アプリを開くときに任意のURIを指定する。
1と組み合わせ可。
指定しない場合の値 : そのページの URI
(例:http://www.sleipnirstart.com/) - data-openapps-schemeuri : 開く URI を全て指定する。
こちらは、1,2と併用はできません。指定している場合優先されます。
指定しない場合の値 : なし
(例:ghttp://www.sleipnirstart.com/)
まとめ
使い方は以上となります。設置するだけならば、Sleipnir Mobile で開くようになります。
このページにもそのスクリプトを追加していますので、iPhone でホーム画面に追加していただければ、Sleipnir Mobile で開くことを確認できます。(ページ自体が大きいため切り替わるまで時間がかかります。シンプルなページだと一瞬です。)
スクリプトが実行している処理の流れは、
アイコンをタップする → Safari を起動する → Safari が外部アプリを勝手に起動する
です。
こちらのスクリプトを利用することで、サイト内のどこからホームへ追加しても、トップを開くようにするなど応用を利かすことができます。
アプリ間連携とはまた違った利用シーンがあるかもしれませんね。何かのお役に立てればと思います。
以下にソースコードを公開していますのでご自由に扱っていただければと思います。
ソースコード(二次配布・改変は自由です)
// JavaScript Document (function(){ var openAppFunc = function(){ var scrObj = document.getElementsByTagName("script"); var uriScheme = "sleipnir"; var uriJump = this.location.href; var uriSchemeJump; for(var i=0,l=scrObj.length,a,b;i<l;++i){ if( scrObj[i].getAttribute("data-openapps-schemeuri") ){ uriSchemeJump = scrObj[i].getAttribute("data-openapps-schemeuri"); break; } if( !a && scrObj[i].getAttribute("data-openapps-scheme") ){ uriScheme = scrObj[i].getAttribute("data-openapps-scheme"); a = true; } if( !b && scrObj[i].getAttribute("data-openapps-uri") ){ uriJump = scrObj[i].getAttribute("data-openapps-uri"); b = true; } if(a && b) break; } var metaObj1 = document.createElement("meta"); metaObj1.name = "apple-mobile-web-app-capable"; metaObj1.content = "yes"; var metaObj2 = document.createElement("meta"); metaObj2.name = "apple-mobile-web-app-status-bar-style"; metaObj2.content = "black"; var headObj = document.getElementsByTagName("head")[0]; headObj.appendChild(metaObj1); headObj.appendChild(metaObj2); if(window.navigator.standalone){ var aObj = document.createElement("a"); if(uriSchemeJump){ aObj.href = uriSchemeJump; }else if( uriScheme === "hatenabookmark" ){ aObj.href = "hatenabookmark:/entry?url=" + encodeURIComponent(uriJump); }else{ aObj.href = uriJump.replace(/^http/, uriScheme); } aObj.id = "openApp"; var bodyObj = document.getElementsByTagName("body")[0]; bodyObj.appendChild(aObj); var a=document.createEvent("MouseEvents"); a.initEvent("click",true,true); document.getElementById("openApp").dispatchEvent(a) } } if(window.addEventListener && RegExp(" AppleWebKit/").test(navigator.userAgent) && RegExp(" Mobile/").test(navigator.userAgent)){ window.addEventListener('load', openAppFunc, false); } })();