うるおいらんど

アプリ開発やサイト制作のメモとか。

【UIActivity】Twitter共有時にのみハッシュタグをつけたい!Instagramにも投稿したい!を実装してみた【Swift 3】

魚ライン
魚ライン

まだSwift3を使っています。Reoです。

UIActivityViewControllerを用いてシェアをするときに、

・Twitter共有では、ハッシュタグをつけたい!

・Instagramにも投稿したい!

と思い、これらを実装してみたので紹介しますー。

どちらも公式アプリが端末内にインストールされているのが前提となります。

 

画像とテキストをシェアする!

通常UIActivityViewControllerを用いてシェアするときは以下のようにします。

UIActivityViewControllerのactivityItemsにシェアしたいテキストや画像やURL等が含まれた配列を渡します。

こちらも何かの参考になれば(【Swift】UIActivityで画像を複数枚同時に共有するとき【メモ】)

 

Instagramにシェアしたい!

Instagramにシェアするときは「単一の画像」もしくは「動画URL」等でないと、選択できるリストに出てきません。



先ほどのコードでの実装だと、このActivitiesのリストに出てきてくれません。

手っ取り早く投稿できるようにするには「単一画像」または「動画URL」のみをActivityItemsに渡してやります

これだとInstagramにも投稿できるようになります。
ちなみに動画は3秒以上でないとシェアできません。

 

でもこの場合、Twitterとかメールとか別のやつを選んだときにも「画像のみ」のシェアしかできません。
テキストも画像もシェアできるところでは、両方をシェアしたい。しかしこのUIActivityVC、開かれる前にアイテム渡しちゃうし、それに合わせてシェアできるものだけしか表示してくれない。(テキスト・画像を渡すとInstagramが表示されない。)

どうすればいいものか。色々試行錯誤して、ようやく実装できますた。ようやく本題です。

結局やりたいことは、
UIActivityVCが開かれたときには、「画像のみ」でシェアできるものを表示し、選択されたActivityがテキストも渡せるものなら、テキストと画像の両方を渡す
といったことです。

 

UIActivityItemSourceを用いる!

まず渡したいアイテムそれぞれにUIActivityItemSourceプロトコルに適合したNSObjectのサブクラスでを作ります。

 

まずは画像の方から。

初期化時にUIImageを渡すようにしておきます。

次にプレースホルダーの設定をします。

これは仮のアイテムで、UIImageをシェアするつもりだよ!っていうのが伝わればおkなやつです。実際に渡すアイテムと型が違っても一応おk。

このactivityViewControllerPlaceholderItem(_:)が結構肝です。これによってどのActivityが表示されるかが決まります。

最後に実際に渡したい値をセット。

 

ImageActivityItemはこんな感じになりました。

 

テキストを渡す

やりたいことは画像の時とほぼ同じです。UIImageかStringかの差です。

 

この時の1番のキモがここ!

ここではString型を返さずNSObjectを返しておく!というのが大事になります。

 

実際にこれらを使うときは、

のようにして配列に入れて渡してやります。

activityViewControllerPlaceholderItem(_:)を設定がここで活用されます。

最初の方法(text,imageをそのまま渡す方法)だと、「String型とUIImage型」をシェアするためのActivityアイコンが並びます。

しかしこの方法では、TextActivityItemのところでPlaceholderItemにNSObject()を渡しているので、「NSObject型とUIImage型」をシェアするためのアイコンが並びます。

このおかげでString型を含んでいると出てこないはずのInstagramのアイコンも出てくるようになります。∩(〃・ω・〃)∩ ばんじゃーい

 

そして実際にActivityアイコンを選択した後に、activityViewController(_:itemForActivityType:)が呼び出され、実際に必要なモノだけを自動的に選んでシェアします。(Instagramには画像のみが渡されます。テキストは渡されません。)

 

Twitterへのシェア時にのみハッシュタグをつけよう!

Twitterへのシェアの時にだけハッシュタグをつけたい!という場合には、先ほど作ったTextActivityItemのactivityViewController(_:itemForActivityType:)で分岐してやります。

 

TextActivityItemの全体はこんな感じになりました。

 

 

おまけ。

Instagramのときだけ画像を加工したいとき

Twitterへの投稿にはactivityTypeに .postToTwitterというのが用意されていますが、Instagramでは用意されてません。ので以下のように分岐できます。

こんな感じでやってみても良いかも。

 

UIActivity関連これはうまくいったんですが、Facebookへの投稿だけ開いて少しすると勝手に閉じるし、謎エラーもあって結構困る・・・・。

それではでは。

 

参考

Share image with hashtag via UIActivityViewController (Twitter, Facebook, Instagram) – stackoverflow

UIActivityViewControllerでTwitter共有の時だけハッシュタグを追加したい!

魚ライン
モッピー!お金がたまるポイントサイト
魚ライン

Swiftの記事一覧を見る

コメント

コメントは認証制です。詳しくは下記の注意をお読みください。

コメントを残す

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

魚ライン 魚ライン