加速度センサー

加速度センサー

加速度センサーは、iOSとAndroidではブラウザー提供のJavascriptのAPIの値が変わる

ちなみに jQueryMobileでは、加速度センサーは非対応

加速度センサーの値は、
devicemotion
というブラウザーのイベントから取得する

var onDeviceMotion = function(e){
accel = e.accelerationIncludingGravity;
var accelX = accel.x;
var accelY = accel.y;
var accelZ = accel.z;
};

window.addEventListener('devicemotion',onDeviceMotion,true);

addEventListener()でイベントをハンドリングするonDeviceMotion関数を
devicemotionイベントにバインドする

onDeviceMotionでは、
受け取ったイベントeから
加速度メーターの値になる
accelerationIncludingGravity
を取得している

accelerationIncludingGravityには
x
y
z
という変数名で、各軸方向の加速度が格納されている

注意点として、devicemotionイベントは、
非常に短い間隔で発生しているため
実質的には常に最新の加速度が取得できるけど
イベントの発生頻度が高いため
イベントハンドラの中で重い処理は避けた方がよい

あと、AndroidとiOSでは加速度センサーの正負の値が逆になる

アプリがインストールされていないときの処理

アプリがインストールされていないときの処理

URLスキームは便利だけど
アプリがインストールされていないと
エラーになる

エラーはページが存在しませんというもの

このため、アプリがインストールされていないときには
アプリのダウンロードページに遷移するようにする

ちなみに
独自urlスキーム 作成 Android
で調べてみたけど
ソーシャルメディアアプリだけでなく
自作アプリでも、URLスキームの利用は可能

以下は、Twitterアプリがインストールされてないときには
ダウンロードページへ遷移する処理

<a href="twitter-btn">タイムラインの表示</a>

<iframe frameborder="1" scrolling="auto" id="twitter-launcher" name="twitter-launcher"></iframe>

でiframeの表示を overflow:hidden;で隠し
そのiframeのsrcでURLスキームリンクを指定する
location.href
ではなく
iframe のsrcなのは
必要なアプリがインストールされていないときにJavascriptで
アプリのダウンロードページへ遷移するため

また iframe の src による画面遷移の場合
親ページのJavascriptが続行して実行される

つまり、アプリがインストールされているなら iframeで処理して
アプリがインストールされていないときには
location.hrefを使い、ダウンロードページへリンクする

Javascriptで
iframe の srcで外部ドメインのサイトを指定しても
セキュリティーにより遷移できない

Androidのブラウザーのときの処理は

if(/(Android)/.test(navigator.userAgent)){
DOWNLOAD_URL=" market://search?q=pname:com.twitter.android";
}

$(document).on("pageinit","#top",function(e){
$(this).on("click","#twitter-btn",function(e){
$("#twitter-launcher").attr('src',"twitter://timeline");
setTimeout(function(){

location.href=DOWNLOAD_URL;
},100);

});
});

market://search?q=pname:com.twitter.android

AndroidのTwitterアプリのダウンロードページ
もし、同じように自作アプリでやるなら
そのアプリのダウンロードページのURLにする

$("#twitter-launcher").attr('src',"twitter://timeline");

で、iframeのsrcを追加している
これで、タイムラインを表示

setTimeout(function(){

location.href=DOWNLOAD_URL;
},100);

で、タイムアウトしたら
ダウンロードページへリンクするように設定している

URLスキームのパラメーター

URLスキームのパラメーター

URLスキームを使えば、リンクをはるだけで簡単にソーシャルメディアアプリと連携できる

ただし、そのアプリがインストールされていないとだめ

TwitterのURLスキームのパラメーターは

twitter://timeline
タイムラインの表示

twitter://mentions
@自ユーザー名を含むツイートの表示
つまり自分のユーザー名入りでツイートを表示

twitter://post?message=メッセージ
指定した文字列を初期値としてツイートダイアログをひらく
初期値なので変更可能

twitter://search?query=検索文字列
指定した文字列を含むツイートの検索

次に、facebookのURLスキームのパラメーター

fb://profile
自分のプロフィールを開く

fb://friends
自分の友達リストを開く

fb://events
イベントリストを開く

fb://albums
フォトアルバムを開く

URLスキームによるソーシャルメディアアプリとの連携

URLスキームでほかのソーシャルメディアアプリと連携

URLスキームは
http
ftp
mailto
などのURLの先頭の文字列のこと

ブラウザーはリンクをクリックしたときに
URLスキームの種類により動作が変わる

httpなら普通に画面遷移するけど
mailtoならメーラーが起動する

スマートフォンでは、アプリ間連携をサポートするため
ネイティブアプリに独自URLスキームを割り当てる仕組みが用意されている

Twitterの公式アプリなら
twitter://
から始まるURLスキームを提供している

ブラウザーは
アプリ特有のURLスキームが指定されると
そのアプリがインストールされているなら
アプリを起動する処理をする

さらに、URLスキームを使うと
アプリ起動だけでなく、
アプリ特有のパラメーターを指定することで
アプリ間での情報の受け渡しができるようになる

URLスキームは、リンクとして指定するだけでブラウザーが判断してくれるので
タイムラインを表示するリンクボタンを作るなら

&amp;lt;a href=&amp;quot;twitter://timeline&amp;quot;&amp;gt;Twitterタイムライン閲覧&amp;lt;/a&amp;gt;

Twitterタイムライン閲覧
というように、タイムライン表示のボタンができる

また、クエリを渡せば、Twitterアプリで
ツイートも可能

<a href=&quot;twitter://post?message= Tweets from the Web application &quot; data-role=&quot;button&quot;&gt;Twitterアプリでツイート&lt;/a&gt;

とすれば

Twitterアプリでツイート
でツイートできる

検索関数のイベントとマッピング

検索関数のイベントとマッピング

$(document).on("pageinit","#top",function(e){
$(this).on("keypress","#search-tag",function(e){
if(e.keyCode == $.mobile.keyCode.ENTER){
var hashTag = $("#search-tag").val();
if("" == hashTag) return;

searchTweet(hashTag);
}
});

});

#topは

<div data-role="page" id="top">
</div>

を示す

if(e.keyCode == $.mobile.keyCode.ENTER)

で、キーコードがEnter
つまり、Enterを押したときの判定をしている

var hashTag = $("#search-tag").val();

で、検索欄で入力した内容を
hashTag へ代入

if("" == hashTag) return;

で、入力フォームが空なら何もしないようにしている

ソーシャルメディアAPIと
jQueryMobileを使うことで
サーバーなしでもWebアプリを作成できる

ツイート検索のJavascript

ツイート検索のJavascript

Javascriptでは、まず検索のための関数を作成

この中で、Twitter Search APIを使う

この関数の処理は
引数として受けとった文字列を
Twitter Search APIへ渡して
json形式のレスポンスをHTMLへ整形

そして、これをdivで指定した領域へ
リスト形式にして追加する

という流れになる

まず、前回の検索結果を削除する必要があるため

$("#tweet ul").remove();

で削除

これは、アプリを使うのは1回だけではないため

次に、

$("#tweet").append('<ul data-role="listview" data-inset="true"></ul>');

で、動的にul要素を作成
これがツイート検索結果を表示するリスト領域になる

data-inset=”true”
は、余白を付ける設定
http://billboardtop100.net/2011/02/jquery-mobile-lists.html
を参考にするとわかりやすい

ここまでできたら
$.ajax()
を使いTwitter Search APIを呼び出す
URLには # をつけるけど
これは、エンコードされるので

%23

になる

これでハッシュタグをつけてパラメーターを指定する

レスポンスはresで受け取って
res.results の各要素へ対してkeyでアクセスする

res.results[key]から
ツイートしたユーザーである from_user
そして、そのユーザーのプロフィール画像になるprofile_image_uri
そして、ツイート内容の text を取得し
それぞれHTML要素へ整形する

整形しないとjson形式なので使えない

そして、整形したHTML要素を
リストのli要素で囲って
これを動的に追加しておいたul要素へ追加する

ul要素へいろいろ追加した後に、
listviewを呼び出して、jQueryMobileのスタイルを適用すれば出来上がり

この$.ajax() の中身のソースは

url : "http://search.twitter.com/search.json?=%23"+ hashTag,
dataType:"json",
success:function(res){
$.each(res.results, function(key){
var html = '<img style="width:80px;" height="80px;" src="'+
res.results[key].profile_image_url +
'"/>';
html += "<h4>"+res.results[key].from_user+"</h4>";
html += '<p style="white-space : normal;"></p>';

$("#tweet ul").append('<li id="tweets' + key + '">'+ html +"</li>");

$("#tweets" + key + " p").text(res.results[key].text);

});
$("#tweet ul").listview();

}

この中で、まず
$(“#tweet ul”).append(‘

  • ‘+html+”
  • “);
    として
    要素とスタイルの設定だけしていて

    その後、
    $(“#tweets” + key + ” p”).text(res.results[key].text);
    で内容を追加している

    これは、ツイート内容には
    htmlの特殊文字の< とか > がふくまれるから
    これをエスケープなしで表示するとHTMLレイアウトが崩れる

    似たようなものとして
    mysql でのデータベース入力フォームでのエスケープ処理がある

    エスケープ処理には
    $.text()を使う

    本来は、要素内の文字列取得、変更に使うけど
    同時にHTMLの特殊文字のエスケープ機能もあるので
    ほかでも使える

    つまり、最初に$.append()で要素とスタイルを指定

    $.text()でエスケープして内容を追加している

    ハッシュタグでツイート検索

    ハッシュタグでツイート検索

    Twitter Search APIを使うことで
    検索フォームに入力したハッシュタグでツイート検索して
    一覧表示する

    また、ツイートは内容以外に
    ツイートしたユーザーとプロフィール画像も表示する

    さらに、利便性向上のため
    検索フォームでは、入力フォーム内で
    Enterが押されたら検索開始するようにする

    index.htmlで
    まずhead要素の中で
    jquery.mobile-1.1.0.min.css
    jquery-1.7.1.min.js
    jquery.mobile-1.1.0.min.js
    そして、処理するJavascriptの
    searchtwitter.js
    を読み込む

    <div data-role="fieldcontain">
    <label for="search">ハッシュタグ:</label> # <input type="search" name="search" id="search-tag" value="android"/>
    </div>
    

    これで、ハッシュタグで検索する入力フォームを作成

    input で type=”search” にすると
    検索アイコンのついた入力フォームになる

    <div data-role="fieldcontain">
    </div>
    

    で囲んでいるのは
    レイアウトが崩れるのを防ぐため

    ツイート一覧表示の領域は

    <div id="tweet">
    </div>
    

    として、divで表示領域を指定する

    これで画面はできたので
    処理はJavascriptで行う

    android から web api 利用

    android から web api 利用

    http://codezine.jp/article/detail/7169?p=2
    を参考に
    流れを復習

    HTTP 通信を get か post で行って

    結果データの json や xml を解析

    そして結果を 画面描画する

    という流れ

    android では http 通信など待ち時間が長いのは
    通常はバックグランド、つまり非同期で行う
    なので
    メインスレッドとは別スレッドを作成する

    メインスレッドは主にUI処理
    つまり画面とかの描画処理
    これで時間がかかる処理をしていると操作性が悪くなる

    なので、別スレッドで非同期処理

    イメージとしては
    別の人に裏方を頼んで、お客さん対応みたいなかんじ

    android のUI描画処理はシングルスレッド設計
    つまり1人でやるようになっているので
    別のスレッドから直接UI操作はできない

    ハンドルが1つの車で隣から操作すると事故になるように
    非同期スレッドからUI操作をするとエラーになる

    メインスレッド=運転手
    バックグランドなどのスレッド=助手席
    というかんじ

    web storage について

    web storage について

    web storage はブラウザにデータを保存する仕組み

    cookie よりも大きいデータを保存したりできる

    必要なツールは
    html から js 読み込む

    そして chrome を使う

    注意点として古いブラウザでは使えないことがある
    http://caniuse.com/#search=web%20storage
    で調べることができるので
    案件などででたときにはこれを参考に

    実験は vagrant で行う

    行うのは
    mkdir webstorage_lessons
    で作りここで行う

    まず index.html を作成
    emmet-vim
    を使い
    html:5
    でCtrl +y ,
    で簡単に雛形をつくれるので
    あとは
    body に hello を追記

    今回は apache ではなく
    python の simpleHTTPServer を立ち上げる

    python -m SimpleHTTPServer
    で立ち上げる

    これは 8000 番ポートになるので
    ifconfig でIPを調べて
    サーバーIP:8000
    へブラウザでアクセスする

    これで hello と表示されればOK

    ソーシャルメディアAPI活用

    ソーシャルメディアAPI 活用

    TwitterのAPIを使うことで
    指定した条件にマッチするツイート一覧や
    人気トピック一覧かどが取得できる

    また、facebook API を使うことで
    人に関連する物に紐付く情報を得られる

    これらのAPIは、レスポンスにJSON形式をサポートしていることが多いため
    Javascriptで処理しやすい

    今回は Twitter Search APIをつかう

    このAPIは、簡単なクエリを使い
    Twitterに投稿されたツイートを検索するAPI

    レスポンス形式は
    Javascriptで取得しやすいjson
    RSSなどに対応するatom
    に対応している

    使うときには
    http://search.twitter.com/search.json?q=検索するツイート

    となる

    もし、jquery.を調べるなら
    http://search.twitter.com/search.json?q=jquery

    となる

    このURLをブラウザーで表示すると
    レスポンス結果をみることができる

    この結果には、ツイート以外に
    検索された文字列
    ツイート一覧ページのナンバー
    などもふくまれる

    JSONなので、
    キーと値のペアになっている

    そして、ツイート一覧は
    resultsキーの中に入っている

    このresultsはリスト構造になっていて
    それぞれの要素がツイート一つ一つに対応する

    ツイートの主な要素としては
    created_at
    ツイートした日時

    from_user
    ツイートしたユーザー

    profile_image_url
    ツイートしたユーザーのプロフィール画像のURL

    text
    ツイート内容

    なお、Twitter Search API の開発者向けサイトにはもっと詳しい情報が
    載っている

    https://dev.twitter.com/docs/api/1.1/get/search/tweets
    を参考に