8: 2018-01-08 (月) 22:38:58 njf[6] [7] [8] | 現: 2018-05-28 (月) 15:20:05 njf[6] [9] [10] | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | [[iOSでのANEの作成]]に戻る | ||
+ | |||
ANEを作成するためには、iOS側のプログラムをまとめたスタティックライブラリ(.aファイル)が必要となります。その制作方法やテストの仕方をこちらでご紹介します。 | ANEを作成するためには、iOS側のプログラムをまとめたスタティックライブラリ(.aファイル)が必要となります。その制作方法やテストの仕方をこちらでご紹介します。 | ||
Line 12: | Line 14: | ||
&ref(newProject.jpg,mw:480,mh:360);クリックで拡大 | &ref(newProject.jpg,mw:480,mh:360);クリックで拡大 | ||
- | プロジェクト名などを指定します。ここでは「AneAlertSample」としています。Langageは「Objective-C」です。他の言語でもANEが作れるかも知れませんが、資料が一番多いObjective-Cが一番無難です。Teamの所には登録済みの開発者アカウントを入れておきましょう。 | + | プロジェクト名などを指定します。ここでは「AneAlertSample」としています。Langageは「Objective-C」です。他の言語でもANEが作れるかも知れませんが、資料が一番多いObjective-Cが一番無難です。Objective-C忘れた、という方はこちら「[[iOS/Objective-C/チートシート]]」をどうぞ。Teamの所には登録済みの開発者アカウントを入れておきましょう。 |
&ref(newProjectSetting.jpg,mw:480,mh:360);クリックで拡大 | &ref(newProjectSetting.jpg,mw:480,mh:360);クリックで拡大 | ||
Line 36: | Line 38: | ||
ANEの作成はけっこう面倒です。それを何度もやらなくてすむように、iOS上でテストはできるだけ行ってから、ANEの作成にうつった方が効率的です。そのためのテスト用ボタンを設置します。 | ANEの作成はけっこう面倒です。それを何度もやらなくてすむように、iOS上でテストはできるだけ行ってから、ANEの作成にうつった方が効率的です。そのためのテスト用ボタンを設置します。 | ||
- | Xcodeでプロジェクトを作成すると、デフォルトでは「Safe area」というレイアウトを利用しています。しかし、Build TargetをiOS8にしていると、「Safe area」はiOS9からなので、エラーが発生します。プロジェクトを開いただけなら問題ないように見えますが、実行しようとしたり、「Main.storyboard」を表示しようとすると以下のようなエラーが出ます。 | + | Xcodeでプロジェクトを作成すると、デフォルトでは「Safe area」というレイアウトを利用しています。しかし、Build TargetをiOS8にしていると、「Safe area」はiOS9からなので、エラーが発生します。プロジェクトを開いただけなら問題ないように見えますが、実行しようとしたり、「Main.storyboard」や「LaunchScreen.storyboard」を表示しようとすると以下のようなエラーが出ます。 |
&ref(safeAreaError.jpg,mw:480,mh:360);クリックして拡大 | &ref(safeAreaError.jpg,mw:480,mh:360);クリックして拡大 | ||
- | テスト用のアプリでは、特に「Safe area」は利用しないので削除します。 | + | iOS9にすればこのエラーは防げます。 |
+ | |||
+ | もしiOS8のままで開発するなら、特に「Safe area」は利用しないので削除します。 | ||
そのために、まず「Main.storyboard」の「Safe Area」を選択します。 | そのために、まず「Main.storyboard」の「Safe Area」を選択します。 | ||
Line 54: | Line 58: | ||
&ref(safeAreaCheck.jpg,mw:480,mh:360);クリックして拡大 | &ref(safeAreaCheck.jpg,mw:480,mh:360);クリックして拡大 | ||
- | ファイルの同期がうまくいっていないのか、実際にビルドするとなぜかまたこのエラーが出ることがありますが、上記の手順を繰り返すとたいてい消えます。 | + | 「LaunchScreen.storyboard」の方も同様にして「Safe Area」を消してください。 |
次にテスト用のボタンを配置します。Xcode右下の部分の丸いアイコンのタブをクリックし、スクロールするとボタンがあります。 | 次にテスト用のボタンを配置します。Xcode右下の部分の丸いアイコンのタブをクリックし、スクロールするとボタンがあります。 | ||
Line 74: | Line 78: | ||
次にボタンを押したときの処理を定義します。 | 次にボタンを押したときの処理を定義します。 | ||
Xcodeのウインドウの右上にある丸いボタンを押して、StoryboardとViewController.mを両方表示します。 | Xcodeのウインドウの右上にある丸いボタンを押して、StoryboardとViewController.mを両方表示します。 | ||
+ | ViewController.mが表示されない場合は、エディタ上の「< >」とか書いてある右側の部分をクリックしてManualにしてViewController.mを選択したり「< >」をクリックしたりすると切り替わります。 | ||
&ref(twoEditorBtn.jpg,mw:480,mh:360); | &ref(twoEditorBtn.jpg,mw:480,mh:360); | ||
Line 84: | Line 89: | ||
Nameを「alertShowUp」とすると、その名前のメソッドがドラッグ&ドロップした場所に自動で挿入されます。 | Nameを「alertShowUp」とすると、その名前のメソッドがドラッグ&ドロップした場所に自動で挿入されます。 | ||
このメソッドがボタンが押されたとき(正確には押して離したとき)に呼び出されます。 | このメソッドがボタンが押されたとき(正確には押して離したとき)に呼び出されます。 | ||
+ | たまに「Could not insert なんとか」というエラーが出るときがありますが、Xcodeのキャッシュの問題らしいです。Xcodeを再起動するとうまくいったりします。 | ||
動作確認のために、このメソッドにログ出力の処理を追加します。 | 動作確認のために、このメソッドにログ出力の処理を追加します。 | ||
Line 99: | Line 105: | ||
*ANE用のライブラリの作成 [#f803ea57] | *ANE用のライブラリの作成 [#f803ea57] | ||
このページの目的は作成したボタンを押すとアラート画面が表示されるようなテスト用アプリを作り、かつANE用のライブラリを作ることです。 | このページの目的は作成したボタンを押すとアラート画面が表示されるようなテスト用アプリを作り、かつANE用のライブラリを作ることです。 | ||
- | このままこのプロジェクトに処理を書くこともできますが、そうするとあとでライブラリ製作用のプロジェクトを作って内容をコピーしなくてはいけなくなるため、面倒です。 | + | このままこのテスト用アプリのプロジェクトに処理を書くこともできますが、そうするとあとでライブラリ製作用のプロジェクトを作って内容をコピーしなくてはいけなくなるため、面倒です。 |
はじめからライブラリ用のプロジェクトを制作し、それを先ほど制作したテスト用のプロジェクトにリンクさせた方が簡単です。 | はじめからライブラリ用のプロジェクトを制作し、それを先ほど制作したテスト用のプロジェクトにリンクさせた方が簡単です。 | ||
そのためにここでライブラリ用のプロジェクトを制作します。 | そのためにここでライブラリ用のプロジェクトを制作します。 | ||
Line 153: | Line 159: | ||
if(alertController == nil){ | if(alertController == nil){ | ||
NSLog(@"alertWindowInit"); | NSLog(@"alertWindowInit"); | ||
+ | |||
alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert]; | alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert]; | ||
+ | |||
// Yes button | // Yes button | ||
[alertController addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { | [alertController addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { | ||
Line 161: | Line 167: | ||
}]]; | }]]; | ||
} | } | ||
+ | |||
} | } | ||
- (void) alertWindowShow:(NSString*)title : (NSString*)message{ | - (void) alertWindowShow:(NSString*)title : (NSString*)message{ | ||
Line 178: | Line 184: | ||
これに対応するanealert.hは以下の通りです。 | これに対応するanealert.hは以下の通りです。 | ||
#import <UIKit/UIKit.h> | #import <UIKit/UIKit.h> | ||
+ | |||
@interface AneAlert : NSObject{ | @interface AneAlert : NSObject{ | ||
@private | @private | ||
Line 186: | Line 192: | ||
- (void) alertWindowInit; | - (void) alertWindowInit; | ||
- (void) alertWindowShow:(NSString*)title : (NSString*)message; | - (void) alertWindowShow:(NSString*)title : (NSString*)message; | ||
+ | |||
@end | @end | ||
Line 205: | Line 211: | ||
[aneAlert alertWindowShow:@"Ane Test from objective-C" : message]; | [aneAlert alertWindowShow:@"Ane Test from objective-C" : message]; | ||
cnt++; | cnt++; | ||
+ | |||
} | } | ||
Line 215: | Line 221: | ||
int cnt; | int cnt; | ||
} | } | ||
+ | |||
@end | @end | ||
Line 254: | Line 260: | ||
このうち終了関数については、終了処理がないなら特に定義しなくてもかまいません。 | このうち終了関数については、終了処理がないなら特に定義しなくてもかまいません。 | ||
+ | この事を踏まえて、ANE呼び出し処理は以下のようになります。 | ||
+ | |||
+ | #import <Foundation/Foundation.h> | ||
+ | #import "FlashRuntimeExtensions.h" | ||
+ | #import "anealert.h" | ||
+ | |||
+ | AneAlert * aneAlert; | ||
+ | |||
+ | FREObject ANEAlertShow(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ | ||
+ | NSLog(@"ANEAlertShow start"); | ||
+ | uint32_t argLength; //引数の長さ | ||
+ | const uint8_t *argBuff; //引数の値保持用 | ||
+ | |||
+ | FREGetObjectAsUTF8(argv[0], &argLength, &argBuff);//引数取得 | ||
+ | NSString *arg1NSString = [NSString stringWithUTF8String:(char*)argBuff];//引数をNSStringへ変換 | ||
+ | |||
+ | FREGetObjectAsUTF8(argv[1], &argLength, &argBuff);//引数取得 | ||
+ | NSString *arg2NSString = [NSString stringWithUTF8String:(char*)argBuff];//引数をNSStringへ変換 | ||
+ | |||
+ | if(aneAlert == nil){ | ||
+ | NSLog(@"ANEAlertShow:init alert!"); | ||
+ | aneAlert = [[AneAlert alloc] init]; | ||
+ | [aneAlert alertWindowInit]; | ||
+ | } | ||
+ | [aneAlert alertWindowShow: arg1NSString : arg2NSString]; | ||
+ | NSLog(@"ANEAlertShow end"); | ||
+ | return NULL; | ||
+ | } | ||
+ | |||
+ | void ANEAlertContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) | ||
+ | { | ||
+ | NSLog(@"ANEAlertContextInitializer start"); | ||
+ | |||
+ | *numFunctionsToTest = 1; | ||
+ | |||
+ | FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * *numFunctionsToTest); | ||
+ | |||
+ | func[0].name = (const uint8_t*) "alert"; | ||
+ | func[0].functionData = NULL; | ||
+ | func[0].function = &ANEAlertShow; | ||
+ | |||
+ | *functionsToSet = func; | ||
+ | |||
+ | NSLog(@"ANEAlertContextInitializer end"); | ||
+ | } | ||
+ | |||
+ | void ANEAlertInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet){ | ||
+ | NSLog(@"ANEAlertInitializer start"); | ||
+ | *extDataToSet = NULL; | ||
+ | *ctxInitializerToSet = &ANEAlertContextInitializer; | ||
+ | NSLog(@"ANEAlertInitializer end"); | ||
+ | } | ||
+ | |||
+ | ここでANEAlertInitializerが初期化処理です。この関数名はあとでANEの作成時に必要です。 | ||
+ | ANEAlertContextInitializerは呼び出し関数を定義しています。 | ||
+ | ここではANEAlertShow関数を「alert」という文字列で呼び出せるようにしています。 | ||
+ | ANEAlertShowがアラート表示する関数です。ここで引数の取得方法が特殊なので注意していください。 | ||
+ | FREGetObjectAsUTF8を使っていますが、UTF8以外にも型に合わせたいろいろな関数があります。 | ||
+ | 詳しくは公式ドキュメント「[[ネイティブ C API リファレンス ユーザー使用関数>https://help.adobe.com/ja_JP/air/extensions/WSb464b1207c184b14-62b8e11f12937b86be4-7ff9.html]]」を参照してください。 | ||
+ | |||
+ | 最後にAneAlertCall.mがちゃんとライブラリに含まれているか確認します。ライブラリプロジェクトのターゲット>anealert>「Build Phases」>「Compile Sources」にAneAlertCall.mがあればOKです。Xcodeのファイルの追加を使うとの通常自動で入っています。入っていなかったらここで加えてください。 | ||
+ | |||
+ | &ref(aneAlertComileS.jpg,mw:480,mh:360); | ||
+ | |||
+ | *ライブラリファイル(.aファイル)の取り出し [#q2a8ceec] | ||
+ | |||
+ | ここで作成したライブラリを取り出します。 | ||
+ | まず実機をUSBで接続し、左上のテスト用の端末をその実機とします。 | ||
+ | |||
+ | &ref(targetIpod.jpg,mw:480,mh:360); | ||
+ | |||
+ | こうしないとシミュレーター用のバイナリが書き出されることがあるようです。 | ||
+ | |||
+ | 次にメニューのProductからBuildを選びます。 | ||
+ | これでライブラリが作成されます。 | ||
+ | 少し余分に時間がかかりますが、場合によっては古いファイルが残らないように、念のためCleanしてからBuildした方が良いかも知れません。 | ||
+ | |||
+ | &ref(buildClean.jpg,mw:480,mh:360); | ||
+ | |||
+ | Buildの時に以下のような警告がでますが気にしないでください。 | ||
+ | |||
+ | &ref(FlashRuntimeExtensionCaution.jpg,mw:480,mh:360); | ||
+ | |||
+ | これはコメントの書き方のルールについてで、しかも場所はヘッダーファイルです。実際のライブラリにこの部分は含まれず問題ありません。 | ||
+ | |||
+ | Buildが正常に終われば、左側のProductのところにあるライブラリを右クリックまたはCtrl+クリックします。 | ||
+ | メニューが現れるので「Show in Finder」を選択すればファインダーでライブラリが参照できます。 | ||
+ | |||
+ | もしライブラリがないと赤字で表示されるので、エラーを修正してください。 | ||
+ | |||
+ | &ref(libane.jpg,mw:480,mh:360); | ||
+ | |||
+ | 以上でライブラリの作成は終わりです。 | ||
+ | |||
+ | [[iOSでのANEの作成/swcの作成]]に進む | ||
- | &font(Red){作成中}; | + | [[iOSでのANEの作成]]に戻る |
(This host) = https://njf.jp