Titanium でソーシャル・シェア


Social Share とは

Titaniumで「この画面をシェア」的なやつを作りたい場合の話をします。

ソーシャル・ログインの話じゃ無いです。

もちろん、凝ったことする為に、OAuthやシェアのAPIを叩くという事をしないといけない場合もあり得るかも知れません。その場合はアプリ内で各サービス個別に認証する事になります。シェアする対象が多い場合、ユーザの負担も大きいし、実装や保守も手間です。

TwitterやらFacebookなどのSNSでのShareや、メールやらメモアプリなどへの挿入など、いわゆるシェアだけ出来ればいいという場合であれば、OSや他アプリに任せるのが吉です。

シェア・エクステンションズの呼称が判らない問題

iOSのホラ、シェアする時、あの下からビヨーンと出てくるやつあるじゃないですか。アレ使いたいじゃないですか。

下からビヨーンと出るアレ
Share Extensions

コレは、Share Extensions といいます。正確にはApplication Extension の Share Extensionsみたいですが、文中 Share Extensionsで統一します。

注意点としては、iOS8以降である必要があります。
iOS7以前のシェアは1割切っている筈なんで、まぁ御の字じゃないでしょうか。

ところで、単にシェアと行った場合、「占有率」なのか「共有」なのか判らないですね。「Titanium シェア」で検索しても、「シェア」自体がビッグネームすぎて全く意図通りにならないので、この記事のタイトルも敢て「ソーシャル・シェア」としています。

インテント・チューザ

Androidの場合、あのインテント選べるアレありますよね。

呼称はアプリ・チューザなのかな。ぱっと見パスタのチェーン店にソラ見してしまいそうだし自分はIntent Chooserの方がしっくりくるのでそう呼んでます。

インテント選べるアレ
Intent Chooser

インテント・チューザに関しては、API level 1なんでAndroidなら全て使える筈です。

Titaniumでシェア機能は簡単

今回この記事を書こうと思った理由でもあるのですが、シェアエクステンションズとか呼称が判りづらいし表記も揺れがちなので、日本語で検索しても殆ど情報が出てこないです。

ですが、Titaniumでシェア機能を実装するのは実はすごく簡単なのです。

iOSの場合は、TiSocialモジュールを使えばOKです。Appcelerator Titanium Advent Calendar 2015 12日目 で既に紹介されていましたね。

Androidは、Ti標準の Ti.Android.createIntentChooser() を使えばよいです。

これらを使う事で、シェア対象のアプリがインストールされ(かつ対応し)ていれば、呼び出し側のアプリ(つまりTitanium側)から、各シェア先のアプリを意識する事なくソーシャル・シェアが出来る様になります。

以上です。

でもいいのですが、上記を抽象化してくれているsocialshareウィジェットを使えば、さらに簡単です。詳しくは公式ブログの記事(英語)を見て下さい。

これにより、Titaniumからは、Android/iOSの違いを(比較的)意識しないで済む様に出来ます。例えばテキストをシェアするだけなら全く同じ様に書けます。

yourcontroller.js
function doShare() {
    require('com.alcoapps.socialshare').share({
        stasus: 'こんにちは!!'
    });
}

良かった良かった。

iOSのシェア出来ない場合がある問題

但し、Share ExtensionsはiOS8でようやく導入されたばかりです。
肝心の呼び出される側のアプリが対応出来てない場合がある様です。

適切な例が思いつかないので私が困った実例を上げると、WeChat(微信)(中国のLineみたいなサービス) がそうでした。

因みに同じ中国の大手SNSでも、Sina Weibo(新浪微博)Tencent Weibo(腾讯微博) (両方とも中国のTwitter的なやつ)は、そんな事はありません。ソーシャルログインをする場合などは iOS版SDKを組み込む必要がある事は変わりないのですが、iOSアプリでシェアするだけなら Share Extensionsに対応していますので、個別に何かをする必要はありません。

そもそもWeChatはiOSの場合、単にシェアするだけの場合でも、WeChat SDKを組み込んで、開発者登録をして、戻り先のアプリのIDを登録したりする必要があるのです。
公式(言語は英語を選択)で調べた範囲では、OAuthとかのAPIは用意されている様には見えませんでした。

で、Titanium + iOS で WeChat シェアですが、一番簡単なのは、多分SDKをラップしたiOSモジュールを作る事です。
その場合、Share Extensionsとは別にWeChatへのシェアのユーザ・インターフェースを用意しないといけないです。イケてないですね。

UIActivity

では、Share Extensions に出現させる方法は無いのでしょうか。

そこも、TiSocialモジュールを改造すれば、比較的容易にできます。というかObjective-C書ける人なら超簡単だと思います。多分。

まず、UIActivity を継承したクラスを作って、WeChatのiOS版SDKを組み込んで、シェア機能をWeChat公式あたりを見ながら実装します。

そうやって出来たカスタムUIActivityを、TiSocialモジュールの、UIActivityViewを初期化する際の引数applicationActivitiesに渡してあげます。

TiSocial.Framework/Classes/DkNappSocialModule.m
    MyCustomUIActivity *myActivity = [[MyCustomUIActivity alloc] init];
    ...
    UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems: activityItems applicationActivities: @[myActivity]];

これで、Share Extensions に出現します。

最後にアプリの宣伝

勉強会とかで何度か話しましたが、Beautécamという美容系のアプリは、特に今年出来たホットなアプリでは無いのですが、Titaniumで書かれています。

Beautecam

iOS版
Android版

上記は日本版(日本語・英語)です。日本ではダウンロード出来ないけど、韓国、台湾、中国にローカライズされています。今回の記事は主に中国ローカライズ版で得た知見からでした。