anz blog

KAKUSANっていうライブラリ作った

2019-02-25 #Swift #個人開発

ざっくりまとめ。

  • KAKUSAN というライブラリを作った
    • ユーザがスクリーンショットをとったのを検知するとシェアを促すというもの
    • テキストやURLを任意なものでシェアをできる
  • ちょいっと実装話
    • Notification でユーザがスクリーンショットをとったということを検知できる
    • 実は(?)Notification.Name を指定しないと全部受信できる

です。

環境

  • Xcode v10.1
  • Swfit v4.2
  • iOS v11.0+

KAKUSAN

KAKUSAN というライブラリつくりました!💪(唐突(笑))

なにをするもの?

README 見てもらえるとわかるかとおもいますが。

ユーザがスクリーンショットを取ると、それを検知してシェアを促すというもの。
うながすというか、シェアをユーザにまかせないでこっちでハンドリングしようとするもの。

こういう感じの挙動になります。

なぜ必要なのか?

スクリーンショットをとって SNS なんかにシェアするという行為が結構普及してきているなか、
開発者側からするとそれは大変ありがたいのですけど、
同時に惜しいな!!とも思うことが多々あるのではないでしょうか?

ユーザが自発的にスクリーンショットをとってシェアするときは、たいていアプリ情報はありませんよね?

「このアプリおもしろい!」with スクリーンショット

みたいな。(どのアプリだよ!ってなるパターンですね😇)
良くてなにかのハッシュタグがつくかなぁ...
たまーにアプリ名もついてるかなぁ...
ごくごくまれにストアやら公式サイトへのリンクが...(いや、このケースはほぼ無い気がする(笑))
という感じで、大変ありがたいしうれしいけど、、願わくばっ!と。

そこで、ユーザがスクリーンショットをとったときに、こちらでシェア用のテキストとかURLをつけてシェアさせることができたら。。。となるわけです。

このアイディアは僕が思いついたわけじゃなく、アプリマーケティング研究所さんの記事をみて「なるほど!」と思っただけですけど(笑)

使い方

単に使うだけなら任意なタイミングで KAKUSAN.shared.start() を呼び出してあげるだけで ok です。
が、これだけだと、シェア用のテキストとかつかないので、後は必要に応じて設定をもろもろ。

var config = KAKUSAN.Config(text: "#ツイクラ #anzfactory", url: URL(string: "https://itunes.apple.com/us/app/id1107663641?l=ja&ls=1&mt=8"))
KAKUSAN.shared.configure(confg)

こういう感じで設定すると、シェアするときにテキストとリンクがついてされるということに!✨
ただユーザからすると鬱陶しいかなぁ?っていう懸念もつきまといますが。。(汗)

実装話

この ユーザがスクリーンショットをとったことを検知する という要件。
実は(?)iOS だとさほど…というか全然難しくなく、さくっと実現できます。
Notification がとんでくるのです。

NotificationCenter.default.addObserver(
    self,
    selector: #selector(type(of: self).userDidTakeScreenshotNotified(notification:)),
    name: UIApplication.userDidTakeScreenshotNotification,
    object: nil
)

UIApplication.userDidTakeScreenshotNotification という Notification.Name で。
できるなら、userInfo あたりにスクリーンショットの UIImage がはいってれば最高なのですけど、
それは入っていないので受け取ったら自分でスクショをつくる必要があるのですけどね😇

スクリーンショットを自分で作るにあたって、ユーザが自分でとったときとどうしても同じにできないところがあって...
ステータスバーをいれることができないのですよね。
ある意味プライベートな情報なので、ないほうがシェアするに適しているともいえるけども。

ちょっとした Tips

Notification にまつわる Tips をも1つ。
addObserver(,selector:,name:,object:) で name はよくよくみると optional でそこを nil にしてやると、
すべての Notification を受け取ることができます(笑)
非公開の Notification.Name なんかもみれて、こういうの飛んでるのか〜とちょっとおもしろいです。

参考