2013年10月23日

xcodeで同じアプリの無料版と有料版を作るには

アプリ作っててブログの更新をすっかり忘れてました。
この前は昼飯食うの忘れたし…
安西先生、やっぱりコンピューターが好きです…

ということで、最近iOSアプリのことしか考えてないので興味のない人が多くてもアプリネタ。

xcodeで同じアプリの無料版と有料版を作るには
別のプロジェクトにする方法と1つのプロジェクトでTARGETを2つにする方法があります。
プロジェクトをコピーして別のプロジェクトにするとソースのバージョン管理が枝分かれしてしまって大変なので1つのプロジェクトでProduct NameやBundle IDをかえる方がいい。

TARGETを2つに分けるには

1.TARGETの右クリックメニューの"Duplicate"でTARGETを複製

2.Build SettingタブのPackagingのProduct Nameを変更
これがGeneralタブのBundleIDに反映される(plistを書き換えていなければ)
(これが最初わからなかった… GeneralタブだとBundle IDの下の方はグレーアウトしてて変更できなくて、どうやって変更するのかと思ったらBuild SettingタブのPackagingのところのProduct Nameだった)→これをやってもArchivesの方のBundleIDが変わらなくてはまったけど…

3.Build Settingを開いて「Apple LLVM5.0 - PreprocessingのPreprocessor Macros」のところにFREE_VERSION=1と設定

4.ソースコード内で有料版と無料版の処理を分岐

#ifdef FREE_VERSION
広告を表示したり無料版のみの処理
#endif
みたいに

困ったのが@interface文をifdefで分けてもエラーになること
(Cのプリプロセッサが走る前の段階で@interfaceが2個あるとだめみたいです)

@interface文のプロトコルを条件で変えるには

#ifdef FREE_VERSION
@interface ViewController : UIViewController <なんとかデリゲート>
#elseif
@interface ViewController : UIViewController <>
#endif
とやってもエラーになります(10人中10人が最初はこう書くと思う)

#define ARGS NSObject //定義しなかったりヌルだとエラー
#ifdef FREE_VERSION
#define ARGS なんとかデリゲート,かんとかデリゲート
#endif

@interface ViewController : UIViewController <ARGS>
とやるとうまくいきます

追記:こっちの方がいいかな?…
#define ARGS //定義しないとエラー
#ifdef FREE_VERSION
#define ARGS <なんとかデリゲート,かんとかデリゲート>
#endif

@interface ViewController : UIViewController ARGS

これでOKかと思ったら、どこかに元の名前が残ってるようでValidateしようとしたらBundleIDが違うと言われる(Archivesの方のIdentifier名が違っている)
info.plistを修正してもダメ
プロジェクトのGeneralタブで見るとBundleIDはちゃんと別の名前になっているのに…

仕方がないからプロジェクトをコピーして別のプロジェクトにしてアップロードしたけど、有料版と無料版でソースを二重管理するのは嫌なのでArchivesのIDをTARGETごとに変える方法があればいいのですけど最初わからなくて試行錯誤の末やっと見つけました。

Edit SchemeのManage Schemesボタンで開かれるウィンドウのScheme名を変更すると(一見変更できるように見えないけどreturnキーを押すと実は変更できる)その名前がArchivesのIdentifier名になるようなので、これをiTunes connectで登録したBundleIDと同じにするとうまくいきます。

あとはまったのが、iTunes connectではステータスが “Prepare for Upload” になっていても、右上の “Ready to Upload Binary” で暗号関係の輸出規制の質問に回答してないとUpload待ち状態になっていないこと。(追記:これは今は大丈夫です)
ArchiveのvalidateでUpload待ちになってないと言われたらBundleIDとArchiveのIdentifierの確認と“Ready to Upload Binary”をやったかどうか要確認。

これを調べてる中で削除しようとするとXcodeが落ちる変なTARGETができてしまった(結局”消せずのTARGET”として残ってる… deleteしようとすると必ずXcodeが落ちるので消すことが出来ない…)

本日の教訓
「ArchivesのBundleID(Identifier)はplistからとってるのではなくscheme名」

追記:
2014年から、広告(トラッキング広告)についての審査基準が厳しくなったようで、iAdやAdSupportのframeworkをリンクしてるのに広告の表示がされていないとリジェクトされるようになったようです。
”free versionで広告表示していて同じソースを使っているからだ”と反論したら
”広告が表示されてるスクリーンショットをアップロードしろ”と指示がきて無料版の方のスクショをアップしたらOKになりました。(追記:レビュワーによっては実際にそのアプリで広告が表示されないとダメという人もいました。 レビュー申請時に”広告付きの無料版とソースが共通だから”というコメント文だけで通ったケース(10件以上)とスクショ追加で通ったケース(3件)と2ヶ月押し問答してもダメだったケース(1件)の3通りでした)
それからはレビュー申請するときに、MyAppの”App レビュー審査に関する情報のメモ”のところに”AppleID=xxのfree versionと同じソースを共有してるからiAd.frameworkやAdSupport.frameworkを組み込んでいる”ということを書いて申請するようにしています。(だいたい通ります)
追記:2015年に更に厳しくなって、この理由じゃ通らなくなってきたので最近は昔作ったものは広告有り版と無し版2つに分けてます…
xcode5からは同じファイル名のxibをTARGETごとに作れるようになったらしいので新しく作る時にはxibを別にしてAd frameworkなし版を作るようにするのがいいと思います(iAdのbannerつきの共通のxibでiAdの.hやらframeworkだけを抜いたらviewのロード時に例外で落ちてしまってダメでした)
ラベル:アプリ製作
posted by one-hand-engineer at 20:46| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月22日

片麻痺自慢

片麻痺の日常生活動作大会があったら全国大会は無理でも市町村レベルなら結構いいとこいくんじゃないかとひそかに思ってるのですけど、そんな片麻痺自慢。

1. 腕立て/懸垂ができる(体重が軽いので元々ほぼ片腕でできたので。クライマーの名残りですな)

2.スキップができる (これは最初はできなかったけど練習の結果不格好でかなり転びそうになりながらクリア)(両足でもジャンプは難しい)

どちらも健康なら子どもでも簡単にできることですけどPTさんに「ここまでできる片麻痺の人を見たことがない」と驚かれたから片麻痺での難易度は10人に1人とか100人に1人とかのレベルでしょう、たぶん。
ラベル:脳梗塞 リハビリ
posted by one-hand-engineer at 09:10| Comment(2) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月21日

iPhoneアプリにiAdをつけるには

iPhoneアプリにiAd(広告)をつけるには

ProjectのBuild PhasesのLink Binarys with LibrariesにiAd.frameworkを+して

.hに
#import <iAd/iAd.h>

@interface ViewController : UIViewController <ADBannerViewDelegate>
とADBannerのDelegeteを加えて

Interface BuilderやstoryboardでiAdのオブジェクトを貼り付けて
CTRL+マウスドラッグで
__weak IBOutlet ADBannerView *AdBanner;
のアウトレットを引っ張って

.mに
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

AdBanner.delegate = self;
AdBanner.hidden = YES;
}

//iAd取得成功
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
NSLog(@"iAd取得成功");
AdBanner.hidden = NO;
}

//iAd取得失敗
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
NSLog(@"iAd取得失敗");
AdBanner.hidden = YES;
}

と加えるだけ。

iAdの取得に失敗したときに白い広告表示枠が表示されたままだとリジェクトされるそうで取得に失敗したら隠さないといけないのですが
ググると

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
if (bannerIsVisible) {
[UIView beginAnimations:@"animateAdBannerOff" context:NULL];
[UIView setAnimationDuration:0.3];

AdBanner.frame = CGRectOffset(AdBanner.frame, 0, -CGRectGetHeight(AdBanner.frame));
AdBanner.alpha = 0.0;

[UIView commitAnimations];
bannerIsVisible = NO;
}

こんな立派なコードがサンプルとして出てくるけど
隠すだけなら
AdBanner.hidden = YES;
これ一行でOKですよ、奥さん。
AppleのReviewもちゃんと通りました。
ラベル:アプリ製作
posted by one-hand-engineer at 10:11| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

AppStore登録できるかな3

1回Rejectをくらって再申請して3日後に再度Reviewに入ったと連絡がきてその3日後に”Processing for App Store”という連絡がきて無事登録されました。
申請してから登録されるまで2週間。

初アプリは無料版のこんなのです。
https://itunes.apple.com/us/app/ud-color-checker/id721449459?l=ja&ls=1&mt=8
ラベル:アプリ製作
posted by one-hand-engineer at 09:29| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月20日

芸術家はパトロンがいないと食っていけなくなる

youtubeだのpixivだの無名の素人でも作品を発表する場ができて実力さえあればお金やツテがなくてものし上がっていけるような時代になると芸術家は一度有名になってもそれだけで長期間食っていくことはできなくなってしまう。
若い才能が次々現れる一方で自分は年を取って力が衰えたり飽きられるので実力勝負で若い人に勝ち続けていくなんて相当厳しい。

これからの芸術家は演奏会とか展示会の販売収入は引き続き期待できるとしても不安定だからパトロンにお金を出してもらって創作活動を続けていくしかないんじゃないかと思います。

技術屋も似たようなもの。
新しい技術の習得は柔軟な若い頭脳や体力に年寄りはかなわない。
経験でカバーするといっても、新しい技術の習得にはかえって経験が邪魔になることも多いし。
技術屋にはパトロンなんかいないだろうから若い人とうまく協力して経験や人脈を生かすようなやり方しかないのかな…
若い人が出てくるのを邪魔していてもキリがないし実力ではかなわないから正面から対立したらダメだと思う。
逆に若い人は”老害”とか言って上を蹴落とすことばかりを考えていると自分が年をとった時に困ると思う。
世代間の対立ではなく共存共栄を考えないと。
posted by one-hand-engineer at 22:24| Comment(1) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月19日

いじめはなくならない

「弱い者いじめをする人ってどこにでもいるよね。持って生まれた性格なのかな」という話をしていて「動物のDNAレベルに刻まれた本能じゃないかな」という話に。
種として生き延びる確率を上げるために同種の弱い遺伝子を淘汰したいという本能がDNAレベルであるんじゃないかと。
だとすると根絶するのは相当難しいよなぁ…
種として成熟したら不要な原始的な本能が強く残ってる人って現代社会にもいっぱい残ってるよね。
そういう人ほど自分が原始的ってことに気づいてないから厄介だよね。

posted by one-hand-engineer at 10:29| Comment(2) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月18日

車椅子の思い出

他の方が車椅子の話を書いていたので便乗。
私は入院中の3,4ヶ月目ぐらいで車椅子を卒業したのですけど、当時はイヤイヤでした… 

病院の車椅子の数が足りないということで取り上げられたのですけど、「歩行器だと歯磨きの時のコップや風呂の時の着替えやシャンプーが持てない」と看護師長さんにクレームを言ったら師長さん自ら紙袋をつりさげるためのS字フックを歩行器に紐でとりつけてくれて「これなら平気でしょ?」と言われてもう反論ができなくて仕方なく…
今思えば早い時期に歩行器になったのはその後の回復にはよかったんじゃないかと思うのですけど、当時は不満タラタラでした。
車椅子って楽なんですよね。歩行器は怖いし疲れるしガラガラうるさいし。

でも病院の中は斜面や段差がなくて楽だけど、一歩病院の外にでたらバリアだらけで車椅子を卒業できて本当によかったと思います。
一度車椅子の時に病院の外の床屋に行ったのですけど坂道は登れないし後ろ向きに逆走しそうで怖いし段差だらけだし病院の中は車椅子は楽だけど退院した後で大変だな、と思いました。
ラベル:脳梗塞 リハビリ
posted by one-hand-engineer at 08:48| Comment(8) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月17日

「短劇」



星新一を彷彿とさせるようなちょっとブラックなショートショート
短編は詳しく書くとネタバレになっちゃうから感想を書くのが難しいな
黒歴史をばらされるのは確かに恥ずかしいよね、ぐらいならいいか
坂木司、長編だけじゃなくて短編も面白かったです。
ラベル:本/マンガ
posted by one-hand-engineer at 08:38| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2013年10月16日

追悼…

数週間前から洗面所の天井にいた蜘蛛が今朝ボウルのところに黒く固まってお亡くなりになっていた…
毎日のように家族で「まだいるね」と話してたので少しさびしい感じ。
ティッシュでつまんで捨てる時に思わず合掌。
数週間だけど一緒に暮らした仲だから地獄に落ちそうになったら糸を出してくれよ。

やなせたかしさんの話だと思った?
posted by one-hand-engineer at 09:05| Comment(2) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

Google Web Designer

Google Web Designerを試してみた
https://www.google.com/webdesigner/

ベジエ曲線で絵を書いて3Dでぐりぐりアニメーションできる

最初四角しか書き方がわからなかったのだけど左のメニューでシェイプツールを選んで上のメニューで四角、丸、直線が選べるのね

画像ファイルのインポートも”インポート”なんてメニューはなくてタグツールでimgタグの枠を置いて右側のプロパティでimgタグのImage Propertiesというプロパティのソースというところに画像ファイル名を手打ちしたら表示できた(きっともっと簡単な方法があるのだろうけど)
画像ファイルを開いてimgタグにしてソースに設定してくれるメニューは絶対にいると思うんだけどなぁ
(コメントで教えてもらった通り画像ファイルのドラッグアンドドロップで簡単にできました。さすが。)
Google様のツールにしてはちょっと使いにくいな…
複数の要素のグループ化ってどうやってやるんだ?

webサイトを作るというよりはアニメーションを作るツールと割り切って考えた方がよさそう

こんな感じ
http://www.welfapp.com/GWDtest/

ラベル:web
posted by one-hand-engineer at 08:39| Comment(2) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする