頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Xcode 4.4でさよなら@synthesize

Xcode 4.4だと@synthesizeがいらなくなったってお話だよ。

Xcode 4.4にして試してみたかったのがプロパティを設定する時に必要な@synthesizeが不要になるって例のあれだよ。WWDCでも言ってたよね。
てっきりiOS 6でのお話かと思っていたのでこんなに早く使えるようになるとは驚いたよ。

さっそく試してみたんだけどさ、俺は古風な男なのでARCなんて生ぬるいシロモノは使わないのでそこのところ注意してね(ホントは勉強する気がないだけなんだ)。

まず従来の書き方だとこんな感じでやってたと思うんだ。
例えばPersonクラスのヘッダーファイル側に
@property(nonatomic, assign) NSInteger age;
@property(nonatomic, retain) NSString *name;
ってプロパティを設定するよね。

インスタンスの宣言はヘッダー側でも実装側でもいいみたいだけど、最近は実装側ファイルに書くようにしてるんだ。だってそっちの方が自然じゃない?外部のクラスからはどうでもいいインスタンスなんだからクラス内で処理しとけよって感じだし。
ってことでインスタンスの宣言を
NSInteger _age;
NSString *_name;
ってするでしょ。もっともこれは以前から不要だったんだよね、確か。俺は惰性で書いてたけどさ。

最後に実装ファイル側に
@synthesize age = _age;
@synthesize name = _name;
って書くよね。こうしておけばPersonクラス内で_ageでもself.ageでもアクセスできるし、外部クラスからだとperson.nameとかできるわけだよね。

で、今回のXcode 4.4だとこれが以下のようになるんだよ。
ヘッダー側にプロパティの宣言するんだ。
@property(nonatomic, assign) NSInteger age;
@property(nonatomic, retain) NSString *name;
これは同じ。ヘッダー側にこのクラスのプロパティを書く、そりゃそうだよね。さすがにこれは省けない。

すると実装ファイル側に@synthesizeナントカって書かなくても、プロパティとして扱ってくれてself.ageはもちろんPersonクラス内なら_ageでもアクセスできるんだよ!
ずいぶん楽、というかすっきりするよ、これ!

他の人はどうしてるのか知らないけど、俺はクラス内だと読み込むのにself.ageとは書かないで_ageって書いてるんだ。だってその方が短いし、かつプロパティってわかるだろ?だから_ageでアクセスできる、ってのも俺にとっては重要なんだよね。


そうそう、XcodeのEdit/Refactor/Convert to Modern Objective-C Syntaxで一度に書き換える、って機能があるんだけどこれが期待通りには動いてくれないんだ。以前すでに書いたソースに@synthesizeなんかがあれば消してくれる機能だと思うんだけどなぜか"No source changes necessary."って出ちゃうんだ。なんでかなあと思ってよくよく見ると、、、

Convert to Modern Objective-C Syntax

Minimum deployment target will be set to 10.6.8 for Mac OS X targets.
ってdeployment targetの指定がOS Xしか書いてないからiOSじゃだめなのか。


Mountain LionにしたらPHPが動かない?!

MacのOSをMountain LionにしたらPHPファイルが動かなくなって焦ったってお話だよ。

Lion(Snow Leopardもそうだったかな)だとWeb共有ってのがあってそこで簡単にPHPファイルをローカルで実行できてたんだけどさ、Mountain Lionにアップデートしたらどういうわけか動いてくれないんだよ。Forbiddenとかデカデカと出ちゃったりして。
でも正式リリース前からβ版なりでそうなることはすでにみんな知ってたようで、ありがたいことにいろいろと情報があったよ。
ただターミナルとか滅多に使わないからかなり疲れたけどね。

とりあえずターミナルから
$ sudo apachectl start
でapacheを起動させてlocalhostにアクセスするとIt works!(だったっけな)と出るんだよ、デカデカと。apacheは動いてる、と。
でも、localhost/~myusernameにアクセスするとForbiddenなんだよ。あんたにゃアクセスする権限はねえぞ!って雰囲気なんだけど、俺以外に誰がいるんだよ!ってMacに言っても仕方ないのでこのサイト(OS X 10.8 Mountain Lion 向け、Web共有を手動で有効にする方法 | Macとかの雑記帳)にあるように正しいディレクトリ内で
$ sudo vi ユーザー名.conf
でconfファイルを作ってやったんだよ。
でapacheをリスタート後にlocalhost/~myusernameに行くと、、、

Index of の画像

なんだよ、おい。久しぶりにこんな画面見たよ。とりあえずForbiddenは出なくなったのはよし。
これはなんだろうな、と思っていろいろ調べていたんだけど、
Install and configure Apache, MySQL, PHP on OSX 10.8 Mountain Lion
↑ここによると、どうもhttpd.confってファイルをいじる必要があるみたいなんだ。あー、PHPの設定となると登場するよね、これ。

ということでこのサイトの指示通り
LoadModule php5_module libexec/apache2/libphp5.so
をコメントアウトして有効にしたら意図通りPHPが以前のように動いてくれたよ、よかったよかった。


(おまけ)
ターミナルで自分のディレクトリを確認する方法、覚えてる?俺は $ where なんて入力してたよ。もちろん何もしれくれないんだ。
正解は
$ pwd
だって。全然覚えてないや。これでいちいち自分の居場所を確認しとかないと面倒なことになるよ(なったんだよ)。

あと、ディレクトリの中身をみるのも$ ld なんてやってたけど正解は
$ ls
だってさ、惜しいね?!惜しいじゃだめなんだけど、ともかくこのあたりは
[ Mac ] ターミナルコマンドのまとめ ( 多分 Linux でも使えるはず ) - Bowz::Notebook
を参考にさしてもらったんだ。

それから .confファイルをいじる時にviを使ったんだけど、それもさっぱりだったので、
feb19.jp blog - VIM (Vi) をターミナルで操作 / Mac OS X
↑ここを参考にさせてもらったよ。
感謝、感謝!


Mountain Lionがやってきた!

25日発売開始のMountain Lionをインストールしたってお話だよ。

ありがたいことにウチのMac mini late 2009は対応してるみたいなのでMac App Storeから購入。
一応消えたら困るようなファイルはバックアップしといたよ。
朝5:40からスタートして、約20分でダウンロード完了。
次はインストール、再起動まではすぐだったんだけど再起動後に「インストール中、残り約34分」って出たけどね。

OS X 10.8 Mountain Lion

ともかく無事にウチのLionはOS X 10.8 Mountain Lionに変身完了できたよ。
まだたいしていじっていないんだけど、古いMacなのでもっさりするんじゃないかなってのが気になってたけど今のところそういうのはないね。


あとXcodeも4.4が来てたのでこちらもアップデート。

Xcode 4.4

まだいじってないんだけどいろいろと便利になったらしいよ。


よくできてる!「どうぶつしょうぎ(公式)」

子供にいいかなと思い、「どうぶつしょうぎ(公式)」アプリを購入したってお話だよ。

5歳の我が子が将棋に興味を持ってもらいたいと思ってさ、この「どうぶつしょうぎ」って"公式"のアプリを購入したんだよ。
"公式"ってくらいだから類似品が前からあったんだろうね。

どうぶつしょうぎのスクリーンショット
↑このアプリのスクリーンショット(iPhone版)なんだけどさ、どういうわけか横にスペースがあるんだ。このアプリはユニバーサルアプリなんだけど、iPad版でも同じなんだよ。なんなんだろうね?

どうぶつしょうぎのアイコン
↑それからアイコンなんだけどさ、アイコンの下に表示される文字が省略されてるんだ。自分なら絶対避けるんだけどね。

あと、デバイスの方向が1方向しかサポートしてないのが残念だな。人間同士で対戦する時に片方は文字を逆さまに見ることになるからなあ。子供にあわせている、ということなのかな。


この3点は気になるところだけど、それを考慮してもよくできてるアプリだと思うよ。
グラフィックは文句なくハイレベルでカワイイし音楽もマッチしてる。操作性もいいし、わかりやすい。ヘルプも丁寧だし。この完成度は素晴らしいよ、ホント。これで85円(85円はセール価格で通常は350円らしい)なら文句なしの即買いアプリだよ。


初めてのアプリ内課金

アプリ内課金を実装したアプリが審査を通過したのでそのあたりのお話だよ。

今回初めて「時計で遊ぼう」でアプリ内課金を実装してみたんだ。内容はよくある広告を削除するってモノなんだよ。
ちなみに広告はiAdが先で、広告が表示されなければAdMobを表示させるようにしてる。AdMobもなければ何も表示されないようになってるんだ。

アプリ内課金についてはいろいろなサイトを参考にしたけど
失敗しない iOS In-App Purchase プログラミング - A Day In The Life
このあたりがわかりやすいかな。

ただ、たいていのサンプルのままだとユーザーは購入手続き処理に入ってから値段が表示される、というのばかりだったのでそこは変更したよ。
「時計で遊ぼう」の場合だと、

設定タブの画面
↑設定タブのトップがこんな画面。ここの「広告を削除」ってセルをタップすると

広告を削除
↑この画面が表示されるんだ。この画像だとすでに値段が書いてるけど、実際はインジケーターを回してその間に値段を取得しに行ってるよ(だからインジケーターが数秒回ることもある)。
もっともここで値段を表示させないで「広告を削除する」ってボタンを押してもらうわけにはいかないしね?


それから、アプリ内課金をiTunes Connectで設定する時にレビュー用のスクリーンショットが必要だよね。あれどうしたらいいのかよくわからなかったんだけど、

アプリ内課金レビュー用の画像
↑この課金完了した画面のスクショをアップしたよ。一応、申請用のProvisioning profileも使って、iTunes Connectでアプリ内課金の設定も本番と同じ状態にしといて、ちゃんと動作してるのを自分で確認した時に撮影したものだよ(テスト用はテスト用のProvisioning profileをずっと使っていたしね)。
ホントにこんなのでいいのかよくわからないけど、今回はいけたよ。


実際にアプリがリリースされてから気が付いたんだけどさ、App Storeでアプリ内課金があるアプリをみると上の方に「トップアドオン」って表示されるじゃない。

120719_4.jpg
↑ほら、アイコンの下にあるでしょ。リリースされてからしばらくこれが表示されなかったんだよ。
どうもこの「トップアドオン」ってのは売れてる項目の上位10個が表示されるみたいだね。だから実際に一つも売れないと表示してくれないみたいだよ。
ちなみに表示されてるってことは一つは売れたってことなんだけど、俺が動作確認のために自分で買ったんだよ。そしてそれから一つも売れていないんだ!(って力強く言うことでもないけどさ)




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad