2013年6月25日火曜日

UINavigationController内のIUTableViewControllerにタイトル・tintColorが設定できない。

UINavigationController作成して、内部にUITableViewControllerを設定した時に、どれに対して、titleとtintColorの設定をしていいか未だにわからなくなってしまいます。


// UINavigationControllerの初期化
// UITableViewController *_tableViewController; で定義してます。
[self set_tableViewController:[[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]];
[[[self _tableViewController] tableView] setDataSource:self];
[[[self _tableViewController] tableView] setDelegate:self];
[self addChildViewController:[self _tableViewController]];

// この場合のtitle設定はこう
[[self _tableViewController] setTitle:@"プロフィール"];

// tintColor設定はこう
[[[[self _tableViewController] navigationController] navigationBar] setTintColor:[UIColor orangeColor]];


2013年6月17日月曜日

WEBページを取得してHTTPステータスコードを確認する。

APIを利用したアプリ等を作成する場合に、「このAPIが使えたら使うけど、使えなかったらこっちを使いたい」という様な場合があるかと思います。

そんな時に、HTTPのステータスコードが確認できると便利ですね。
以下のコードで確認します。


// リクエスト初期化
NSMutableURLRequest *request = [NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://example.com/api.php"]];
[request setTimeoutInterval:15.0f];
[request setHTTPMethod:@"GET"];

// 実際のリクエスト
NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

// ステータスコード判別
int statusCode = [(NSHTTPURLResponse *)response statusCode];

// もしくは
// int statusCode = [[response valueForKey:@"statusCode"] intValue];

if(statusCode == 404)
{
    // エラー処理など
}

この様にします。
ステータスコードの取り方は上記の様に2パターンありますが、同じデータを指していますので、コーディングスタイルによって使い分けてください。

2013年6月14日金曜日

アプリ申請時にUDIDの件でInvalid Binary となる ... その後解決

先日の記事でアプリにAdMobを組み込んでAppleに申請するとUDID の件で弾かれると書いたかと思います。
http://startup-objc.blogspot.jp/2013/05/udidinvalid-binary.html

これが、AdMobライブラリに非があるのか、Appleの検査モジュールが誤検知したのかわかりませんが、広告を非表示にするという事でアップしました。
(元々広告収入を目的とするアプリでは無かったため。)



今回、アプリを更新する事案がありましたので、再度広告表示に挑戦しました。

一番の疑わしきはAdMob。
ライブラリのページを見てみると。。。
https://developers.google.com/mobile-ads-sdk/download











バージョン上がってるやないかい!
前回は6.4.1だったのが6.4.2、やっぱりこれか・・・


新しいのをダウンロード&展開して、組み込み!
クリーン&アーカイブしてアップ!



























だめか・・・



こういう時はstackoverflowに助けを求める
http://stackoverflow.com/questions/16409966/app-rejected-but-i-dont-use-udid

ibGoogleAnalytics_debug.a が含まれていて、悪さをしているとの事。
罠かよ・・・

ターミナルで以下を実行して、バイナリ内で利用している箇所を探せとあったので、実行してみたところ。
find . | grep -v .svn  | grep "\.a" | grep -v "\.app" | xargs grep uniqueIdentifier


























確かにある。これだな。削除。


再度、クリーン&アーカイブしてアップ!



























だめだな・・・


もしかしてと思いプロジェクトファイルを開く。エディタで。










思った通りや・・・

ライブラリ更新の度にディレクトリ作って追加していったから、
検索パスがその度に増えていました・・・

プロジェクトファイルからの直削除はこわかったので、
xcodeから削除。
















※画像は勢い余って消してしまった後のものです。


再度、クリーン&アーカイブしてアップ!

。。。成功やー!



結局、何が原因かというと、検索パス内に以前のライブラリへのパスが残っていた事が原因。
xcode内で、視覚的にファイルを消したとしても、検索パスには残る。
再度、別のファイルを追加してバージョンアップしている風にはxcode上は見えるんだけど、実際には「検索パスが新たに追加される」ことと「ファイル名単位のファイルパス」が追加されるようです。

そのため、検索パスの最初にあるAdmobの6.2.1の「同名ファイル」が選択されてAppleに弾かれていた模様。。。

もちろん、ibGoogleAnalytics_debug.aのファイルを消した事も影響しているかも知れないけど、検証しなおす余力がありません。

最終的なまとめとしては、検索パスをチェック。


なお、こういう目に遭うのは、ライブラリをバージョン別に分けて管理したがる僕みたいなタイプの人間で、ライブラリを上書き更新かけるタイプの方は、問題ない模様。
(twitterとか見たけど、みんな普通に出来ているしね。。。)


2013年6月11日火曜日

WWDC2013にてMac OS X 10.9発表

iOS7 に続き Mac OS X 10.9 も発表になった模様です。

ガジェット速報

正直なところ大きく変ったところはあまり無く、基本的にはスペックアップ版と考えて良いのではないでしょうか?

気になるのは今回のコードネームが「Mavericks」ということ、「もうネコ科の動物がいなくなってしまった」との事ですが、結構いるんじゃないのネコ科。
正直、雪豹ってメジャーな動物じゃなかったよね。そういうのいっぱいいるんじゃないの?
(分かりません、ごめんなさい。)

私は、今のところ時期xcodeの動作条件が10.9になるまで待つつもりでおります。

WWDC2013にてiOS7発表

iTMedia
http://www.itmedia.co.jp/mobile/articles/1306/11/news039.html


いくつかのサイトで説明がされていますが、新機能を一応紹介しておきます。

コントロールセンター

機内モードや、Wi-Fi設定、Bluetoothの設定が簡単に出来るショートカットの様なもので、Androidではよくウィジットとして表示されているようなものです。
この機能が欲しくて脱獄している人もいるくらいなので、待望の機能といえるでしょう。


マルチタスク

一番の衝撃はこの機能です。
今まで利用中のアプリがバックグラウンドタスクに移行した際には、最大10分間しか動作できませんでした。
みんなあの手この手でその10分間を延ばし延ばし頑張ってみたり、チューニングを必死にやったりしていましたが、その必要がなくなりそうです。

仕様はまだ詳しくは分かりませんが、「制限のないバックグラウンド音楽プレイヤー」なども作れるかもしれませんし、「youtudeの作業用動画を音声だけ聞く形での音楽プレイヤー」ということも出来るかもしれません。

また、アプリ開発者がアプリ内でのバッチ処理のチューニングを怠ったり、大きなリソースを握ったままバックグラウンド側にいく事によるリソース不足が懸念されます。

バックグラウンドでの連続動作が許されるということは、ようはサーバーとして動作することが可能になるということと同意だと思いますので、やろうと思えば結構悪いことが出来ます。
Appleにはアプリの精査をより一層厳しく行っていただきたいと思います。
※幾分か妄想が含まれております。


Air Drop

これは、すでにMACに搭載されている機能ですが、端末間のファイル共有機能ですね。
今までのiPhoneではなるだけファイルを意識させないような設計をしていたかと思いますが、そのあたりどうなのでしょうか?

「ファイル」の対象となるのはどういったものなのかが気になるところです。
写真、連絡先、カレンダーの予定、safariブックマーク、iBooks内のPDFデータなどが対象になると思います。

単純に考えて、ZIPなどの「再生」出来ないようなファイルは対象外かとも思いますが、
個人的には、端末間のファイル移動に使うUSBの代わりとして、簡単に使えると便利です。



safari

画像は探していただくとお分かりになると思いますが、現在chromeアプリで実装されているレイアウトに非常に似ていますね。
良いと思います。



iTunes Radio

これは、はっきり申しまして何がなんだか分かりません。
というのも、日本では権利の関係で非常に実現の難しい機能だと思います。

全国のラジオ局が協力してradikoを運営しているにも関わらず、地方のユーザが別の地方のラジオ放送を視聴するには至っておりませんから。。。

インターネットラジオ局が新規に立ち上がる、、、音泉のプラットフォームがiTunes Radioに移行される、、、ぐらいがここ数年で実現できる範囲ではないかと思います。



App Storeによるアプリの自動アップデート

これは、アプリ開発者にとっては、ちょっと怖い機能です。
というのも、アプリによっては「今日新バージョンのアプリがアップされたけど、バグ見つかったからみんなアップデートはちょっと待ってね」なんて発表しても後の祭りな訳です。アフターフェスティバル。

iTunes connectで自動アップデートの対象かどうかの設定が有ると良いのですが。。。

また逆に「古いサーバーと通信しているアプリの向け先を新サーバーにしたいからみんな早くアップデートしてくれ!」って時のための強制アップデート通知を送れると嬉しかったりします。



本日より、開発者向けにiOS7のプレビュー版とxcode5が配布されているらしい事で、
早速確認してみましたが、おそらくはいつものごとくサポート無しの、ダウングレード不可だと思いますので、もう少し様子を見ます。

アップデートしましたら、このブログで報告いたします。