10: 2018-01-10 (水) 21:22:12 njf[6] [7] [8] | 現: 2018-05-28 (月) 15:20:05 njf[6] [9] [10] | ||
---|---|---|---|
Line 14: | 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 38: | 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 56: | Line 58: | ||
&ref(safeAreaCheck.jpg,mw:480,mh:360);クリックして拡大 | &ref(safeAreaCheck.jpg,mw:480,mh:360);クリックして拡大 | ||
- | ファイルの同期がうまくいっていないのか、実際にビルドするとなぜかまたこのエラーが出ることがありますが、上記の手順を繰り返すとたいてい消えます。 | + | 「LaunchScreen.storyboard」の方も同様にして「Safe Area」を消してください。 |
次にテスト用のボタンを配置します。Xcode右下の部分の丸いアイコンのタブをクリックし、スクロールするとボタンがあります。 | 次にテスト用のボタンを配置します。Xcode右下の部分の丸いアイコンのタブをクリックし、スクロールするとボタンがあります。 | ||
Line 76: | 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 86: | Line 89: | ||
Nameを「alertShowUp」とすると、その名前のメソッドがドラッグ&ドロップした場所に自動で挿入されます。 | Nameを「alertShowUp」とすると、その名前のメソッドがドラッグ&ドロップした場所に自動で挿入されます。 | ||
このメソッドがボタンが押されたとき(正確には押して離したとき)に呼び出されます。 | このメソッドがボタンが押されたとき(正確には押して離したとき)に呼び出されます。 | ||
+ | たまに「Could not insert なんとか」というエラーが出るときがありますが、Xcodeのキャッシュの問題らしいです。Xcodeを再起動するとうまくいったりします。 | ||
動作確認のために、このメソッドにログ出力の処理を追加します。 | 動作確認のために、このメソッドにログ出力の処理を追加します。 | ||
Line 101: | Line 105: | ||
*ANE用のライブラリの作成 [#f803ea57] | *ANE用のライブラリの作成 [#f803ea57] | ||
このページの目的は作成したボタンを押すとアラート画面が表示されるようなテスト用アプリを作り、かつANE用のライブラリを作ることです。 | このページの目的は作成したボタンを押すとアラート画面が表示されるようなテスト用アプリを作り、かつANE用のライブラリを作ることです。 | ||
- | このままこのプロジェクトに処理を書くこともできますが、そうするとあとでライブラリ製作用のプロジェクトを作って内容をコピーしなくてはいけなくなるため、面倒です。 | + | このままこのテスト用アプリのプロジェクトに処理を書くこともできますが、そうするとあとでライブラリ製作用のプロジェクトを作って内容をコピーしなくてはいけなくなるため、面倒です。 |
はじめからライブラリ用のプロジェクトを制作し、それを先ほど制作したテスト用のプロジェクトにリンクさせた方が簡単です。 | はじめからライブラリ用のプロジェクトを制作し、それを先ほど制作したテスト用のプロジェクトにリンクさせた方が簡単です。 | ||
そのためにここでライブラリ用のプロジェクトを制作します。 | そのためにここでライブラリ用のプロジェクトを制作します。 | ||
Line 155: | 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 163: | Line 167: | ||
}]]; | }]]; | ||
} | } | ||
+ | |||
} | } | ||
- (void) alertWindowShow:(NSString*)title : (NSString*)message{ | - (void) alertWindowShow:(NSString*)title : (NSString*)message{ | ||
Line 180: | Line 184: | ||
これに対応するanealert.hは以下の通りです。 | これに対応するanealert.hは以下の通りです。 | ||
#import <UIKit/UIKit.h> | #import <UIKit/UIKit.h> | ||
+ | |||
@interface AneAlert : NSObject{ | @interface AneAlert : NSObject{ | ||
@private | @private | ||
Line 188: | Line 192: | ||
- (void) alertWindowInit; | - (void) alertWindowInit; | ||
- (void) alertWindowShow:(NSString*)title : (NSString*)message; | - (void) alertWindowShow:(NSString*)title : (NSString*)message; | ||
+ | |||
@end | @end | ||
Line 207: | Line 211: | ||
[aneAlert alertWindowShow:@"Ane Test from objective-C" : message]; | [aneAlert alertWindowShow:@"Ane Test from objective-C" : message]; | ||
cnt++; | cnt++; | ||
+ | |||
} | } | ||
Line 217: | Line 221: | ||
int cnt; | int cnt; | ||
} | } | ||
+ | |||
@end | @end | ||
Line 261: | Line 265: | ||
#import "FlashRuntimeExtensions.h" | #import "FlashRuntimeExtensions.h" | ||
#import "anealert.h" | #import "anealert.h" | ||
+ | |||
AneAlert * aneAlert; | AneAlert * aneAlert; | ||
+ | |||
FREObject ANEAlertShow(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ | FREObject ANEAlertShow(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ | ||
NSLog(@"ANEAlertShow start"); | NSLog(@"ANEAlertShow start"); | ||
uint32_t argLength; //引数の長さ | uint32_t argLength; //引数の長さ | ||
const uint8_t *argBuff; //引数の値保持用 | const uint8_t *argBuff; //引数の値保持用 | ||
+ | |||
FREGetObjectAsUTF8(argv[0], &argLength, &argBuff);//引数取得 | FREGetObjectAsUTF8(argv[0], &argLength, &argBuff);//引数取得 | ||
NSString *arg1NSString = [NSString stringWithUTF8String:(char*)argBuff];//引数をNSStringへ変換 | NSString *arg1NSString = [NSString stringWithUTF8String:(char*)argBuff];//引数をNSStringへ変換 | ||
+ | |||
FREGetObjectAsUTF8(argv[1], &argLength, &argBuff);//引数取得 | FREGetObjectAsUTF8(argv[1], &argLength, &argBuff);//引数取得 | ||
NSString *arg2NSString = [NSString stringWithUTF8String:(char*)argBuff];//引数をNSStringへ変換 | NSString *arg2NSString = [NSString stringWithUTF8String:(char*)argBuff];//引数をNSStringへ変換 | ||
+ | |||
if(aneAlert == nil){ | if(aneAlert == nil){ | ||
NSLog(@"ANEAlertShow:init alert!"); | NSLog(@"ANEAlertShow:init alert!"); | ||
Line 284: | Line 288: | ||
return NULL; | return NULL; | ||
} | } | ||
+ | |||
void ANEAlertContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) | void ANEAlertContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) | ||
{ | { | ||
NSLog(@"ANEAlertContextInitializer start"); | NSLog(@"ANEAlertContextInitializer start"); | ||
+ | |||
*numFunctionsToTest = 1; | *numFunctionsToTest = 1; | ||
+ | |||
FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * *numFunctionsToTest); | FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * *numFunctionsToTest); | ||
+ | |||
func[0].name = (const uint8_t*) "alert"; | func[0].name = (const uint8_t*) "alert"; | ||
func[0].functionData = NULL; | func[0].functionData = NULL; | ||
func[0].function = &ANEAlertShow; | func[0].function = &ANEAlertShow; | ||
+ | |||
*functionsToSet = func; | *functionsToSet = func; | ||
+ | |||
NSLog(@"ANEAlertContextInitializer end"); | NSLog(@"ANEAlertContextInitializer end"); | ||
} | } | ||
+ | |||
void ANEAlertInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet){ | void ANEAlertInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet){ | ||
NSLog(@"ANEAlertInitializer start"); | NSLog(@"ANEAlertInitializer start"); |
(This host) = https://njf.jp