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

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

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

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

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

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

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

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

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

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

<a href="twitter://timeline">Twitterタイムライン閲覧</a>

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
    を参考に

    ソーシャルメディアボタンの配置場所のカスタマイズ

    ソーシャルメディアボタンの配置場所のカスタマイズ

    Twitter Facebookのソーシャルメディアボタンは
    公式jsファイルが読み込まれると
    aタグや div タグが
    iframeタグに置き換わる

    このため、元のタグに独自スタイルや
    class=””の定義をしても
    そのまま保持されず、無視されてしまう

    このため、ソーシャルメディアボタンを
    任意の場所へ配置するには
    aタグやdivタグの周りに
    スタイル設定用のタグで囲むことで
    任意の場所へソーシャルメディアボタンを配置できるようになる

    <span style="position: absolute; width:80px; right:0px; top:.7em">
    <a href="https://twitter.com/share" class="twitter-share-button" data-role="tweet テスト" data-lang="ja" data-count="none">Tweet</a>
    </span>
    

    というようになる

    facebookいいねボタン追加

    Facebookいいねボタンの追加

    追加するための必要な要素は
    https://developers.facebook.com/docs/plugins/like-button/
    で作成できる

    URL to like にサイトのURL
    Send Button のチェックをはずし

    Layout Styleが
    standardだと解説がでてくるので
    button_count
    へ変更

    widthへは任意のピクセルを入力

    そして、get codeを押せば
    コードの種類を選択できるので
    IFRAMEを選択すれば作成される

    作成されたコードを貼り付ければ
    いいねボタンが設置される

    ただし、これだとページごとに
    コードを張ることになり面倒

    あと、環境によってはURLがまだ未定ということもある

    このためJavascriptで
    画面初期表示のときに
    iframe要素を書き換え、いいねボタンを設置するページのURLを動的に設定する

    <iframe class="like-btn" scrolling="no" frameborder="0" style="border:none; overflow:hidden; height:21px;" allowTransparency="true"></iframe>
    

    というように、もとのコードから
    src=”” の部分を削除
    変わりに
    class=”like-btn”
    を追加して書き換え対象にする

    そして、Javascriptで
    pageshowのタイミングで
    class=”like-btn”を探し
    .attr() で src=”” を設定する

    .attr()については
    http://semooh.jp/jquery/api/attributes/attr/properties/
    を参考に

    location.href は表示されているページのURLになるけど
    特殊文字があるため
    encodeURIComponent()
    でURLをエンコードする

    $(document).on("pageshow",'[data-role=page],function(e){
    
    var src = '//www.facebook.com/plugins/like.php?href=';
    src += encodeURIComponent(location.href);
    src += '&send=false&layout=button_count&width=200&show_faces=true&action=like&colorscheme=light&height=21';
    $('.like-btn').attr('src':src);
    });
    

    ソーシャルメディアボタンの追加

    ソーシャルメディアボタンの追加

    まず、Twitterのツイートボタンの追加

    追加するための必要なタグは
    https://about.twitter.com/resources/buttons
    で作成可能

    ただし、モバイルからでは無理て
    PCから行う

    生成されたaタグを張れば
    tweetリンクができる

    ただし、これだとリンクだけなので
    Twitter公式の外部jsファイルを読み込むことで
    画像つきのtweetボタンになる

    Twitter公式の外部jsファイルは
    widgets.js

    これを読み込むには

    $(document).on("pagebeforecreate",'[data-role=pager]',function(e){
    $.ajaxSetup(cache:true);
    $.getScript('http://platform.twitter.com/widgets.js');
    $.ajaxSetup(cache:false);
    });
    

    これは、Twitter公式の外部jsファイルの
    widgets.jsを
    pagebeforecreateイベントの発生時に
    $.getScript()で読み込んでいる

    widgets.jsの処理は
    HTMLの要素が読み込まれる前に実行する必要があるため
    pagebeforecreateイベントで実行している

    本来、外部jsは、src を指定したscriptをheadに埋め込むけど
    jQueryMobileでは、画面遷移後のページでは
    head要素が読み込まれない

    もし、ページが1つだけなら
    src付きのscriptでいいけど
    複数の画面でtweetボタンを付けることで使っているなら
    pagebeforecreateイベントで
    意図的にjsファイルを読み込む必要がある

    $.ajaxSetup(cache:true);
    $.ajaxSetup(cache:false);
    で一時的にjsファイルのキャッシュ機能を有効化している

    デフォルトでは
    $.getScript()
    のキャッシュ機能は無効化されているけど
    これだとページ遷移が発生するたびにTwitterのJavascriptを読みに行ってしまう
    つまり、通信に時間がかかる

    このため$.getScript()のキャッシュ機能を有効化することで
    すでにJavascriptを読み込んでいるなら
    Webサイトへアクセスせずに
    キャッシュされたJavascriptを使う

    こうすれば通信量削減もできる