スマートフォン推進室で主にiOSアプリの開発を担当しています、富家(
@fm_tonakai)です。
iOS 6になりUIActivityViewControllerというものが追加され、シェアをする時などのメニューを出すのが容易になりました。
しかし、最初に共有するものをUIActivityViewControllerに渡し、その後ユーザーがサービスを選択する関係で、どのサービスでも同じテキストを共有してしまいます。
たとえばTwitterで共有するときはハッシュタグを追加し、他のサービスでの共有には付けないなど普通に文字列を指定してはできません。
そこで、今回はUIActivityViewControllerでTwitterの時のみハッシュタグを追加する方法についてお話したいと思います。
UIActivityViewControllerを用いるときは初期化時に共有するオブジェクトを下記のように配列で指定します
しかしこのやり方だとTwitter以外のFacebookなどにもハッシュタグがついたテキストを共有しようとしてしまいます。
この問題を解決するにはUIActivityItemSourceというプロトコルを実装したオブジェクトを共有します。
このプロトコルでは2つのメソッドが定義されておりそれぞれ実装します
-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
上記はUIActivityViewControllerを表示するときに呼ばれます。
このメソッドの返り値が各Activityが共有できるかの判定をするときに用いられます。
-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
そしてこのメソッドが肝です。これがユーザーがActivityを指定した時に
実際に共有する情報を返すよう実装します。
この時メソッドの引数に選択されたactivityTypeが渡されます。
ここでactivityTypeがTwitterだった場合にハッシュタグをつけたテキストを返せばよいわけです。
例えば下記のような実装になります。
使うときはUIActivityViewControllerの初期化時に渡す配列にこのオブジェクトを渡してやるだけです。
これでTwitterの時だけハッシュタグをつけることが出来ました。
このメソッドを実装すれば例えば自作のモデルオブジェクトをUIActivityViewControllerに渡すだけで
共有するものを指定できるので便利かもしれません。
問題点としては1オブジェクトについて1データということで 例えばタイトルとURLをシェアしたいときはタイトルを返すオブジェクトとURLを返すオブジェクトを2つ用意しなければならない点でしょうか。
ちょっとその辺残念な感じですが、一応共有するサービスによって共有するデータを変更できるというのが今回の発見でした。
という記事を書いたら前田くん(
@ArubaitoShain)がblockで値を返すものを作ってくれました。
blockの返り値に文字列やURLを返せば良いです。
かなり便利になったので残念じゃなくなったかも!?
意外に使えるかもしれないUIActivityViewControllerにご期待ください。