質問編集履歴

1 質問の修正

runun

runun score 336

2015/04/23 20:39  投稿

Xcodeからメッセージを返す方法
iOSのカメラロールに写真を保存し、その成功有無をC#のスクリプトに返したいと考えています。
処理が終了した後にCallbackされるメソッドをdelegateとしてxcodeに渡してます。
そのメソッドに引数を設定して、xcode側からメッセージを受け取るようにしたいのですが、うまくいきません。
ビルドも通らないため構文が間違えていると思うのですが、
参考サイトが少なく詰まってしまいました。
ご教授をお願いいたします。
ビルドエラー内容
------------------------------
/~~~/Plugins/iOS/Screenshot.mm:5:39: error: interface type 'NSString' cannot be passed by value; did you forget * in 'NSString'?
   typedef void (*Callback)(NSString message);
/~~~/Plugins/iOS/Screenshot.mm:17:22: error: string literal must be prefixed by '@'
           callback("Succeeded");
------------------------------
Screenshot.mm(全部)
```lang-<xcode>
#import <Foundation/Foundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
extern "C" {
   typedef void (*Callback)(NSString message);
   void _ScreenshotWriteToAlbum(const char* path, Callback callback) {
   UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithUTF8String:path]];
   ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
   NSMutableDictionary *metadata = [[NSMutableDictionary alloc] init];
   
   [library writeImageToSavedPhotosAlbum:image.CGImage metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) {
       if (error) {
           callback([error localizedDescription]);
       } else {
           callback("Succeeded");
       }
   }];
   }
}
```
CaptureScreenShot.cs(一部)
```lang-<c#>
   public delegate void Callback (string errorMessage);
   [DllImport("__Internal")]
   private static extern void _ScreenshotWriteToAlbum(string path, Callback callback);
   void EndCapture(){ // これは別メソッドから呼び出されます
       _ScreenshotWriteToAlbum (temporaryScreenshotPath,DidImageWriteToAlbum);
   }
   // カメラロール保存後、ネイティブ側から呼び出される。
   [AOT.MonoPInvokeCallbackAttribute(typeof(Callback))]
   static void DidImageWriteToAlbum (string errorMessage) {
       Debug.Log (errorMessage);
       Debug.Log ("【"+errorMessage+"】");
   }
```
こうじゃないか?というご意見だけでもかまいませんので、
よろしくお願いいたします。
よろしくお願いいたします。
=====追記=====
xcodeの一部を修正したらビルドは通りました。
  typedef void (*Callback)(NSString message);
 ⇒typedef void (*Callback)(NSString*);
  callback("Succeeded");
 ⇒callback(@"Succeeded");
しかし、コールバック(DidImageWriteToAlbum)は呼ばれるのですが、
メッセージが空(?)でログが出力されません。
【】
と出ています。
メッセージの渡し方に問題があるのか、
NSStringとstaringの変換が問題なのか、
わかる方いらっしゃいますでしょうか。
  • C#

    15208 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • iOS

    7121 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    8140 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • Unity

    10936 questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    3598 questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る