はじめに
Unityで各種SNSへのテキストや画像の投稿機能を提供する無料Assetと言えば Social Connector が有名です。
が、LINEのアイコンを差し替えないといけなかったり直接LINEやTwitterに投稿できない(一旦共有先を選ぶUIを挟む必要がある)など機能的に不足を感じたので、LINEやTwitterなどに直接投稿が可能な Social Worker というAssetを使っていました。
機能的には完全上位互換なのになぜ Social Connector の記事ばかり見つかるのかが不思議。
とはいえ最近まで一旦共有先を選んでから投稿させる機能しか使っていなかったので、LINEに直接投稿するAPIを使ってみることに。
LINEに直接テキスト投稿できない問題が発生
iOSにて Social Worker の
CreateChooser(string message, string imagePath, Action<SocialWorkerResult> onResult = null)
PostLine(string message, string imagePath, Action<SocialWorkerResult> onResult = null)
を使用。
- 共有先を選ぶUI→画像・テキスト同時投稿:OK
- 直接画像のみの投稿:OK
- 直接テキストのみの投稿:なぜかできない ←???
エラー内容
Xcodeに吐かれていたエラーの内容が以下。
ios -canOpenURL: failed for URL: "(null)" - error: "Invalid input URL"
テキスト内容はちゃんと渡してるはずなのになぜかnull
になっていました。
なぜURL???
エラーの原因
Objective-Cが全然わからないので調査にだいぶ時間がかかりましたが、結論から言うとURLのパースに失敗していました。
具体的にはLINEへの直接投稿は内部で投稿用のカスタムURLスキーム(line://msg/text/{投稿内容}
)を使用していて、内容に日本語を含んでいたりスペースが混ざっているとNSURL *urlData = [NSURL URLWithString:url];
の箇所でURLとしてパースできずにnull
になっていました。
対処方法
SocialWorker/Plugins/iOS/SocialWorker.mm
に直接修正を加えるのは気が引けたのでUnityからAPIに渡すテキストをエンコードする方法を取ってみました。
以下の2つの方法でテキストをエンコードしてからAPIに渡せば期待通りに動作しました。
System.Uri.EscapeUriString(string stringToEscape)
WWW.EscapeURL(string s).Replace("+", "%20")
var str = ";, +, &, = ?, %, $, #, 日本語";
という文字列を渡して両方共ちゃんと投稿&表示できたので大丈夫かなと思います。
System.Web.HttpUtility.UrlPathEncode(string str)
というのもあるらしいですが、どうやら今のUnityでは使えないようなので却下。
参考資料
ちなみに
ソースを読んだらInstagramへの投稿でも同じようにカスタムURLスキームを使っているようだったので、同じ問題が起きるかもしれません。
あとonResult
コールバックは投稿後に呼ばれると思ってたらそうではなくて投稿しようとAPI呼んだときに呼ばれるようでした。思ってたのと違って残念。