Cocos2d-xでTwitterにシェアする簡単な方法ないかなーと探していたら、
このようなサイトを見つけました。
http://giginet.hateblo.jp/entry/2015/12/01/234438
このサイト、たまたま僕がcocos2d-xを勉強し始めた時に買った本の作者でした。
ってことで使ってみようと思ったところ、iOSは本当に簡単に実装できました。
それこそ、READMEに書いてる通りなので割愛します。
しかし、僕の行方を阻むのはいつもAndroidです。
ってことで、試したことをメモしていきます。
cocos2d-x:version:3.10
android-studio:version:2.0
Androidとの戦い
とりあえず、READMEを”ちゃんと”読んで進めたら、
ビルド→実行までは行けました。
しかし、シェアボタンをタップしたら「問題が発生したため、libcocos2dxを終了します」というエラー。
Androidはエラーログが出ないため、やりにくいですねぇ・・・。
・AndroidManifestをいじってみる。
DLしたCCSocialShareの中に、AndroidManifestがあります。
そこに以下のような記述があるので、AppのManifestに追記してみます。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
→変化なし
・postMessageの引数を変えてみる。
postMessageの引数が、「TwitterかFBか,テキスト,画像パス,コールバック」って感じなんですが、
画像パスが無くてもいけるみたいなので、消してみた。
→エラー出る
・今度はコールバックを消してみる
コールバックも使ってないっぽいので、ラムダの中身を消してみた。
→消したらダメだったみたい。
・ImagePathの引数のところを、消すんじゃ無くて「””」にしてみた。
→変わりなし。
・CCSocialManager.cppをClassesに移動させてみる。
→エラー出る。
・ラムダの中にラムダがあるのが悪いのかな?とか思い、
別メソッドを作成してそこに実装してみる。
→当然のようにエラー
・一度、原点に戻ってマニュアルのコードをそのまま入れてみる。
→エラー
ってことは、そもそも導入から間違えているんだろうか・・・。
導入やり直し
2016/04/20追記
まずはこれ
$ cocos new YourFantasticGame -l cpp $ cd YourFantasticGame $ git clone https://github.com/giginet/CCSocialShare.git Classes/external/CCSocialShare
問題無く終了。
む、でも、さっき「LICENSE」とかなかったなぁ・・・。
次は「setting.gradle」に以下を追加→Sync now
// Add this setting include ':socialshare' project(':socialshare').projectDir = new File(settingsDir, '../Classes/external/CCSocialShare/CCSocialShare/android')
問題なし。
次はこれを、App/build.gradleの「dependencies」に追加。
// Add this line compile project(':socialshare')
問題なし。
Android.mkに以下を追加。それぞれ下のsocialshare関係のやつだけね。
LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../../Classes/AppDelegate.cpp \ ../../../Classes/HelloWorldScene.cpp \ ../../../Classes/external/CCSocialShare/CCSocialShare/android/CCSocialManager.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes \ $(LOCAL_PATH)/../../../Classes/external/CCSocialShare/CCSocialShare
これで終了。
まだソースコードはいじってないけど、ビルドしてみましょう。
→エラー無し!!
ソースコード書いて再挑戦してみると・・・。
→エラー・・・。
原因を考えてみる
2016/04/20追記
プログラムをずっとしてる人だったら、ソースコードとか見たら
原因がすぐわかるのかもしれないけど、僕にはさっぱりなので、
コードを色々書いたり消したりして原因を探ってみます。
ちなみに、コードはこんな感じ。
if (CCSocialShare::SocialManager::isAvailable(CCSocialShare::Service::TWITTER)) { CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER, "つぶやくコメント", [](CCSocialShare::PostResult result) { if (result == CCSocialShare::PostResult::SUCCEED) { // When to post is succeed log("Done"); } else if (result == CCSocialShare::PostResult::CANCELED) { // When to post is canceled log("Canceled"); } }); }
“つぶやくコメント”を変えているのと、imagePathを消してること以外はマニュアル通りです。
isAvailableというメソッドの中身が「return true」だけなんでよくわかりません。
とりあえず、このif文の中身を全部消して、下みたいにして動けば、
少なくともCCSocialShare自体はAndroidでも動いていると考えていいのかな・・・。
とりあえず、タップで音がなるようにしてみた。
if (CCSocialShare::SocialManager::isAvailable(CCSocialShare::Service::TWITTER)) { audio.itemGet(); }
→ちゃんと音が鳴る。
ってことは、CCSocialShare自体はちゃんと動いているけど、
その中身のpostMessageが何かしているっていうことでしょうか?
CCSocialManager.hを見てみると、postManagerはこうあります。
static void postMessage(Service service, const char* message, SocialManagerCompletionCallback callback);
引数が
service・・・これはTwitterかFacebookかでしょうか。
message・・・投稿する文章
SocialManagerCompletionCallback・・・多分、投稿に成功した時どうするかとか・・・?
「CCSocialShare::SocialManager::」これは、
名前空間「CCSocialShare」の「SocialManager」クラスの
「postManager」ってことだと思うので、関係ないと思う。
isAvailableにも使ってるし。
じゃあどこに問題が?と考えると、
「SocialManagerCompletionCallback」こいつが怪しそう。
っていうのも、READMEに「Callback function (Currently in iOS only)」ってあるので。
でも、引数としてcallbackを入れないとダメだから、どうすればいいんでしょうか・・・。
CCSocialManager.cppをいじるのは怖いし。
弄ろうにも、postManager内でcallback使ってないっぽいし・・・。
・ラムダ式を全部消してみる。
CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER, "つぶやくコメント", );
こんな感じに[](){}を消してみると・・・。
→普通に怒られた。
そりゃ、怒られるか。
・では、こうしてみよう。
中身のないラムダ式。
CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER, "無料脱出ゲーム-Tortoiseshell15- iOS:http://ur0.pw/tmYF Android:http://ur0.pw/tmYX", [](){});
→普通に怒られた。
ビルドすら通りません。
・これではどうでしょうか。
ラムダ式の{}の中身が悪さをしていると仮定。
CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER, "無料脱出ゲーム-Tortoiseshell15- iOS:http://ur0.pw/tmYF Android:http://ur0.pw/tmYX", [](CCSocialShare::PostResult result) { });
→ビルドは通る・・・。
でもアプリは落ちる・・・。
そもそも、CCSosialShare::PostResultって何。
ヘッダーファイルを見たら、「SUCCEED,FAILURE,CANCELED」ってあるので、
おそらく投稿が成功したかどうかでしょう。
だから何なんでしょうか・・・。
理解の範疇を超えてます。
進展あったら追記します。
コメントを残す