Unity シェア機能(Twitter,FaceBook)実装時、iPadで実行中にクラッシュする解決方法
前回に続き、Unityでアプリからシェア機能(Twitter,FaceBookなど)を実装する際に、上手く行かなかった点と解決方法をまとめます。
2015/4/1時点で、シェア機能を実装するためのプラグイン、SocialConnector(v0.3.6)がアップデートされ、シェア機能はそちらを使うことで簡単に実装できるようになりました。。(2015/4/1追記)
@narudesign_dev @KTK_kumamoto @Zabosama お待たせしました。SocialConnector v0.3.6にてUnity5対応させました。
— けーご (@kyusyukeigo) 2015, 3月 31以下は、こんなこともありましたということの、Memoとして残します(2015/4/1追記)
■実装環境
- Unity 5.0.0f4 , Xcode 6.2
今回は、Unity公式チュートリアルのプラグインを作成する(シェア機能)に紹介されている、スクリプトを元にシェア機能の実装を進めました。
Manager.csに関しては、テスト用に必要のない部分を削除しました。
Manager.cs
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class Manager : MonoBehaviour
{
// シェアのテクスチャ
public Texture2D shareButtonImage;
// iOS側のコードを呼び出すための処理
[DllImport("__Internal")]
private static extern void Shooting_Share (string text, string url, string textureUrl);
void OnGUI ()
{
// シェアボタンを設置
if (GUILayout.Button (shareButtonImage, GUIStyle.none, GUILayout.Width (128), GUILayout.Height (128))) {
// シェアする処理をコルーチンで実行
StartCoroutine (Share ());
}
}
IEnumerator Share ()
{
// 現在の画面をキャプチャして名前をscreenShotとして保存する
Application.CaptureScreenshot ("screenShot.png");
// キャプチャを保存する処理として1フレーム待つ
yield return new WaitForEndOfFrame ();
string text = "2Dシューティング チュートリアル #unity";
string url = "http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/ios/01.html";
Debug.Log ("a");
// Application.CaptureScreenshotの保存先はApplication.persistentDataPath
string textureUrl = Application.persistentDataPath + "/screenShot.png";
// iOS側の処理を呼び出す
Shooting_Share (text, url, textureUrl);
}
}
そして、Share.mmに関しては、一部追加で
uiActivityViewController.popoverPresentationController.sourceView = UnityGetGLViewController().view;
uiActivityViewController.popoverPresentationController.sourceRect = CGRectMake(100.0, 100.0, 20.0, 20.0);
こちらの2行を追加しました。
こちらの2行を追加しないとiPad上でクラッシュします。
Share.mm
extern "C" {
void Shooting_Share(const char *text, const char *url, const char *textureURL) {
// NSStringに変換
NSString *_text = [NSString stringWithUTF8String:text];
NSString *_url = [NSString stringWithUTF8String:url];
NSString *_textureURL = [NSString stringWithUTF8String:textureURL];
UIImage *image = nil;
// パスから画像を取得
if ([_textureURL length] != 0) {
image = [UIImage imageWithContentsOfFile:_textureURL];
}
// テキスト・URL・画像の順に配列を作成する
NSArray *actItems = [NSArray arrayWithObjects:_text, _url, image, nil];
// UIActivityViewを作成する
UIActivityViewController *uiActivityViewController = [[[UIActivityViewController alloc] initWithActivityItems:actItems applicationActivities:nil] autorelease];
uiActivityViewController.popoverPresentationController.sourceView = UnityGetGLViewController().view;
uiActivityViewController.popoverPresentationController.sourceRect = CGRectMake(100.0, 100.0, 20.0, 20.0);
// Unity画面の上にビューを表示させる
[UnityGetGLViewController() presentViewController:uiActivityViewController animated:YES completion:nil];
}
}
追加した理由は、iPadの環境では、
UIActivityViewControllerを使用する際に表示する場所などの指定をしないとクラッシュするようです。
杏zさんにアドバイスを頂き、解決することが出来ました。
@KTK_kumamoto UIActivityViewControllerとUIActionSheet(ios8ならUIAlertControllerでstyleがsheetタイプ)とかは、表示させる基準点を座標で指定するか、あるいは基準となるUIViewを指定しないとですー
— 杏z (@AnzNetJp) March 31, 2015その他、参考にさせていただきましたサイト様です。qiita.com
woodsmall.co.jp
loveyan1225.blog.fc2.com
杏z様、参考サイト様、ありがとうございました。
以下宣伝です。
よければ、こちらのアプリも遊んでみてください!

AppStoreリンク:HANABI-花火-
Google Play リンク:HANABI-花火-