忍者ブログ
なんでもいいから書くブログ。iPhoneアプリやAndroidアプリといったスマートフォンアプリを開発していこうと考えてはいるが、はたしてどこまでできるか、、とにかく記録していこうと思い書いているブログである。有益な情報はあるかもしれないし、ないかもしれない。
Admin | Write
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

iPhoneアプリ「Rank Checker」をリリースしました。

無料です。

でも、、おそらくiPhoneアプリ開発者しか使わないでしょう。

このアプリは、AppStore における、カテゴリ別のランキングをチェックするツールです。

(ね、普通の人はランキングなんて気にしないから使わないっしょ)


まず、アプリ名、国、無料/有料、ジャンル(カテゴリ)を設定します。

02j.png


あとは、ランキングをチェックしたいときに、左下の更新ボタンを押すだけです。

01j.png


現在の順位が表示されます。アプリが見つからないか、ランク外(300位までに入っていない)の場合は、 --- と表示されます。

(アプリが見つからないのか、ランク外なのか判別できないので、アプリ名は正式にフルで入力してください。アプリ名が日本語名と英語名とある場合は、Localization で指定した言語の名称を指定しないとだめかな。。)


はい、これだけです。履歴やグラフなんてものはありません。

(ちょっと機能がさみしいので、履歴は近々バージョンアップして付けます


でも、私はかなりの頻度で使っています。

そんなにランキングを気にしてもしょうがないのですが、

ランキングが上がる=ダウンロードされた 

ってことでして、、気になるよねぇ。



まぁ自分用にちゃっちゃっと作った感じです。探したけどめぼしい物がなかったので。

作る前は、AppStore でカテゴリ別に、さらに25件を押して、100位までに入っているかチェックするというように大変でした。

iPhoneアプリを紹介するサイトで、カテゴリ何位 っていう表記があったので、

きっとランキングを取得する何かがあるのだと探したら、

こんなのがありました。 

iTunes Store RSS

ほぉう、これで300位までランキングが取得できますな。しかも各国のAppStoreのランキングが。

でも、他のアプリなんてどうでもいいのです。自分のが何位か知りたいのです(身勝手)。

いちいち取得した情報を検索するのは、、無理。

で、PCでスクリプトを書こうかと思ったが、せっかくなのでiPhoneアプリにしてみました。

ちょうど通信まわりを勉強しようと思っていたところなので。(おかげで、http通信とXMLも使えるようになったぞ。)


ということで、iPhoneアプリの開発者の方、是非、使ってみてください。おすすめです。

(まぁ開発者の方なら自分でもっといいもの作れるでしょうが;)







PR
8/1に最初のアプリが販売され、1ヶ月過ぎたので、集計してみた。

まぁ金額を出すのもなんなんで、目標数の%で表してみます。

目標数はこんぐらいでれば、生活できるかなぁ程度の金額を単価で割った数です。
(開発日数を考えて設定しているのですぐ完成したアプリは目標数も少なめ)

・Best Bowling (単価350円、利益 245円) (販売日数:31) 1.02%
・イメージ貯金 (単価230円、利益161円) (販売日数:15) 1.53%

はい、全然ですね。そう簡単ではない。

目標数はトータル販売数なので、まだこれから増えればっ、、て、単純に100ヶ月かかるか。。

まぁまずは販売を開始するということが目標だったので、これはクリア。
次は売上につながる戦略を考えつつ、アプリ数を増やす!!これが目標。

年末までに、あと5本(5種類)は出したいところ。


なお、無料版の広告収入は、まぁ無いに等しい。
無料版はダウンロード数は多いが、継続して使う人は少ない。
お試しという意味なので、気に入ってもらえたら有料版を購入してもらえている?
という意味では、まぁこんなもんでしょう。


でも使ってくれる人がいるだけで、嬉しいです。


さぁ頑張るか!




お待たせしました。


icon
「イメージ貯金」の無料お試し版です。



まぁ機能は有料版と同じなので、この記事を参照 してください。


貯金を頑張っている方、目標を設定して貯金してみませんか?


欲しい物、したい事の写真を目標に設定することで、より貯金が楽しくなります!


ぜひぜひ



無料版では、貯金箱の登録は2つまでとなります。
(ただし、登録されている貯金箱を削除すれば、再度登録できるようになるので、ずーと使い続けることができます。)
あと、広告が表示されます。


アップルの広告サービス iAd を取り入れてみたが、まだ表示されず。。
広告数が少ないのか?
見てみたいのに〜






って、rejectされたから書くんですが。

 ... because it displays an empty iAd banner when ad content is not available.
 The banner within the app should be hidden whenever ad content is not being served by iAd.
 To handle the case where ad content is not available, you will need to implement a banner view delegate.

ようは、広告の内容が取得できなかったときは、バナーを隠せってこと。その為にバナービューのデリゲートをちゃんと実装しなきゃだめってこと。

デリゲートは実装しなくていいや、広告出しとくだけだし、、って思ったらダメなようだ。
ちゃんとドキュメント読めって。。

広告を取得した場合は、
bannerViewDidLoadAd
エラーの場合は、
didFailToReceiveAdWithError
で通知してくる。
なので、こんな感じに初期化して、デリゲートは self とした。
        ADBannerView *adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
        adView.delegate = self;
        adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
        adView.frame = CGRectOffset(adView.frame, 0, -50); //隠しておく
        [self.view addSubview:adView];
        [adView release];
        self.bannerIsVisible = NO; //隠しているのでフラグOFF

デリゲートは self としたので、このクラスに次のように実装。
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    if (self.bannerIsVisible)
    {
       //バナーを隠します
        [UIView beginAnimations:@"animateAdBannerOff" context:NULL];
        banner.frame = CGRectOffset(banner.frame, 0, -50);
        [UIView commitAnimations];
        self.bannerIsVisible = NO;
    }
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
    if (!self.bannerIsVisible)
    {
       //バナーを表示します
        [UIView beginAnimations:@"animateAdBannerOn" context:NULL];
        banner.frame = CGRectOffset(banner.frame, 0, 50);
        [UIView commitAnimations];
        self.bannerIsVisible = YES;
    }
}

まぁこんだけだ。(っとこの段階では思っていたが、後で落ちがある。。)

さぁ、試そう。bannerViewDidLoadAd は呼ばれる。まぁ当然。
でも、エラーの通知ってどう再現するんだ。
。。。悩む。
しょうがないのでドキュメントを見る。書いてあった。。
通信をOFF にしろって。なるほど!

やってみる。設定で、機内モードにして、アプリに戻る。
最初から表示されないケースはオッケー、でもこれってエラー通知で
広告が隠れたわけではない。ログ出力しても呼ばれていない。
広告が表示された状態から、エラー通知により隠れないってこと。

すこし考える。

バナーが次の広告をサーバに取得しにいくタイミングがあるはずだ。
それまで待つことにした。

画面を表示した状態で待ったが、いっこうに動かない。

しょうがないので、ボタンをポッチと押してバックグラウンドで放置。

5分くらいして通信をOFFにして再開してみる。

おぉ!広告バナーが隠れた。ちゃんとエラー通知をとおている。よし!


didFailToReceiveAdWithError の確認方法は次の通りだ。
広告を表示する→バックグラウンドで5分くらい放置→通信OFF(機内モードとか。)→アプリ再開


よーしできた。再申請でまた1週間待ちか。


しかし、、、、かるーくアプリを動かしていたら、突然、強制終了。

なにっ!!今までこんな落ちかたなかったのに。

しょうがないので、デバッグ開始。

コールスタックみたらiAdで落ちてるね。俺知らねーし。どこだよー。

っと原因を探っていたら、、これか。。

これは iAdだからってわけではなく、非同期でメソッド呼び出したりするときも、やっちまったーってケースだ。

呼び出したときに、もう既にいないってやつです。

この場合、ADBannerView の delegate を self にしたので、

違う画面に戻ったときに、運悪くバナーが通信して広告取りに行って、

delegateにより通知しにきたとき、もう違う画面なので、"self" がなくなってしまった。

そういうことです。


解決方法は、これでいいのかわからないが、

viewWillDisappear (ビューが非表示になるとき) に、 delegate=nil

viewWillAppear (ビューが表示されるとき)に 、delegate=self とした。

こんな感じに。
- (void)viewWillDisappear:(BOOL)animated {
    for (UIView *viewTmp in self.view.subviews) {
        if ([viewTmp isMemberOfClass:[ADBannerView class]]) {
            ((ADBannerView *)viewTmp).delegate = nil;
        }
    }
    [super viewWillDisappear:animated];
}


これで、落ちることもなくなったので、よしとしよう。

やっと再申請。1週間待ちだ。。







iPhone開発。

UITableViewCellを継承したカスタムセルの場合、編集モードになった際、インデントしてくれない。

通常は左側に禁止マークが表示された分、右へインデントするわけだが、

カスタムセルの場合、自前でコードを書かなければいけないようだ。(あたりまえ?)

何もしない場合はこんな感じ。

ccc.jpg

で、カスタムセルで次のメソッドをオーバーライドし、個々のサブビューの配置を行う。

- (void)layoutSubviews {
    [super layoutSubviews];
   
    if (self.editing == YES) {
        lblAAA.frame    = CGRectMake(40, 18, 210, 28);
        lblCCC.frame    = CGRectMake(40,  1,  75, 20);       
    }
    else {
        lblAAA.frame    = CGRectMake(10, 18, 250, 28);
        lblCCC.frame    = CGRectMake(10,  1, 100, 20);
    }
}

面倒なので、編集モードとそうでない場合をべたっと書いた。

相対的にうまいことやれば、分岐する必要はないだろう。

結果、こんな感じ。

bbb.jpg













iPhone開発。

またEXC_BAD_ACCESSでハマってしまった。

iPhoneアプリを開発していれば、誰しもこれでハマった経験はあるだろう。

EXC_BAD_ACCESSと出力してフリーズだ。。

いつも発生するならまだしも、たまに発生するケースは厄介。場所が特定できないので。

まぁ原因は、メモリ管理。releaseし過ぎか、retain忘れか。。


で、場所を特定しやすくする方法があったので紹介。

左ペインの「実行可能ファイル」にある実行ファイルをダブルクリックし

そこの引数タブの環境変数に「NSZombieEnabled」を追加して値を「YES」にする。

メモリ解放されずにゾンビとして生き残るということか。

これで、がんばって?!EXC_BAD_ACCESSを発生させる。

運が良ければ?!コンソールに何かしら出力される。

*** -[NSIndexPath release]: message sent to deallocated instance 0x5c5b610

やはり既に解放されているアドレスへのアクセスか。

でもこれで、NSIndexPath ということがわかった。

コールスタックも見覚えのある呼び出し(黒で表示されている部分)があったので、クリック。

- (void)dealloc {
      [lastIndexPath release];
      ...

lastIndexPathという変数だ。こいつが原因!

代入している部分を検索したら、

    lastIndexPath = indexPath;

こんな箇所が。。この変数はプロパティにしているので、

    self.lastIndexPath = indexPath;

が正解。(lastIndexPath = [indexPath retain]; これでもいいけど。)

self. にするかしないかで全く違うのです。

というか、プロパティだからセッターが呼ばれて、

その中で、古いのrelease 新しいのretain ってやってくれているだけだ。これ重要。







iPhoneアプリ「Best Bowling Free」をリリースしました。

icon100f.jpg


「Best Bowling」の無料版です! (ボウリングのスコア管理アプリです。)

機能制限で100件までしか登録できませんが、お試しには十分かと。

その他の制限としては、データ復元機能が使えません。(まぁいらないでしょ。)

しかーし、有料版へデータの引き継ぎができます!

だから無料版を使い倒してから、有料版へ移行できるのです!


ボウリングのスコアアップを目指している方には超オススメです。

だって、ボウリングしながら入力すればいいんだから。家帰ってPCでスコア入力するなんて面倒だしね。

データ分析って上達には欠かせません。

あとアベレージが上がって行く様子をグラフで見たら、やる気もでるし! (下がっちゃう場合もあるけど。)

ピン入力が面倒に思えるかもしれませんが、「設定」でピンが倒れた状態にできるのです。

ほとんどピンを残さない方は、この設定ならピッピっと入力できちゃいます。

(それすら面倒な方は合計スコアだけ入力する方法もあります。当然、詳細な分析はできませんが。)


pin.jpg




iPod touch でも使えます。 (当然 iPad でも使えます。でも大画面対応はしていない。。)

あと無料版は広告でちゃいます。無料だからゆるして。






iPhoneアプリ「イメージ貯金」をリリースしました。

どんなアプリかって?

説明がむずかしい。。画像の手助けで、説明を。。


j_01.png

こんな感じに、画像が白くマスクされていて、好きな場所を選ぶと

j_02.png

こんな感じに、金額が示されるので、その金額を貯金箱にいれていく。

全部、画像が見えたとき、目標の金額が貯金箱に入っているってこと。

目標の金額と写真は自分で決められ(写真はライブラリから選ぶか撮影する)、

分割数も決められるので、自分のペースで貯金してみよう。

まぁルールは自分で決めればいいのだ。

毎日1回でもいいし、小銭があったらどんどん開けていくって感じでもよい。

目標の写真は、物ならその物の写真、旅行とかなら場所の写真がいいよね。




iPhone開発ネタ。

OpenALを使うと、仮想の3次元空間にいる感覚で音が聞こえるらしい。

これを使ってゲームを作ろうと思い、使ってみることにした。

ようは音源とリスナー(聞く人)を配置すればいいだけだな。(速度のパラメータを使えばドップラー効果も再現できるようだ。)

サンプルは Appleドキュメントの 「oalTouch」、これを見ればよくわかるし、ほぼ流用できる。

サンプルを実行すれば、3次元空間ではなく2次元だが、左右の違いや、距離による音量の変化はよくわかる。

で、複数の音源もできるようなので、サンプルをちょこちょこっと改良した。

実行。。

音はなる。複数の音源でちゃんとなる。

でも

同じ音量だし、距離や左右の違いによる音の変化はない。(もちろん実機でイアフォンして)

あれれ。。。。

ソースを一つずつ見直し、パラメータを変えたり、位置を変えたりしたが、かわらない。原因不明だ。

3時間くらい格闘しただろうか。

サンプルのソースに徐々に戻しつつ、

サンプルの音源ファイルで試してみるかっと音のファイルを変えてみたら、、

うまくいくじゃん!!!!


ほーー、これが原因?!

ということで、自前で用意した音ファイルはダメだったようだ。

何がダメか、、afconvert で CAFのリニアPCMに変換した(つもり)だが。(元は wav)

実際、細かなことはわからんが、次のように CAFのIMA4 にしたらうまくいった。

(この辺のフォーマット、コーデックの違いはよーわからん。)

afconvert -f caff -d ima4 -d LEI16@22050 -c 1 -o [出力ファイル名].caf [入力ファイル名].wav

だめだったやり方はこれ
afconvert -f caff -d LEI16 [入力ファイル名].wav [出力ファイル名].caf



結局、コーディングは最初の状態で問題なかったので、元にもどした。






iAD.framework は iOS4.0 からの機能なので、3.x のOSでは動作しないわけだ。

でもアプリケーションとしてはiOS4.0 と 3.x のどちらでも動作するものにしたい。

そうしないと、OS 3.x でアプリ実行時に落ちてしまう。。

方法は、Framework を Required から Weak に変更すればよい。

左側のツリーから
「ターゲット」ー「実行ファイル名」ー「バイナリをライブラリにリンク」を選択。
右上の「詳細」にフレームワークの一覧が表示されるので、
その「役割」をRequired から Weak に変更。

OSのバージョン毎に処理を分岐したいなら、次のように判別すればよい。

if
([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
}


(当然、Deployment Target は低いバージョンにしておかないとダメだぞ。)






YamaTatsuのiPhoneアプリ
iTunes Store でみる
LightOff Light Off Hot New
点いたライトを素早く消そう!
誰でも遊べるシンプルなゲームです

めいろであそぼう めいろであそぼう New
かわいいイラストのめいろ、ぬり絵もできる
子供向けの迷路あそびです。※iPad専用

運試し 運試し NEW
15連続の確率は0.0001%
操作は簡単 好きなパネルを選ぶだけ。どこまで進めるか運試し!

連打 連打! まだまだ人気
16連射に挑戦
10秒間で何回ボタンを押せるか競うゲームです。

うちメモ うちメモ ★大人気★
買い物中に 「まだあったかな?」 と思った経験 ありませんか? 「うちメモ」していれば大丈夫!!

BestBowling Best Bowling
マイボウラーに大人気! ボウリングのスコアを管理するアプリです。

イメージ貯金 イメージ貯金
貯金はモチベーションが重要! 目標を設定して毎日楽しく貯金しよう!

Mine Escape Mine Escape
聴力は優れていますか? 音で機雷の位置を判断する新感覚のアクションゲーム!

Rank Checker Rank Checker
だって気になるじゃないですか、、 アプリ開発者必須! AppStoreのランキングをチェックツールです。


カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Twitter
プロフィール
HN:
YamaTatsu
HP:
性別:
非公開
自己紹介:
iPhoneアプリを開発してまーす。
最新コメント
[06/04 K.I.T]
[06/03 Cotoba]
[05/19 K.I.T]
[05/18 コタツ猫]
最新トラックバック
ブログ内検索
バーコード
忍者アド
アクセス解析
忍者ブログ [PR]

Designed by