2011年12月6日火曜日

画像を縮めますかね? え? いいって? まあ、そんなこと言わないでw

今回は画像を小さいくしていきます。
下のメソッドは、引数にUImageとサイズをぶっこんでいって 
小さく なったUIImageを返すというものです。

こりゃ解説するまでもないね。
コンテキスト作って、そこに描画して、それをgetなんちゃらしてUIImageにする。

でもあえて書くとすると、
なぜ  [image drawInRect:rect]; なんだ?ってことかな。 

もちろん
CGContextDrawImage(context, rect, image.CGImage);という書き方もあります。
でもこれだとY軸が反転しちゃうんだな。



-(UIImage*)shrinkImage:(UIImage*)image size:(CGSize)size{
   
    // 計算した描画領域を指定して描画準備。
    CGRect rect = CGRectMake(0, 0, (int)size.width, (int)size.height);
    UIGraphicsBeginImageContext(rect.size);
   
    // 描画はすべて新しい描画領域が対象となる。
    [image drawInRect:rect]; // イメージ描画。
    // 新しい描画領域からUIImageを作成。
    image = UIGraphicsGetImageFromCurrentImageContext();// スケーリングされたUIImageを設定。
    UIGraphicsEndImageContext(); // 解除。
   
    return  image;
}

画面遷移の3パターン

こんにちは、こーじーです。

iPhoneアプリの開発を始めて僕が最初にハマったのは画面遷移です。
画面を移動する為に主に3つの方法があるのですが、そのうちNavigationControllerを使う方法でかなりはまりました。
基底となるViewControllerを設定していなかったり、もともとIBを使わずにコードだけで画面を作っていたものを後からXib化すると動かないとか。


3つの方法って?という方もいらっしゃるのではないでしょうか?



これです!
 1、 AddSubViewを使ったパターン
 2、 modalViewを使ったパターン
 3、   NavigationControllerを使ったパターン


そのうち一番めんどうなのがNavigationControllerを使ったパターンだと思いますねー

基本となるのが1番目のAddSubViewのパターンです。
でも、僕が一番好きなのは2番のパターンなのでこちらから。







modalViewControllerのパターン
-(void)ch{

    SecondViewController * viewController =
[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
[self presentModalViewController:viewController animated:YES];
[viewController release];}


戻る側のViewには
-(void)back{
   [self dismissModalViewControllerAnimated:YES];
}


このパターンは戻る側のコードが変化しないで書けるので、
ViewControllerを部品化しやすいのと、
アニメーションが簡単なのが便利です。



UIViewControllerのプロパティmodalTransitionStyleを変更することでアニメーションを変化させることができます。
  • UIModalTransitionStyleCoverVertical
    • 下から上にせり出してくる。デフォルトはこれ。
  • UIModalTransitionStyleCrossDissolve
    • 画面がフェードアウト、フェードインする
  • UIModalTransitionStyleFlipHorizontal
    • 水平方向に画面がくるっと回る(フリップする

使い方は、呼び出し側でviewControllerインスタンスを生成して
[self present〜 を呼び出す前に

viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  
などの一行を書くだけ。








AddSubViewパターン
これはViewControllerのインスタンスを作ってaddSubViewするだけです。
コードで書くと

-(void)ch{
    SecondViewController * viewController =
[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
[self.view addSubView:viewController.view];
[viewController release];
 }

戻る側のSecendViewControllerの実装は
-(void)back{
    [self.view removeFromSuperView];
 }


NavigationControllerパターン
  
まずAppDelegateに宣言をします。
// ヘッダにて宣言を追加
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
        UIViewController* rootController;
     FirshViewController* viewController;
 



つづいて、起動時に呼び出されるメソッドに記述をします。
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
   
    FirstViewController *top = [[[instrumentViewController alloc]init]autorelease];
   
    //起点となるViewControllerを設定
    rootController = [[UINavigationController alloc]initWithRootViewController:top];
   
    // Add the view controller's view to the window and display.
    [window addSubview:rootController.view];
    [window makeKeyAndVisible];


これでNavigationControllerによる画面遷移の準備が整いました。

次にFirstViewContollerから次のViewに画面遷移するコードです。
   
-(void)ch{ 

SecondViewController *viewController = [[Config alloc] initWithNibName:@"SecondViewController" bundle:nil];  //これはxibからViewVontrollerのインスタンスを作っている。

.ctrl = self;//値を設定するものがあればここで入れる

    if(conf){
        [self.navigationController pushViewController:viewController animated:YES];
    }
}
}


この方法で画面遷移すると、移動後のViewにNavigationBarと戻る為のボタンが自動で表示されます。NavigationControllerのスタック領域にViewControllerのインスタンスをPushして画面を移動し、戻るとPopされて格納したデータが破棄されます。

動き的にブラウザのリンクを辿っていって、戻るボタンで戻るといった動きと同じと思っていただければイメージしやすいですね^^
スタックとは要するに後入先出しのデータ格納領域のことです。

もちろんこの領域に直接アクセスして画面遷移することもできます。
例えば、今は5番目の画面だけれど2番目に開いた画面に戻るとか。




ではまた!






※NavigationControllerパターンについては、オレオレテンプレートを作るにちょっと詳しく書き直しましたw




  

2011年11月25日金曜日

画像をPhotoLibralyに保存する


さて、前回作った画面キャプチャのUIImageって何に使うんだ?と思った人は多いでしょうね。
まあ、使い道としてはカメラやフォトライブラリから取得した写真をごにょごにょして、それをまた保存するなりメールで送りたいって感じでしょうかね。

コールバック関数の部分は別に nil にしてもらっても良いと思います。

-(void)saveToPhotoLibrary{

 UIImage* img = [self screenCapture];//前回の記事を呼んでちょ 
 NSData *pngData = UIImagePNGRepresentation(img);
 UIImage *screenImage = [[UIImage imageWithData:pngData] retain];
 
//コールバック関数の設定  
    SEL sel = @selector(savingImageIsFinished:didFinishSavingWithError:contextInfo:);
    UIImageWriteToSavedPhotosAlbum(screenImage, self, sel, nil);//ここのselが保存後に呼ばれる。

}



//コールバック関数

- (void)savingImageIsFinished:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void *)contextInfo{
   
    NSString* message;
    if(!error){
        message = @"success save";
    }else{
        message = @"fail save";
    }
    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"保存" message:message
                              delegate:self
                              cancelButtonTitle:nil
                              otherButtonTitles:@"OK",nil];
    [alertView show];
    [alertView release];
}


2011年11月24日木曜日

お世話になった書籍たち

デベロッパー登録してはや一年半。
思えば、まったくアプリが売れてねぇ...



書籍だって何冊買ったかわからん位買ってるので、もうけるどころか大赤字です。
 まあ、今は本業でiOSやってるので就職活動代とみるか。。。

 始めたばかりの頃は、サンプルのコードを書き写してビルドするのが精一杯だったのですが、一体僕はどうやって開発できるようになったのだろう?
そんなことを考えてみました。
※そんなこと考える暇があったら設計書の一つでも書けと言われそうですが。。。





やっぱり大金をつぎ込んできた書籍達のおかげでしょうか。今日はその中でも厳選してご紹介致します。





interfaceBuilderを使わないというポリシーの本。
この本にどれだけ助けられたか。
そもそもInterfaceBuilderはわかりやすいけれど、ちゃんと使いこなすにはやっぱりコードが書けないとです。この本で学んでから、再びIBに戻ると新しい世界が開けます。
中級者くらいでも、ど忘れしたときに開くと便利かも。



MVCの何たるかが分かりやすく書いてあります。
この本の手法で、スマートで仕様変更にも耐えられるアプリが作りやすくなります。
アプリは作ったことあるけれど、デバッグしてるとよくBad Access食らってアプリが落ちるなんてひとにもおすすめかも。
中級者向け。



OpenGL ES1なのでちょっと古い感じになりましたが、この本にもすごく助けられた。OpenGLなんかやってられるかと思っていたけど、この本のおかげでなんとかなることが分かりました。
この本をやりつつ、OpenGL ESのクラスリファレンスを読むとより理解度が高くなるかもしれません。





目からウロコな一冊。パフォーマンスに関する部分は読まずに死ねるかという感じ。




これは枕にするにはちょうどいい本。はじめは呪文に見えましたw
iOSに関係ないガーベジコレクションについても書かれています。上を目指すには必読。




この本から、未だにかゆいところに手が届くネタを見つけることがあります。お気に入りの一冊。



iOS4の新機能に特化した書籍。カメラ周りやblocksについてなど内容は盛りだくさん。読んで納得の一冊。




唯一のCoreAudioの本。音系のアプリを作るなら必携の一冊。



真剣に読むというよりは、持っておくと便利な本。
 



この本のサンプルは作ってて楽しかった♪
UIKitを一通り触ってもうちょっと何かって人にお勧めです。




僕が初めて買った本。
書いてある通りに作ればサンプルは作れます。だけど、肝心のところが理解できないかも。
これと併用してObjective-Cの文法の本を買うと良いと思います。

cocos 2d関連


敷居の高そうなcocos2Dを自分の土俵に引きづり込めた一冊。おすすめ




上のやつを読んでからこの本を読むとよさそう。



開発以外



いろいろとアプリの企画からプロモーションまで為になることが書いてある。

画面をキャプチャする


久しぶりの投稿ですみませんm(_ _)m

最近 CoreGraphicsにハマってます。(以下 コアグラ)
いやーいろいろできて便利です♪

もう既にコアグラしてるぜっ!って人は突っ込みどころ満載かもしれないので手加減してくださいね。

まずは、画面に映ったものをUIImageに
しちゃいましょうか。

こんな感じ。


- (UIImage *)screenCapture {
   
    UIImage *capture;
    CGRect rect = self.view.frame;
   
    UIGraphicsBeginImageContext(rect.size);//コンテキストを作る。
    [[UIApplication sharedApplication].keyWindow.layer renderInContext:UIGraphicsGetCurrentContext()];//スクリーンからキャプチャしてコンテキストにレンダリング
    capture = UIGraphicsGetImageFromCurrentImageContext();
    

 UIGraphicsEndImageContext();//コンテキストを閉じる。
   
    return capture;



コアグラでイメージ作るのは、大抵そうなんだけど
メモリ上の空間(コンテキスト)に描画して (ここでは画面に結果が出力されない)
そいつを 
capture = UIGraphicsGetImageFromCurrentImageContext(); 

 でUIImageとして取り出す方法が基本w 




上の例では、ナビゲーションバーとかも画面に映ったものは問答無用でUIImageにしてるけれど
[app.view.layer renderInContext:UIGraphicsGetCurrentContext()];
とかに変更すると、Viewで狙いうつこともできます。

リリース前のplistとかプロジェクト周りの設定について

 あー、完全に自分の為のメモです

アイコン
iPad用とRatina ディスプレイ用にアイコンファイルを設定する。
用意するファイル
Icon.png = 57×57
Icon@2x.png = 114 × 114 (iPhone4用)
Icon-72.png = 72 × 72 (iPad2用)

plist設定
Icon file を空欄にする
行を追加してIcon filesを選ぶ。Item 0 Item1と追加して、項目にアイコンのファイル名を入れていく。
これにより、デバイスによって最適な画像のサイズを選んでアイコンを表示してくれるようになる。

必要であれば、検索で表示されるときの小アイコンも設定する。

Icon-Small.png 29 × 29 (iPhone3GS用小アイコン)
Icon-Small-50.png 50 × 50 (iPad用小アイコン)
Icon-Small-@2x.png 58 × 58(iPhone4用小アイコン)



<メモ>
iPad対応にする手順
http://blog.myrss.jp/archives/2010/04/iphone_ipad.html

2011年6月6日月曜日

LocalizedStringファイルの生成を半自動化する。

開発の規模が大きくなってくると、LocalizedStringの数がハンパなく多くなってきますね。
プログラマが複数名いて、とにかく自由奔放にNSLocalizedString()マクロを書きまくっていると収集がつかなくなります。
ソースコード上ではNSLocalizedStringしてるんだけど、ローカライズのファイルにその文言がなかったりとか
微妙に文言が違うとかありがち。


そんなんで時間をかけているのも馬鹿馬鹿しいけれど、表示の文言も大切な仕様です。
表記違いもプログラムの深刻なバグも同じと考える人もいるかもしれません。


そこでこのうざい問題を秒殺する方法を考えましたw


まず、すべての文言をリスト化します。
僕はこの作業でExcelを使います。Mac使いだからってWindowを使っちゃいけないって法律はないし。
管理しやすいし、文字列変換のコードがくそ簡単に書ける。



まず、ソースコード上のNSLocalizedStringをテキストに吐き出します。
ターミナルを開いて、プロジェクトが置いてあるフォルダのClassへ移動。基本的なコマンドがわからん!って人は簡単なので勉強してください。

下のコマンドを実行

grep -i "NSLocalizedString" $(find . -name '*.m') | less >> result.txt

これやると、どのクラスファイルで何をローカライズしようとしてるかがテキストファイルになります。

続いてウインドウズへ。
VBEを開いて下のコードをコピペ。

sub getLocalize()
Const cnsTITLE = "テキストファイル読み込み処理"
Const cnsFILTER = "全てのファイル (*.*),*.*"
Dim xlAPP As Application ' Applicationオブジェクト
Dim intFF As Integer ' FreeFile値
Dim strFILENAME As String ' OPENするファイル名(フルパス)
Dim strREC As String ' 読み込んだレコード内容
Dim GYO As Long ' 収容するセルの行
Dim lngREC As Long ' レコード件数カウンタ
Dim allString As String
Dim allArray As Variant
Dim strbuf As String
Dim lineArray As Variant
Dim splitArray As Variant
Dim lineCount As Integer
Dim z As Integer
Dim y As Integer
Dim row As Integer

Rows("2:65536").ClearContents
' Applicationオブジェクト取得
Set xlAPP = Application

strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
Title:=cnsTITLE)

If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub


intFF = FreeFile

Open strFILENAME For Input As #intFF
GYO = 1

Do Until EOF(intFF)
' レコード件数カウンタの加算
lngREC = lngREC + 1

' 改行までをレコードとして読み込む
Line Input #intFF, strREC
' 行を加算しA列にレコード内容を表示(先頭は2行目)
GYO = GYO + 1
allString = allString & strREC
Loop
' 指定ファイルをCLOSE
Close #intFF

allArray = Split(strREC, vbLf)

row = 2
For i = 2 To UBound(allArray)


lineArray = Split(allArray(i), "NSLocalizedString")

If UBound(lineArray) > 0 Then
Cells(row, 1).Value = lineArray(0)
End If

For lineCount = 1 To UBound(lineArray)
lineArray(lineCount) = "NSLocalizedString" & lineArray(lineCount)
z = InStr(1, lineArray(lineCount), "@")
y = InStr(1, lineArray(lineCount), "nil") - 3
strbuf = Left(lineArray(lineCount), y)
Cells(row, 2).Value = Replace(Replace(Replace(Replace(strbuf, "NSLocalizedString", ""), "(", ""), "@", ""), Chr(34), "")
row = row + 1
Next lineCount



Next i


end sub



こいつを実行するときれいに形を整えてエクセルに取り込んでくれます。これを元にエクセルで翻訳リストを作成。
吐き出しようには下のモジュールを使う。
普通のテキスト吐き出し(フリーファイルとかFileSystemObject)とかだとUnicodeを扱えないのでADOStreamを使う。

参照設定でADOにチェック。
こいつを実行すると、実行したエクセルファイルと同じ場所にLocalized.Stringを吐き出すってわけ。
このファイルをそのまま使うんじゃなくて、ここからコピペをする予定なのでBOMとかはとってないです。

Sub getLocal()

Dim i As Integer
Dim endline As Integer
Dim str As String
Dim path As String
Dim endC As Integer
Dim strUni As String
'オブジェクトを作成
Dim txt2 As Object


Dim xlAPP As Application

Dim fileName As String ' OPENするファイル名(フルパス)
Dim strREC As String ' 書き出すレコード内容


Dim str_buf As String

path = Application.ThisWorkbook.path
endline = Cells(65536, 1).End(xlUp).row
endC = Cells(1, 200).End(xlToLeft).Column



For C = 2 To endC
Set txt2 = CreateObject("ADODB.Stream")

'オブジェクトに保存するデータの種類を文字列型に指定する
'txt2.Type = adTypeText
txt2.Type = 2
'文字列型のオブジェクトの文字コードを指定する
txt2.Charset = "UTF-16"

'オブジェクトのインスタンスを作成
txt2.Open

'//翻訳を作る処理

strREC = ""
strUni = ""
fileName = path & "\" & Cells(1, C).Value & ".txt"

For i = 2 To endline



If Cells(i, 1).Value <> "" And Left(Cells(i, 1).Value, 1) <> "#" Then
str = Chr(34) & Cells(i, 1).Value & Chr(34) & "=" & Chr(34) & Cells(i, C).Value & Chr(34) & ";"

Else
str = "//" & Cells(i, 1).Value
End If
str = Replace(str, "\" & Chr(13), "\n")
str = Replace(str, Chr(10), "")








'1行ずつ書き込む
txt2.WriteText str, adWriteLine




Next i

'オブジェクトの内容をファイルに保存
txt2.SaveToFile (fileName), adSaveCreateOverWrite


'オブジェクトを閉じる
txt2.Close

'メモリからオブジェクトを削除する
Set txt2 = Nothing


Next C

MsgBox "ファイル出力が完了しました。"
End Sub



このファイルを上手に使えば、翻訳リストとソースコードと実際のLocalizedStringファイルをマッチングして、ローカライズ漏れを一網打尽にすることができます。

2011年5月27日金曜日

Core Graphicsで図形を描く

まーるさんかくしかーくー♪
ってことで、今回は図形を描写します。

まずこれ。簡単な四角形から。





-(void)drawInContext:(CGContextRef)context
{
CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);

CGContextStrokeRect(context, CGRectMake(20.0, 20.0, 100.0, 200.0));

}
CGContextStrokeRect(context, CGRect);で枠だけの四角を描く。

次にこれ
-(void)drawInContext:(CGContextRef)context
{
CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);

CGRect rect = CGRectMake(20.0, 20.0, 200.0, 300.0);
CGContextStrokeRectWithWidth(context, rect,10.0);

}

CGContextStrokeRectWithWidth(context, rect,線の太さ);で線の太さを変更できる四角を描く

次にこれ

-(void)drawInContext:(CGContextRef)context
{
CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);

CGRect rect = CGRectMake(20.0, 20.0, 200.0, 300.0);
CGContextFillRect(context, rect);

}

はい、真っ黒〜
CGContextSetRGBStrokeColorは線の色なので、下の塗りつぶし色の設定を追加します。
CGContextSetRGBFillColor(context, 1.0, 0, 0, 1.0);



再び実行。
まさにRectを塗りつぶした形になります。




次に丸を描いてみます。

CGContextAddEllipseInRect(context,rect);//線の円
CGContextFillEllipseInRect(context,rect);//塗りつぶされた円
CGContextAddEllipseInRect(context,rect);//パスを追加

これも分かりやすいですね。


三角形はどうしょうでしょうか。
特にそれ用の関数は無いので、線を引いてその中を埋めていきます。


CGContextMoveToPoint(context,160.0,10.0);
CGContextAddLineToPoint(context,10.0,200.0);
CGContextAddLineToPoint(context,310.0,200.0);
CGContextFillPath(context);//塗りつぶす


この書き方だと、複数図形があってそれぞれ異なる色で塗りつぶしたり、はたまた線だけの図形を描くときにどうするんだろう?
で、一回一回完結させてみた。

-(void)drawInContext:(CGContextRef)context
{

CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);
CGContextSetRGBFillColor(context, 0, 1.0, 0, 1.0);

CGContextMoveToPoint(context,160.0,10.0);
CGContextAddLineToPoint(context,10.0,200.0);
CGContextAddLineToPoint(context,310.0,200.0);


CGContextFillPath(context);

CGContextStrokeEllipseInRect(context, CGRectMake(10, 200, 100, 100));

CGRect rect = CGRectMake(10,210 , 100, 100);
CGContextAddEllipseInRect(context,rect);
CGContextStrokePath(context);

CGContextSetRGBFillColor(context, 1.0, 1.0, 0, 1.0);
CGContextFillEllipseInRect(context,CGRectMake(200,200,100,200));

}



とりあえず図形についてはこれでおしまい。

Core Graphicsを学ぶ

何となく CoreGraphics 辺りを書きたい気分に。
これを使って何かをしようと思ったことが無いので、個人的にも勉強しながら書いていくというスタンスです。


Core Graphicsは、UIImageとかよりもちょっとだけ低レベルなグラフィックフレームワークだとか。
Cocoa Touchよりもハードウェアよりに位置するので、実行速度も多分速くなるし自由度も増す。
Core何とかと名前がついているAPIは大抵C言語で提供されているんだけれど、Core Graphicsもそうらしい。
ってことは、呼び出しが若干煩雑になるってこと。


とりあえず、プロジェクトに CoreGraphics.frameworkを追加してみる。


1、グラフィックスコンテキスト
書籍なんかでは描画する対象を表すものだとか何とか書かれている。まあ、良くわからんが Core Graphicsを使った描画では、最初にグラフィックスコンテキストを取得しないといけないってことだけは確かだ。

 CGContextRef UIGraphicsGetCurrentContext();
 

とりあえず実践。
すべての描画はdrawRect: メソッドの中に記述するか、この中から呼ぶメソッドに記述しないと動かないらしいので、Viewを一丁つくってdrawRectにメソッドを書いておく。

これ、コメントを削除したアップルさんのサンプルと一緒w
引数でグラフィックコンテキストも作って渡しちゃう。

-(void)drawRect:(CGRect)rect
{
[self drawInContext:UIGraphicsGetCurrentContext()];
}


呼び出されるメソッドの中身はこれ。
なにやってるかはコメントに記載しました。
-(void)drawInContext:(CGContextRef)context
{
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);//線の色。引数はcontext, R,G,B,アルファ。

CGContextMoveToPoint(context, 20.0, 50.0);//線の始点
CGContextAddLineToPoint(context, 300.0, 50.0);//線の終点から線を生成
CGContextStrokePath(context);//線を引く
}


はい、びしっと線が引けたかと。

じゃあ、これを使って折れ線グラフ的な線も引けるんじゃないかと言うのが人情ですね。
上のやり方でちまちまやってもいいのですが、まとめてやる方法があります。

-(void)drawInContext:(CGContextRef)context
{
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
CGPoint lines[] =
{
CGPointMake(10.0, 90.0),
CGPointMake(70.0, 60.0),
CGPointMake(130.0, 100.0),
CGPointMake(190.0, 70.0),
CGPointMake(250.0, 90.0),
CGPointMake(310.0, 50.0)
};

CGContextAddLines(context, lines, 6);
CGContextStrokePath(context);

}


これで、真っ赤なガタガタ線が引けたかと思います。



最初にCの配列 lines を生成してCGPointをぶっこみにいってます。
CGContextAddLines関数。末尾に”s”が付いてるので複数形ですね。第一引数はcontext、次に接点を保つ配列が第二引数。最後の引数は接点の数です。 
 この最後の引数の「6」ですが、実際のプログラムでは動的に入れたいというケースがほとんどなので、ここを
 sizeof (lines)/ sizeof( lines[0]) とするとスマートです。
sizeof はメモリのサイズを返すので、配列全体のサイズを最初の一個目のサイズで割ると、CGPointひとつひとつで確保しているメモリのサイズは同じなので、配列の数 = 接点の数が算出できるというわけです。obj-Cみたいに[ Array count ] とかできないところがもどかしいですね。


<その他>

太さの設定
CGContextSetLineWidth(context, x);
x は?pxということ。

たばこと丸と四角

・線の端っこの形の設定。
CGContextSetLineCap関数で設定。まさに名前の通りw
 ラインキャップを設定するんですね。キャップは両端にかぶせます。
 
 kCGLineCapButt = 両切りタバコ状態
 kCGLineCapRound = 丸いキャップをするんですね。
 kCGLineCapSquare = 四角いキャップ。
 
 
 CGContextSetLineCap = kCGLineCapRound;
 
 Buttという単語はアメリカ英語だとタバコって意味もあるらしくて、灰皿を Butt tray とかとも言うらしい。でも、アメリカ人以外には通じないらしいw
 
 
 
ジョイントの方法

CGContextSetLineJoin = kCGLineJoinMiter;

miter joint(マイタージョイント)っていうのは、斜めに切った角材を張り合わせた感じの事をいうらしい。
ふむふむ。

kCGLineJoinMiter マイターに
kCGLineJoinRound 丸くつなぐ
kCGLineJoinBevel 角をばつんと落とす。

2011年5月26日木曜日

よく使う文字列操作その2

良く使う文字列操作を書き終わった後に色々思いついちゃったので、続編を書きたいと思います。
そういえば文字列の長さを取得するメソッドとかも書いてなかったし。。。
まあ、だいたいどの言語でもlengthなんでobj-cのルールに乗っ取って書けば [str length]; になりますね。
ちなみに、前回で解説してきたNSMutableStringクラスはNSStringクラスのサブクラスになるので、NSStringクラスで使えるメソッドは使えます。


文字列の比較。
これは [str isEqualToString:str2]; です。
例えば、
NSString *str = [NSString stringWithString:@"山田”];
if ( [str isEqualToString:@"田中"]) {
NSLog(@"%@!この野郎!",str);
}

って感じで、strが田中だった場合は、何だかぶっそうな展開になります。
上の例では isEqualToString:メソッドの戻り値はNO(Boolean)で返ってくるので、特に修羅場にはなりません。


パスからディレクトリ名などを切り出す。

まず、バンドルのリソースファイルを取得します。

NSString *path;
path = [bundle pathForResource:@"background" ofType:"@png"];

NSLog(@"%@",path);

これの実行結果が" /user/document/background.png" だとします。

//ファイルの拡張子を取得
NSString *extension;
extension = [path pathExtension];

NSLog(@"%@",extension);
//実行結果:png

//ファイル名を取得
//例ではファイル名入れてpathForResourceしてるんですが、まあ練習ということで (^^;)

NSString *fileName;
fileNamee = [path lastPathComponent];
NSLog(@"%@",fileName);
//実行結果: background


//ファイルが存在するディレクトリを取得
NSString *directory;
directory = [path stringByDeletingLastPathComponent];
NSLog(@"%@",directory);

//実行結果: /user/document


そうそう、忘れていました!型変換でもつまずく型は結構いるんじゃないでしょうか。

他の言語なら、異なる型で宣言した変数に入りさえすれば。。。ふふふ、なんて事にもなりますが、obj-cではそうはいきません。
無理矢理キャストというのも無いみたいです。
NSString *str = [NSString stringWithString:@"123"];
NSInteger int = 35 + (NSInteger) str;
なんてやったら確実に怒られますw

[str intValue];
でinteger に型変換できます。ダブルの場合は
[str double];
です。


Obj-Cのメソッドの名前って覚えずらいですよね。
何かを見ながらコード書くより声に出してみた方が案外覚えられることに最近気づきました。僕だけかもしれませんが。

2011年5月25日水曜日

良く使う文字列変換をまとめてみる

Objective-Cに慣れちゃったという人は読み飛ばしてください。
今回はかなりの初級編。

Excelの関数から始まり、VBAでプログラムデビューした自分にとってObj-Cの文字列変換ってどうにも親しみづらいイメージがありました。
ネットや本であれこれ調べて、最近はようやく慣れましたが。
そこで、良く使うパターンをまとめちゃいます☆


NSStringってクラスはご存知ですか?
Obj-cの文字を扱うクラスです。一度設定したら変更できないですね。

例えば。。。
NSString *str = @"str";
str = @"str2";

とかは怒られてしまいます。
なので、変更可能なクラスである NSMutableStringを個人的には多用します。
まあ、変更する必要がなければNSStringの方がプログラムの効率が良いのですがね。


文字列変換でやりたい事って、大体決まってますよね。
文字列連結に文字列置換に文字列取り出しってところでしょうか。おまけで型変換。特にC言語のStringにしたいってケースは良くあるかも。

生成を含めてズバリしたの5つ

文字列生成 > [NSMutableString stringWithFormat:str];
文字列連結 > [NSMutableString appendString:str];
文字列置換 > [NSMutableString stringByReplacingOccurrencesOfString:str1 withString:str2]
文字列取り出し > [str substringWithRange:NSMakeRange(0,1)];
UTF8に変換 > [str UTF8String];



まずは良く使う形。
NSMutableString *str1 = [NSMutableString stringWithFormat:@"SELECT * FROM TABLE WHERE id = %d",100];

stringWithFormatメソッド。これは文字列が格納された変数を生成するときによく使います。
最初の@””に囲まれた文字列が格納したい本体。%dには数字(Integerなど)を表す変数みたいなもの。
C が書ける人にはおなじみですね。
で、カンマで区切ってその「%d」の中に入れる数字が続きます。この「100」の部分は変数でもいいです。
VBのformat関数みたいなものですね。


少し発展させるとこんな感じになります。

NSString *str = [NSString stringWithFormat:@"%02d:%02d",Number/60,Number % 60];

変数Numberには数字が入っています。まあ、秒数だとしましょう。
上のコードは秒数から「00:00」に表記を変えるコードです。
%02dは二桁の数字という意味です。 1 = 01 ,11 = 11 ってな感じです。
%02dがコロンを挟んで二つならんでいると思います。そしてカンマで区切られた式が二つ。
分かりやすく構造だけ書くと下のようになります。

[NSString stringWithFormat:@"%d%d", (一つ目の%dに対応) , (二つ目の%dに対応) ];

要するに%何とかの個数が増えれば、それに対応させてカンマで区切られた値なり式が増えるんですね。
実際にSQLなんかを合成させてみるとこんな感じになります。
%dの代わりに使われている%@には文字列を格納しています。
一行目のコードで生成した文字列に appendString:メソッドで文字列を連結しています。
連結する文字列は stringWithFormat: で別途生成したも文字列になります。
末尾の NSLog関数で生成したSQLの内容をコンソールに表示させています。
NSLogの使い方は、ほぼStringWithFormatと同じ書式です。

NSMutableString *str1 = [NSMutableString stringWithFormat:@"%@",@"INSERT INTO Data1 VALUES"];
[str1 appendString:[NSMutableString stringWithFormat:@" (%d,'%@',%d,%d,%d,'%@','%@','%@');"
,[Array count]
,[Name_ stringByReplacingOccurrencesOfString:@"'" withString:@"''"]
,Number_
,info_
,SoundType_
,[soundName_ stringByReplacingOccurrencesOfString:@"'" withString:@"''"]
,infoSoundName_
,itemCode_
]];
NSLog(@"%@",str1);

文字列連結は
[NSMutableString appendString:@"文字列”]; です。
このメソッドを使うと、末尾に任意の文字列を連結できます。
 
NSMutableString *str = [NSMutableString stringWithFormat:@"今日は%d月%d日です。”,12,25];
[str appendString:@"なんだクリスマスじゃないか!”];
[str appendString:[NSMutableString stringWithFormat:@" じゃあ%d円くらいなら、おごってあげるよ。"]];

と、連結しまくりです。
上のコードでは文字列置換もやっています。痴漢じゃないですよ。置換。
この部分。
[Name_ stringByReplacingOccurrencesOfString:@"'" withString:@"''"]

Nameに含まれるシングルクォートをエスケープして['']シングルクォート二つに変更しています。
今時はみなさんCoreDataを使っているでしょうが、もしSqliteを使っているならば
生成したSQLに文字列が含まれるようなものを扱っているならば、シングルクオートをエスケープしとかないと
ユーザーがシングルクォーテーション付きの文字列を入れて登録〜っとやった瞬間にエラーぶっこきますよw

と、余談はさておき、

文字列置換は
[NSMutableString stringByReplacingOccurrencesOfString:str1 withString:str2]
となっていて、str1とstr2を入れ替えるんですね。

NSMutableString *hatugen = @"今回のプロジェクトは田中君にまかせることになった。がんばりたまえ”;

もし、田中が気に入らなくて鈴木さんに変更したいのならばこうだ。
[hatugen stringByReplacingOccurrencesOfString:@"田中” withStirng:@"鈴木"];


最後に文字列取り出し。
obj-cはVBとかエクセルの関数みたいにLeftとかMidとかじゃないんだけど、
にたようなものがあるのでそれを使う。

NSString *str = [NSString stringWithFormat:@"%02d:%02d",Second/60,Second % 60];
n1.text = [str substringWithRange:NSMakeRange(0,1)];//一文字目
n2.text = [str substringWithRange:NSMakeRange(1, 1)];//二文字目
n3.text = [str substringWithRange:NSMakeRange(3, 1)];//三文字目
n4.text=[str substringWithRange:NSMakeRange(4, 1)];//四文字目

NSMakeRange( 開始位置, 文字数) なので [str substringWithRange:メソッドを使えば、
エクセルの関数のMid(ミドル)的に取り出せる。


後は、変換した文字列の使い道としては、UILabelか UIButton かといったところでしょうか。
UILabel は Label.text = @"ラベルだどぉ";
UIButtonは [button setTitle:@"ボタンタイトルです。" forState:UIControlStateNormal];
って感じです。


今回は「良く使う文字列変換」についてでした~


2011年4月29日金曜日

アプリをローカライズする手順メモ

Localizable.strings を用意する.




  • ファイル>新規ファイル>Resource>Strings Filesと選択












  • Localizable.string をResourcesフォルダに入れる




  • Localizable.string を右クリックし[情報を見る] を選択





    [一般] タブの下部にある[ファイルをローカライズ可能にする] ボタンを押下





  • [一般] タブに、"ローカリゼーション"欄ができる
    [ローカリゼーションを追加] ボタンを押下。一覧に出てこない国名はISO-639の省略形をつければ良い。韓国なら「kor」かな?







  • ファイルを開いてローカリゼーションの追加をおこなっていく
    例:"Hellow"="こんにちは";








アプリ名のローカライズ



  • Localizable.stringを作った時と同じような手順で、"InfoPlist.string"というファイルを作成する.
  • InfoPlist.string は、アプリの設定ファイルである Info.plist の項目を、ローカライズ毎に上書きするために用いるファイルとなる.
  • 特に、Info.plist の内容をローカライズする必要が無いときには、 InfoPlist.string を作成する必要は無い.


CFBundleDisplayName = "Hellow Timer"; CFBundleDisplayName = "Hellow Timer";

プログラム側をLocalizedStringに対応させる



正式に書くなら下のような感じ。 NSString *localizedString = [[NSBundle mainBundle] localizedStringForKey:@"Hoge" value:@"Hoge" table:nil]; ただし、マクロが用意されているので下記で書くのがふつう NSString *localizedString = NSLocalizedString(@"String", @"message"); messageは特に表示されるわけでは無いので@""と空にしても良い。

Xibのローカライズ




これの右クリック>情報をみる から設定が可能。
でも、かりにIBで画面を作っていたとしてもViewDidLoadのところでラベルやボタンのタイトルにlocalizedStringでテキストを再設定するように書いておいた方が明らかに便利。

国によって表示する画像や色を変えたりという場合に使うのかな。
でも、どの国でどういうデザインがうけるのかリサーチが必要だな。。。


その他、Sqliteのファイルもローカライズする設定がでてくるんだけれど、国別にファイルを分けられるって事?
うーん、必要にかられたら今度実験してみよう。
でも、必要なカラムを持っておいてコードで分岐させる方が楽かな。

NSArray *languages = [NSLocale preferredLanguages];
//NSLog(@"preferredLanguages : %@", languages);

language = [languages objectAtIndex:0];

こんな感じで NSStringで持って来ちゃえばいいんだもんなぁ。

2011年4月22日金曜日

とりあえずプロジェクトを作ってみる

順序がおかしいかもしれませんが、ようやくXcodeを使ってプロジェクトを作ってみるところを解説したいと思います。

  • Xcodeを起動


  • 新規プロジェクトを選択


  • Window-Basedにてプロジェクトを作成



  • プロジェクト名はとりあえず「Hellow-World」としますか。
  • とりあえずビルドしてみる。


ビルドしてみて真っ白な画面が出れば成功です。 シュミレーター(実機でもよい)にもインストールされて真っ白なアイコンが表示されていますね。

それではプロジェクトの中身を色々と見て行きます。


グループとファイル>Hellow-Worldの左横の▶をクリックするとツリー状に整列されたフォルダーが出てきますね。 これがHellow-Worldというアプリの中身になります。
  • Classes
    Hellow-WorldAppDelegate.hとHellow_WorldAppDelegate.mがあります。Objective-Cのクラスファイルは.hと.mのファイルが2つで一組になります。プロジェクト名+AppDelegateという名前のファイルがこのアプリの全ての動作を全てまかされた代表のファイルのなります。ちなみにDelegateとは代理という意味です。
  • Other Sources
    1. アプリ名_Prefix.pch
      コンパイル開始時に実行する事を書くファイル。今は変更しない。
    2. main.m
      このファイルが一番最初に実行される。が、いじる事はない。
  • Resources
    • MainWindow.xib
      アプリケーションの内容を描画する為のウインドウ。
    • アプリ名-info.plist
      プロパティリスト。XML形式でアプリのさまざまなプロパティ情報を保持する。アプリをリリースするまでには必ずいじる。
  • Frameworks
    • UIKit.framework
      アプリケーション・ユーザインターフェイスの構築と管理に必要なクラスの集合体
    • Foundation.framework
      Cocoaフレームワークの基礎的な部分を担当するAPIの集合体です。
    • CoreGraphics.framework
      グラフィックのAPI。
  • Products
用語解説
  • API
    要するにプログラムの固まり。これにより、機械語レベルのプログラミングを人間が書かないですむ。
  • フレームワーク
    APIを寄せ集めたものだと個人的には理解。


次回はiOSの概要について解説します。

2011年4月21日木曜日

ダウンロードしたサンプルプログラムをビルドする。

僕がDeveloper登録して一番最初に行ったことは、ネットなどで見つけたサンプルコードを実行してみた事です。
実際に形ある物で動かしてみることはとても大事です。

でも大抵のサンプルは過去に作られたものなので、Xcodeで起動してみると「BaseSDK missing」となってビルドできないですよね。

前回までの記事で解説した実機でのビルドをしっかりとマスターされた方なら「余裕っすよ」なんて言ってくれるかもしれませんが。。。

僕もここで少しつまずいたので、さっそく解説しちゃいます(^^)

  • まず、適当なサンプルをダウンロードしてきます。
    アップルのでも、書籍のサンプルでも何でも良いです。
  • ほとんどの場合、zip形式になっているので解凍します。
  • プロジェクトファイルをダブルクリックしてXcodeで起動します。


  • はい、思った通りBase SDK Missingです。


  • メニュー>プロジェクト>プロジェクトの設定を編集を開く


  • ベースSDKがiOS 3.1.2になってますね。これはSDKが3.1.2の時に作られたものだということが推測されます。


  • これを最新のSDKに書き換えます。この記事を書いてる現在はiOS4.3なのでそれにします。
  • もうひとつ、Code signing > コード署名>Any iOS をTeam Provisionning Profileに設定します。
  • 通常はここで Base SDK Missing からDebug〜に変わる。変わらなければOptionを押しながらBase SDK Missingとなっているボタンをクリックするとビルド先が設定できるようになる。(ここ大事)


  • iPhoneを接続してビルド。
  • 見事に立ち上がる
※まれに作者のidが残ったままになり、code sign errorが出る場合があるが、その場合は僕は諦めちゃいます。キーチェーンの設定を見直したり色々とやり方がありますが、サンプルはビルドできずにさらに自分の作ったプロジェクトまでビルドできなくなりましたなんてこともあったのでw

その場合は、自分で新規プロジェクトを作ってコードをコピーしてFrameworkなども取り込み直して作り直します。

アプリを実機でビルドする 実践編

アプリの作り方については、まだ一切解説していないが
自分で作ったプロジェクトを実機でビルドする方法について解説します。

X-codeを起動

p-listの編集 

  • プロジェクトの左側のグループとファイル>Resourceから、プロジェクト名-Info.plistを開きます。
  • Bundle identifierに、App IDとして登録した内容を入力します。

プロジェクト情報の編集

  • メニュー>プロジェクト>プロジェクト情報を編集>「ビルド」タブ
  • ビルド構成をDebugへ変更



  • Code Signing>コード署名ID>Any iPhone OS Deviceを作成したProvisioningにする
  • アーキテクチャ>ベースSDKを最新のSDKに設定
  • Deployment>Target Device Familyを設定
  • Deployment>iPhone OS Deployment Target>ベースSDKよりも古いバージョンを設定。※注意が必要。後日に別途解説します。
Deployment Targetは、複数のバージョンで動作するアプリをビルドするときに設定します。 しかし、最新のSDKに存在していて古いバージョンのSDKには存在しないFrameworkなどを使用していたりすると、古いバージョンのiOSで動かした際にアプリが落ちるなどの不具合が発生する可能性があるのでプログラムの中で対応が必要だったりもするので結構大変です。 今回はとりあえず最新のSDKにしておいてください(^^; ビルドエラーで failed to upload xxx.appと出たらXcodeを再起動してください。×で閉じるだけじゃなくてcommand + Qできっちりと終了させる。

2011年4月18日月曜日

アプリを実機でビルドする。 準備編

アプリの作り方の解説の前に、作ったアプリを実機で動かす為の手順を解説しちゃいます。

なんでかって言うと、色々なサイトや書籍とかに付いているサンプルコードを実機で動かしてみたいってのが人情じゃないですか。


※iOS Developer Program に登録されていることが前提です。



アプリの作り方の解説の前に、作ったアプリを実機で動かす為の手順を解説しちゃいます。

なんでかって言うと、色々なサイトや書籍とかに付いているサンプルコードを実機で動かしてみたいってのが人情じゃないですか。



PCでの準備

  • アプリケーション>ユーティリティ>キーチェーンアクセスを起動。
  • [設定確認]より、OCSPとCRLが「切」になっている事を確認。


  • キーチェーンアクセス>証明書アシスタント>認証局に証明書を要求を選択して、証明書を作成します。
  • ユーザのメールアドレス:iOS Developer Program に登録した際のメールアドレス コモンネーム:iOS Developer Program に登録した際のFirstname とLastnameを記入する。
    要求の処理:[ディスクに保存]を選択して、「鍵ペア情報を指定」をチェックします。


iOS Provisining Portal

    iOS Dev Centerの「log in」ボタンを押すとIDとパスワードを入力するフォームが出てくるので、入力してログインします。
  • ログイン後、iOS Developer Programのメニューに表示された iOS Provisioning Portal へ入る。


  • 左側にあるメニューより、「Certificates」>「Development」タブ。

  • 「Request Certificate」をクリックして,次の画面で証明書要求のファイル(キーチェーンで作成した作成したCSRファイル)を選択し、「Submit」をクリック
  • タブを一旦、「Distribution」タブにします。それから、「Development」タブに戻します。
  • Request Certificate の箇所に「Approve」ボタンが表示されますので、クリックします。
  • タブを一旦、[Distribution]タブにします。それから、[Development]タブに戻します。
  • Approve の箇所に「Downloade」ボタンが表示されますので、クリックすると、証明書をダウンロードします。
    リストの下にある「WWDR intermediate certificate」もダウンロード
  • ダウンロードして、ファイルをダブルクリックすると、キーチェーンアクセスの証明書に追加されます。
  • If you do not have the WWDR intermediate certificate installed click here to download now. のアンカーをクリックして「AppleWWDRCA.cer」をダウンロード。
  • ダウンロードして、ファイルをダブルクリックすると、キーチェーンアクセスの証明書に追加されます。
  • キーチェーンアクセスに、以下の証明書が追加されていれば成功。
    • ■iOS Development: Firstname Lastname
    • ■Apple Worldwide Developer Relations Certification Authority

Deviceの登録

  • iPhoneをMac に接続し、Xcode を起動。
  • メニュー>ウィンドウ>オーガナイザ
  • iPhone の「Identifier」(Device ID)をコピーします。後で貼付ける為。
  • iOS Provisioning Portalにログインします。
  • 左側にメニューDevicesをクリックします。
  • Manageタブを選択する。
  • Add Devices からDevice Name とさっきコピーしたDeviceIDをコピペで入力

Provisioning Profileを作成する

  • 左側メニュー>App IDs
  • ユニークなアプリのIDを作成する為の手続き
    • 以下の項目を記入して[submit]ボタンをクリックする。
    • Description: xxxx (後で何のアプリか分かればよい)
    • Bundle Seed ID:Generate New
    • Bundle Identifier:com.xxx.appriname(com.domainname.appnameの形が推奨されている)
  • メニュー>Provisioning>Developmentタブ
  • [New Profile]ボタンをクリックして、以下の項目を記入して[submit]ボタンをクリックする。
    • Profile Name:xxxx(後で、何アプリの開発用だとわかるように記入する)
    • Certificates:チェックを入れる
    • AppID: さきほどAppIDsで作成したIDを入力
    • Devices:実行したいデバイスにチェックを入れる。
  • メニュー>Provisioning>Developmentタブ
  • 先ほど作成したProvisioning ProfileのDownloadボタンをクリックしてダウンロード。(作成後しばらく待つ必要有り)
  • ダウンロード後、ファイルをダブルクリックするとXcodeに取り込まれる。
以下にあるようにcertificateは自分おPCが正規な開発者のものかどうかを認証する為のものなので、一台のPCで開発している人は一回だけしかやらない作業です。 Provisioningの作成とインストールは頻繁にやる作業なのでしっかりと理解しておいた方が良いとおおいます。BundleIdentifer に*をつけたIDを作るなどの方法もありますが、個人的には一度もメリットを感じたことが無いのであえて解説はしません。

その他メモ

    証明書(Certificate)について
  • 正規のiPhone開発者であるという証明書(Certificate)をPCに登録する必要がある。
  • iPhone Developper Program では公開鍵、秘密鍵方式で認証している(RSA)
  • 証明書は開発するマシンにインストールされる、キーチェーンアクセスでインストールされた証明書を確認できる

2011年4月13日水曜日

Developer Programに参加する

iOS Developer Programへの登録







1.Are you new or a registered Apple developer?




画面右側は既にDeveloper登録済みの方のメニューなので左側の二つから選択。

I need to create a new account for an Apple Developer Program.
<訳>Apple Developer用に新しいアカウントを作成します。

I currently have an Apple ID I would like to use for my enrollment in an Apple Developer Program.
<訳>既存の Apple IDを持っていて、それをApple Developer Program の参加に使用します。


2.Are you Enrolling as an Individual or Company?




個人ならIndividual、企業ならCompanyを選択します。
個人を選択した場合、AppStoreの販売業者欄にはApple IDで指定した個人の名前が入るようになります。

3.Sign in with your Apple ID



登録してある Apple IDを入力してログイン

4.Enter your billing information for identity verification


支払いの為の情報を入力する。
名前、国、住所、郵便番号、電話番号を入力。
電話番号は「Country Code, Area/City Code, Number, Extension」と指定されているので、先頭の箱に81、続きは普通に入力。国際電話の番号扱いだから頭のゼロをとったほうがいいとも思ったが、とりあえず普通に入力。

5.Select Your Program


6.Review your enrollment information & submit.


7.Program License Agreement

 同意して次へ

8.Proceed to your country's Apple Online Store to purchase


 Add to cartをクリック。AppleStoreの普通の商品という扱い。

9.Apple Storeのサイト

App Storeで購入処理。
なぜか配送業者にヤマト運輸とか書いてありますが、実際に書類が送られてきたりといったことはありません。
一連の手続きを全て英語で入力しないと、その後のアクティベーションでつまずいてしまうとありますが、ここで日本のAppleStoreを選択する限りやっぱりはまってしまうそうです。
なので始めからアップルのサポートに連絡をいれるつもりでいましょう(笑)

 

10.Apple Developer Program Activation Code




全て登録した後にしばらくするとアクティベーションメールが届きます。
メールの内容の通りにActivation Codeをクリックするとアクティベーションが開始されます。
しかし、前述の通りエラーになりますw
ここをそのまま抜けられた場合はラッキーです。

エラーは下記な感じ
We are unable to activate your iPhone Developer Program membership because we are unable to successfully verify your identity. Please contact us and reference Enrollment ID# XXXXXXXXXX for further assistance.

アクティベーションができない旨を報告。こちらからアクションを起こさない限りApple側からは連絡はないので注意。
http://developer.apple.com/contact/

まず速攻で"Acknowledgement of your email/submission"というタイトルでメールが返ってくるが、これは受信しましたよというもの。
早ければ数時間。遅くとも2、3日でメールの返信がある。



11.ふたたびアクティベーション

ここでうまくいけば晴れてiOS Developerの仲間入りだ。
ふう。

開発環境を作る

iphoneSDKの入手とインストール

正確にはiPadが発売されたときにiPhoneOSからiOSになったのでiOS SDK.
そんな細かい事はいいかw

iOS SDKは"iPhone Dev Center"から無料でダウンロードできる。
SDKには開発環境、ドキュメント、サンプルなど開発に必要な物が含まれる。

まずDev Center に登録。Webフォームに必要事項を記入。
その後、iPhone Dev Center へログイン。



iPhoneSDKをダウンロード。
Member Center > Dev Center > iOS > Downloads

XCodeというソフトがプログラムのエディタやコンパイラなどを含む統合開発環境で無料でダウンロードができたのだが、最新版のXcode 4 は現時点では 99 ドル / 年の Mac Developer Program もしくは iOS Developer Program 加入者のみに無償で提供されており、それ以外のユーザーは Mac App Store で 4.99 ドルで購入する必要があるらしい。

とりあえずはXCode3をダウンロードしよう。
最新版の"Xcode 3.2.6 and iOS SDK 4.3 (Disk Image)"は4.1Gあるのでダウンロードは気長に。


ディスクイメージファイル(拡張子は.dmg)で配布されているので、ダウンロード後にダブルクリックすると中に「iPhone SDK.mpkg」というファイルがあるのでダブルクリックするとインストールが始まる。





インストールも結構時間がかかるので気長に。
僕もこれを書きながらiOS4.2から4.3にバージョンアップすべく、インストールしてるんだけれどあと25分かかるらしい。ひと休みして食事でもしよう。


一年間での金額が設定されているので、シュミレーターでじっくりと作ったアプリをテストしてからiOS Developer Programに登録するというのも人つの手かもしれない。
でも、とりあえず登録してお金を払ったほうがモチベーションが継続するとも思ってみたり。

次回はDeveloper Programに参加する