南東京iPhone開発者勉強会 11回目に行ってきました。
南東京iPhone開発者勉強会 11回目
9/23 14:00-18:00
・Tonnyさん :MVC+CoreData+GCD+KVO ・akio0911さん:cocos2d本の紹介 ・ながのさん :Flashぽく使ってみるお話 ・きしかわさん:TestFlightについての解説 ・まるやまさん:お金もうけのなにか
スライド無しで話す、という方が多かった印象のある勉強会でした。
内容は一貫してiPhone開発に関してですが、開発の効率化についての話から
デバッグについて、またビジネスについてと多岐に渡るお話が聞けました。
TestFlightなんかは1度導入してみたいですね。
cocos2d for iPhone レッスンノートは購入してしまいました。
後日読んだらまた記事でも書きたいけど、さていつになるか。
ちょっと今回は懇親会に参加しなかったんですが、
やはり参加しておけばよかったかなと結構後悔はしてます。
MVC+CoreData+GCD+KVO
@tonnyxuさん設計手法であるMVCにCoreDataやGCD、KVOといった技術を組み合わせていくと
どんな感じになるか、といったお話。
基本的には各技術の解説が多かったと思います。
発表者の方とは違いますが、これらの手法については以下の書籍でも解説されています。
まだ全部読めていないので連休前にちゃんと持って帰ってくるべきだった。
ビー・エヌ・エヌ新社
売り上げランキング: 114018
発表は中国の方で、現在はiOS + WindowsPhoneで開発をされているそうです。
MVC (Model View Controller) Core Data GCD (Grand Central Dspatch) KVO (Key-Value Observing)
you learn, you live
you copy, you die
これらの技術は、ソースコードをコピーするだけでなく、
しっかりと理解した上で使って欲しい。
Think about 100+ Controllers and Views or even more...
MVCというパターンで、大きいプロジェクトに対応するにはどうすればよいか。
先日、「ワンダホースタジアム for iPad」と言うiPadアプリをリリース。
これは工数としてiOS開発者が2名、サーバー管理が1名で3ヶ月規模の開発。
http://itunes.apple.com/jp/app/id444063626?mt=8
なぜCoreData / GCD / KVOを使ったのか?
なぜCoreDataを利用したのか
→ これを利用することで、コーディング量を相当減らせる(約1/2)
GCDをなぜ利用したのか?
→基本的にマルチスレッドとなり、開発効率が上がる。 また、コレを利用することでdelegateに頼らない開発も可能。 ※ただし、この技術はiOS4以降のみが対象となるのに注意。私が現在開発中のアプリで GCDを利用しようか検討したことはあったが、上記理由により断念。
KVO
→デザインパターンの1つであるObserver + MVC
Modelから直接Viewに通知を投げる形で利用する。
CoreDataがどういう形でMVCに影響するのか
SQLとCoreDataの比較
70個以上のテーブルを持つ場合、SQLで管理しようとすると 多くのSQLを覚えて、またデータ型、メモリの管理、高速化など考えることが複雑化する。 CoreDataを利用すると、Predicateを利用することで簡単に作れる。 また、パフォーマンスも向上し、メモリ管理も自動でやってくれる。 全ての要素をオブジェクトで管理出来る。 しかし、CoreDataをマルチスレッドで使うと問題も発生してくる。 ※……ちょっとこのあたりについてメモは取ってたけど 英語混じりで知らない単語を並べられてしまったため、理解がいまひとつ。 自分でCoreData使うときに、また改めて勉強します。 山のようにスレッドが生成されてしまって、メモリが大変なことになったとか そんな感じだったと思いますが…… マスターデータにはfetched propertiesを設定することで リレーションシップを一本化しましょう、みたいな。
GCD
主にModelの中でGCDを利用する。需要に寄ってControllerの中でも。 20秒以上アプリから反応がない場合、Watchdogが強制的にアプリを終了させる Main thread + synchronous = death メインスレッドで同期通信させてしまうと、 上記の機能によりアプリが死ぬことになる。 JSON/XML API などの呼び出しは、絶対にMain threadに入れないように。 GCD以前では、用途によって様々なクラスを使い分けなければいけなかったが GCDではほとんどserialized queueで考えればいい。
Cocoa programmer likes KVO
あるタイミングでObjectAのproperty1が変化した場合に、 ObjectBに通知して欲しい。 → NSNotificationを利用している場所のだいたいは、KVOに置き換えることが可能。
KVOを使う場合に注意しなければいけないこと
Chained Reaction = ? 複雑な監視関係を作りすぎると、大変なことになる。 ある種「goto文」と同じようになってしまう。 KVOを使う場合は、そのルートを別途ドキュメントとして記述するべき。
結論
・CoreData/GCD/KVOはとても良い技術。 ・中/大規模で開発する場合は、利用することを検討して欲しい。 ・ただし、各技術にはドキュメントが存在するためしっかり理解して利用すること。 ・Software Design 11月号にも掲載するため、興味が合ったら読んで欲しい。
cocos2d本の紹介
@akio911個人ブログ「拡張現実ライフ」
AR関係の記事を毎日アップしている。
cocos2d for iPhone レッスンノートの宣伝
ゲームアプリをどうやって作ったらいいの?という人向けの本。
翻訳本については、cocos2dの使い方を知りたい、という人が買った方が良いのかなと。
1ページ1ページ実行していけば、ゲームを作りながらcocos2dの使い方を知ることが出来る。
作れるゲームとしては、
「神経衰弱」、「ノベルゲーム」、「シューティングゲーム」など。
これらを作りながら、cocos2dの基礎を勉強していく。
これからcocos2dのプログラミングを始めるなら、ついでに
こちらを参考にKobold2dから導入したほうが後々楽かもしれません。
http://d.hatena.ne.jp/Seasons/20110917/1316269959
※Kobold2dはcocos2dでの開発を簡単にするものなので、別物と言うわけではない。
Flashぽく使ってみるお話
@nagano_aさんフリーでWebのデザインや、アプリの受託をやっている
スライドはありません。
音声に反応して、画像がアニメーションするアプリを作ってみた。
受託で絵本を7冊ほど作ったりもしました。
Rainbow Books
ImageView同士を連携させて、関連した動きを行うようにしている。ボーンのような。
背景画像と、上に乗っている絵柄それぞれをタップした場合に別の処理をさせるのだが
Viewは矩形なので、余白部分がタップ出来てしまい見た目的におかしくなってしまう。
→ イベントキャプチャー用のGridViewを頑張って作った。(定数で絵の形を作った)
他に良いやり方はないか?
タップ位置の画像からアルファ情報などを取得したり、
イラストレーターで大まかにポイントして出力し、UIBezierPathのcontainsPoint:を使ったり。
当たり判定用にビットマップ画像を作るなど。
TestFlightについての解説
岸川克己さん@k_katsumi
http://github.com/kishikawakatsumi
TestFlightSDKが公開されたので、TestFlightについての話をしてみる。
TestFlightとは?
βテストのためにAdHocビルドをして使ってもらうと思うが、 いちいちバイナリを送らなくてもWebを使ってon the flyでiPhoneから直接 β版をテスターにインストールしてもらうためのもの。 それのWebインタフェースを提供してくれる。 メールアドレスとパスワードだけでユーザー登録可能。 Save for Enterprise Distribution での設定をTestFlightではエミュレートしてくれる。 βテスター募集用のページなども作れる。 専用Webページを準備してくれたり、テスターに対してメールしてくれたり。 送ったベータアプリをインストールしたかどうかも取得可能。
TestFlightSDKについて
TestFlightSDKをXcode Project内に組み込むことで Crash Reportsなども取得することが可能になる。コレは便利。 .pchに"TestFlight.h"をインポートすると楽。 applicationのdidFinishLaunchingなどで [TestFlight takeOff:チームトークン(トラッキングデータの送信先ハッシュ)]; チームトークンは、TestFlightのDashboard -> Team Managementで取れる。 また、チェックポイントを定義しておくことで 画面が表示されたタイミングなどをトラッキングすることも可能。 passCheckpointをマクロで定義しておくと便利。 stringWithFormatで__func__(定義済みマクロ)を出したりすると分かりやすい。 現状ではクラッシュした場合、そのメモリアドレスしか分からない。 じきに解決するかもしれないが、現状では細かくCheckpointをおいて確認するしかない。 [TestFlight openFeedbackView] と記述することで、フィードバック用のViewを表示することも可能。 ベータの配布や、インストールしてもらうテスターの負担が減る。
GoogleAnalytics for iOS などもある。
http://code.google.com/intl/ja/mobile/analytics/docs/iphone/
その他
iPhoneのクラッシュログは、オーガナイザのDevicelogで
importしてやるとシンボルを分かりやすくストリップしてくれる。
お金もうけのなにか
丸山弘詩さん何も考えてきてないので、雑談をする
「iPhoneアプリで稼ごう」という本を書いた
iOSのベータ版について
iOS5のベータが出ている状況で、既存アプリのアップデートをどうすればいいか。 アプリのバグなのか、OSのバグなのか良くわからないのでリスクが高い。 iPhoneのコアユーザーは、結構Developer登録をしているので iOS5のβ版をインストールしていることも多い。 今回のようにβ期間が長いと、対応していない場合は自分のアプリが利用されないことになるという リスクがあるので、出来る限りは対応した方が良い。 エンジニアの立場(プロジェクトマネージャー)としては、 致命的なところだけをちまちまと直していきたい。 エンジニアは問題がβによるものか分からないので対応したくないとは思うが、 出来ればちょっとずつでもいいので対応してあげてください。
アプリをどうやって周知するか
・一番大きいのは「AppStoreのランキング」 ・ブログによる記事 ・求める機能に対してキーワードを付ける →しかし、キーワードについてはリテラシーの高い方くらいしかいない iTunesでランキングを見る人も、2割程度しかいない。
初めて作ったアプリの場合、どうすればいいのか。
既存のメディア、ブログ、ニュースサイトなどに開発者側からプッシュするしかない。 後はコミュニティ内でタッグを組んでTwitterでつぶやいてもらう。 マイナス面もあり、本当に使っているかどうかが大事。どこか1カ所、 ちゃんと紹介しているところが無いと効果が薄い。
セールについて
常にやっているとマイナス要因が大きくなって、ユーザーが待ってしまう。 セールをやる時しか売れなくなる。 → しかし、アプリの名前を覚えてもらう、という点では良いかも。 (そもそも知られないと意味が無いので) ロングにやって行こうと思ったら、知名度を上げて行くしかない。
アプリの周知に戻って
会ったことがある開発者のアプリは紹介する気になる。 また、アプリをプッシュすることによって、アフィリエイトが増えると判断したら紹介される。 ブロガーが選ぶかどうか、というのには交流があるかどうかは大きな要因となる。 Twitterで絡むのも大事。 マイナス面もあるけど、ほめてくれるものに対しては「ありがとう」など 軽くリアクションを取るだけでも。 「落ちる」などのTweetがあった場合に、すぐ返信するなどが大事。 → 開発者側がきちんと対応しようとしている姿勢を見せる。
CNETなどメディアの紹介記事に書いてもらうのは大変難しい。
紹介してもらうためには、新製品紹介のリリース記事が必要。 また、それを色んな媒体に対して送ってみる。 そして1週間後、もしくは10日後に担当者に対して 「見て頂けましたか?」などのフォローを入れる。 リリース記事を書いて頂けた場合は、ちゃんとお礼を送る。 担当者は1人とは限らないので、ギフトコードも2、3個贈る。 決して投げっぱなしにしないことで誠実な印象を。 IT mediaなどのリリース記事に書かれていることを参考に、 自分のアプリに置き換えて記事を作ってみて 参考にしたサイトに送りつけるのも結構効果的。 担当者には200本以上のリリースメールが来る。 始業から定時までの時間から考えて、担当者が1個のアプリに対してかけられるのは せいぜい5分程度しかない。そのため、サンプル記事を載せて送ることで 「あ、これこのまま使っちゃおう」とメディア担当者の負担を減らす、相手の立場に立って先読みする。 (メディア担当者と仲良くする)
アップデートの重要性
機能追加を頻繁に行っているアプリは、ダウンロード数が伸びる傾向にある。 企業系のアプリでは、なかなかアップデートが頻繁にかけられない。 個人開発者は空き時間を使ってどんどんアプリのブラッシュアップを。 (副業でやっているはずなので、コストは「0」のはず)
値付けについて
正解は無いと思う。 一般ユーザーに売るアプリについては、どんなに高くても500円を越えると買われない。 しかし、85円である必要性はあるのか? 多くの方がこっそり115円→85円のときに170円に値上げしたが、DL数は大して変わっていない。 新規リリースに付いては分からないが、ロングテールのアプリの場合はその傾向にある。 正直なところ、ダウンロード数に対して5%も下がっていることは無かった。 現状であれば、85円という選択肢は全く無いと考えている。 最低でも170円にしておいて、いざという時のセールを行う選択肢を残すべきだと思う。 定価を付けずにうろうろさせてみるのもいいかも。 タイミングを見て効果的にセールを。理由は何でも良い。
有料で出しているものを無料広告モデルに切り替える場合はどうするべきか
絶対に別アプリとして出すべき。 アプリ自体を有料から無料にして広告を付ける、というのは大変なリスク。 有料で購入したのに広告が出たら結構なマイナス要因ではないか。 (下手したら消される、消されずにレビューに苦情が書かれる可能性も高い) ある意味では、ユーザーをないがしろにしていると思われても違いはない。 邪魔にならない広告ならいいかもしれない。
iAd系の広告に関する情報
在庫が無いので表示率が3%程度だったような。全然表示されない。 国内は基本的に期待しない方がいい。iOS5が出たときに、どれだけ投入されるか。
自分が出したアプリで、放置モードやこっそりなくしちゃったことにしたアプリ
ユーザーからのクレームは?
・特にない。あ、なくなっちゃたんだというツィートはあったり。 ・使っている人からピンポイントに質問があったら対応する。 ・のせっぱなしだとクレーム対応しないといけないので取り下げるのもありでは。 →対応出来ないな、と思ったら取り下げておくのがおすすめ。 ユーザーによってはほかのアプリの状況も確認してから購入したりするので、 放置されていたりレビューが荒れているアプリがあると良くない。
最近モ○ゲー、GR○Eのマークが付いて昔のアプリが無料で出てるけど?
※さすがに省略
アプリで評価が低いアプリがあがってくることがあるが、なんであがるのか
自社買い(凄い高い値段で購入して、トップセールスに出す。騙されて買う人が) 別アカウントで1日で500人が購入したらどれくらい上がるか、ということ。 良かろうと悪かろうと、周知させるために物量を投入するという手段はあると思う。
無料でプレゼントする手法は、どういうやり方でプレゼントしてるのか
大量に発行する方法はどうやっているのか
アレだけのグロスになると、AppleStoreも考えてくれるかも。 ギフトコードだとランキングに乗るが、掛け率が変わるという話が聞いたことがある。 ダウンロードでランキングが変わらなくても、宣伝効果になる。