ゲーム開発奮闘記

Unity・エフェクト・アプリ開発に関係した記事を書いています

Unity シェア機能(Twitter,FaceBook)実装時、iPadで実行中にクラッシュする解決方法


前回に続き、Unityでアプリからシェア機能(Twitter,FaceBookなど)を実装する際に、上手く行かなかった点と解決方法をまとめます。

2015/4/1時点で、シェア機能を実装するためのプラグインSocialConnector(v0.3.6)がアップデートされ、シェア機能はそちらを使うことで簡単に実装できるようになりました。。(2015/4/1追記)



以下は、こんなこともありましたということの、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さんにアドバイスを頂き、解決することが出来ました。


その他、参考にさせていただきましたサイト様です。qiita.com
woodsmall.co.jp
loveyan1225.blog.fc2.com

杏z様、参考サイト様、ありがとうございました。


以下宣伝です。
よければ、こちらのアプリも遊んでみてください!
f:id:KTK_kumamoto:20140610205346j:plain:w100
AppStoreリンク:HANABI-花火-
Google Play リンク:HANABI-花火-


人気ブログランキングへ
にほんブログ村 IT技術ブログ Unityへ