iOS で「LINE で送る」を実装する
昨年末頃、LINE より公式に「LINE で送る」の仕様が公開されました。私の知る範囲では Objective-C で書かれた iOS 向けのライブラリは以下の2つです。
LineKit
実装されている内容
- LINE.app のインストール確認
- テキストを送る
- 画像を送る
上記の通り非常にシンプルなライブラリになっています。
LineActivity
実装されている内容
- LINE.app のインストール確認
- 未インストールの場合 App Store を開く
- テキストを送る
- 画像を送る
UIActivity のサブクラスとして実装されています。アイコン用の画像ファイルも添付されています。
練習がてら自分も作ってみた
実装されている内容
- LINE.app のインストール確認
- 未インストールの場合 App Store を開く
- テキストを送る
- 画像を送る
- 単機能クラスとUIActivityの二本立て
LINE アプリに対して文字列もしくは画像を送る CSNLINEOpener
クラスと UIActivity のサブクラス CSNLINEOpenerActivity
があります。ちょうど LineKit と LineActivity の間ですね。
CSNLINEOpenerActivity
の方はアイコン画像を用意できないのでイニシャライザで渡してもらうような形にしています。
とはいえ、私自身 LINE ユーザーじゃないので送信テストまではできてませんw ごめんなさい。
ご利用には ガイドライン に従う必要があります。
インストール
CocoaPods で
pod 'CSNLINEOpener', '~> 0.0'
ハマった・迷った・困ったポイント
実装例や既存ライブラリが探しにくい
"LINE" というキーワードが一般的すぎてなかなか探しにくいです。最終的には具体的なメソッド名やスキーマ名等で探したら見つかったのが上述の2つのライブラリです。
UIPasteboard を使った UIImage の渡し方
UIPasteboard を使って UIImage を渡すんですが、
pasteboard.image = image;
とかすると LINE 側で落ちます。 結論から言うと
[pasteboard setData:UIImagePNGRepresentation(image) forPasteboardType:@"public.png"];
としないとダメのようです。プロパティで渡せたらもうちょっと楽だったんですが。
画像の共有方法変更
iOS 7 から同一チーム ID のアプリ間でしか名前付き Pasteboard を使えなくなっています。最新の CSNLINEOpener では generalPasteboard を使うように変更しています。これにより画像の共有は可能ですがユーザーがコピーしていたデータは上書きされて消えるのでご注意ください。
UIActivity の使い方
私のドキュメントの読み間違いだったら申し訳ないんですが、私の理解はこんな感じです。
- ViewController を使う系か使わない系か?
- 使う系の場合
activityViewController
を実装して ViewController を返す
- 使わない系の場合
performActivity
を実装する
- 使う系の場合
- いずれの場合も処理完了時には
activityDidFinish:
を呼ぶ prepareWithActivityItems:
は data への参照を確保したり表示させたい ViewController の準備など、あくまでも自身が提供したい動作の準備のみを行う
たまに上記の私の理解とは違う実装をしているのを見かけますが、とりあえずは今回は自分の解釈で実装しました。
LINE のアイコン
UIActivity として提供する場合アイコンも一緒に配布したいわけですが、LINE の公式に配布されている画像リソースはそのままでは使いにくいですし、改変は NG っぽい。それに勝手に同梱するわけにもいかなそう。ということでこのライブラリを使う人に自分で用意してもらう形にしてみました。
まとめ
LINE で送る機能を作るのは簡単ですし、わざわざ自分で作らなくても既存のものを使わせてもらえばいいのですが、簡単な故に良い練習材料かなぁと思いました。気が向いたら使ってみてください。