ぼくたちの失敗 ~実際にあった失敗事例集~ 2011/01/23 murapong 1
ぼくたちの失敗~実際にあった失敗事例集~
2011/01/23murapong
1
自己紹介
• 株式会社チャンスイットでiPhoneアプリ開発
• Blog:http://d.hatena.ne.jp/murapong/
• Twitter:http://twitter.com/murapong
2
リリースしたアプリ①
• 「チャンスイッ島」
• チャンスイットのキャラクターを使ったTilt系ゲーム
• http://itunes.apple.com/jp/app/id384874687?mt=8
3
リリースしたアプリ②
• 「えいとぱずる。」
• GetMoney!のキャラクターを使った8パズル(15パズルもあり)
• cocos2dを使用
• http://itunes.apple.com/jp/app/id396386382?mt=8
4
リリースしたアプリ③• 「チャンスみくじ」
• 2011年の自社カレンダーのおまけアプリ
• OpenCVを使用
• http://itunes.apple.com/jp/app/id396386382?mt=8
• デモ:http://www.youtube.com/
watch?v=E_5ZGqjE284
5
今日のテーマ
• iPhoneアプリ開発に着手してからの約10ヶ月間が経過
• その中で経験した珠玉の失敗事例を紹介
6
失敗①
7
AdMobとは?• Google傘下のモバイル広告ネットワーク
• iPhoneだけでなくiPad、Android、スマートフォン用Webサイトなど多くのプラットフォームに対応
8
AdMobを組み込むには?
• AdMobDelegateProtocol.h、AdMobView.h、libAdMob.aをプロジェクトに追加する
• AudioToolbox、CoreGraphics、MediaPlayer、MessageUI、QuartzCoreを追加する
• TouchJSONを追加する
• AdMobDelegateメソッドを追加する
9
SampleViewController.h
#import <UIKit/UIKit.h>#import "AdMobDelegateProtocol.h"
@class AdMobView;
@interface SampleViewController : UIViewController <AdMobDelegate> { AdMobView *adMobAd;}
@end
10
SampleViewController.m#import "SampleViewController.h"#import "AdMobView.h"
@implementation SampleViewController(中略)
#pragma mark -#pragma mark AdMobDelegate methods- (NSString *)publisherIdForAd:(AdMobView *)adView { return @"hoge";}
- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView { return self;}
- (void)didReceiveAd:(AdMobView *)adView { CGRect frame = self.view.frame; adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48); [self.view addSubview:adMobAd];}@end
11
失敗:AdMobのアカウントロック
• 開発時にテストモードの設定を忘れる
• 結果、AdMobの原因調査のためリリース直後から約3週間のアカウントロック
12
SampleViewController.m#import "SampleViewController.h"#import "AdMobView.h"
@implementation SampleViewController(中略)
#pragma mark -#pragma mark AdMobDelegate methods- (NSString *)publisherIdForAd:(AdMobView *)adView { return @"hoge";}
- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView { return self;}
- (NSArray *)testDevices { return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, [UIDevice currentDevice].uniqueIdentifier, nil];}
- (void)didReceiveAd:(AdMobView *)adView { CGRect frame = self.view.frame; adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48); [self.view addSubview:adMobAd];}@end
13
AdMobおまけノウハウ
• AdMobの広告が取得できない場合(ネットワーク未接続など)に空きスペースに自社広告を埋め込む
14
- (void)didFailToReceiveAd:(AdMobView *)adView { CGRect frame = self.view.frame; rect = CGRectMake(0, frame.size.height - 48, frame.size.width, 48); UIImageView *myAd = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"my-ad.png"]]; myAd.frame = rect; [self.view addSubview:myAd]; [myAd release];}
15
失敗②
16
失敗:非公開APIの使用によるReject
• 「チャンスみくじ」ではカメラを使ってリアルタイム画像解析を行う必要があった
• UIGetScreenImage()なるAPIを発見
• ブログなどにも多数のサンプルコードが掲載
• ただし、このAPIは非公開API
• 結果、Waiting For Reviewから8分でReject(2010/12/1時点)
• もしかして機械的に弾いてる?
17
UIGetScreenImage()のサンプルコードCGImageRef screenImageRef = UIGetScreenImage();UIImage *screenImage = [UIImage imageWithCGImage:screenImageRef];CGImageRelease(screenImageRef);
非常に簡単にスクリーンショットが取れる(ただしReject対象)
18
iOS4.0のAV Foundationフレームワークを使用して解決
• ただし、前ページと同じ処理を書くのに100行近く掛かった
• http://developer.apple.com/library/ios/#qa/qa2010/qa1702.html
19
失敗③
20
使用可能デバイスによるインストール制限
• 「チャンスみくじ」ではカメラを使ってリアルタイム画像解析を実現
• 裏を返せばカメラが使用できない端末(ex.
iPad)ではアプリを使用できない
• 失敗:アプリ側で明示的に制限しないとReject
対象になる
21
Info.plistのRequired device capabilitiesにアプリで必要なデバイスを記載する
22
• 各デバイスの設定はAppleのサイトで確認
• http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BuildTimeConfiguration/BuildTimeConfiguration.html#//apple_ref/doc/uid/TP40007072-CH7-SW9
23
失敗④
24
iPhone実機でアプリを動かすには?
• iOS Developer Programへの登録
• キーチェーンアクセスで証明書要求を作成
• iOS Provisioning Portalに証明書要求を登録
• 証明書のダウンロード
• デバイスの登録
• App IDの作成
• Provisioning Profileのインストール
25
失敗:証明書要求が登録できない
• Google Chromeだといくらやってもダメ
• Safari、Firefoxだとすんなり登録可能
• ブラウザの問題だと気付かずに数時間ハマる
• http://d.hatena.ne.jp/murapong/20101108/1289218790
26
Appleの管理画面がGoogle Chromeと相性が悪い?
• iTunes ConnectのSales and Trendsのレポート表示もGoogle Chromeだとうまくいかない場合がある。(うまくいく場合もある。)
• これもSafari、Firefoxだと普通に開ける
27
ご清聴ありがとうございました
28