2012年10月30日火曜日

LandscapeのiPhoneアプリがiOS6のiPadで動かない。その3

本件,Apple Developer Technical Supportに問い合わせしました。


回答:
After looking over the sample, I have concluded that this behavior is a bug.  
Until the application is resized to 2x, all touch events are mistakenly being routed to UIStatusBarAdornmentWindow, a hidden class that is part of the windowing machinery.


バグであると結論されたとのこと。そのままBug Reportに届けてくれとのことなので,そちらに登録しました。

また返答がきしだい更新します。

LandscapeのiPhoneアプリがiOS6のiPadで動かない。
LandscapeのiPhoneアプリがiOS6のiPadで動かない。その2


2013/2/23 追記
上記、まだ返事が来ていませんが、別の対処法を見つけました。


プロジェクトナビゲータのプロジェクト名
TARGETのプロジェクト名
Status BarVisibility
Hide during application launchのチェックを入れる


これで動くようになりました。

2012年10月26日金曜日

LandscapeのiPhoneアプリがiOS6のiPadで動かない。その2

昨日の件,暫定的にでもなんとかできないか考えました。

とりあえず,アプリ開始後の1View目が通ればいけるはずと思い,
最初に表示されるViewの前にひとつ余分にViewをかませてみました。

流れとしてはこんな感じです。
アプリ起動→余分なView(Portrait)→最初のView(Landscape)

余分なViewのViewControllerを継承し,viewDidAppearメソッドのなかで最初のViewを呼び出す感じです。

これにより,アプリ起動時はportraitで起動し,"最初のView"に移った段階でlandscapeに変更されます。

結果としては,正しく反応するようになりました。

ただシミュレータで動かしてみると起動直後にViewが縦と横に遷移しているのがわかり,
見苦しいです。

もっとスマートな方法があるといいのですが・・・。
一応つたない英語でAppleにも問い合わせのメールを送っているので,
良い返事がきたらここに記載します。


10/30 返答が来ました。

2012年10月25日木曜日

LandscapeのiPhoneアプリがiOS6のiPadで動かない。

完全に詰まりました。

今朝あるiPhoneのアプリをリジェクトされました。
テストの結果,最初の画面で全く反応しないことがあるとのこと。

そんなはずは・・・と思いながら,テストの内容にiOS6のiPadが入っていたので,
そういえばこの環境は試していなかったと思い動かしてみると,
確かに全く反応しませんでした。

条件を確かめたところ,
・このアプリを含め,Landscape(横長)表示のアプリで起こる
・iOS6のiPadシミュレータでのみ再現
・iOS6のiPhone,iOS5のiPadでは正常に動く
iOS6のiPadでも,一度x2を押してスクリーンサイズを変えると動く
 (しかもそのあとx1を押して元に戻しても動く)
・アプリをテスト用にportrait設定にすると正常に反応する

環境
・Xcode 4.5.1
・Deployment Target 5.1

一応対応するビューコントローラーには以下のコードを書いています。


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

-(BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
 return UIInterfaceOrientationMaskLandscapeRight;
}



ここから仮説ですが,問題の環境ではボタン等Viewの座標が取得できていないのでは・・・。
x2とかで再度デバイスが座標を計算した結果動くようになったみたいな・・・。

どなたか解決法をご存知でしたらコメント頂けないでしょうか。

10/26追記 暫定対策

2012年10月22日月曜日

エラー: dyld: Library not loaded:  Reason: image not found


AdMob6.2.1に更新している途中で一件エラーが発生しました。

dyld: Library not loaded: /System/Library/Frameworks/AdSupport.framework/AdSupport
  Referenced from: /Users/tanabeyasushi/Library/Application Support/iPhone Simulator/5.1/Applications/(アプリ名)
  Reason: image not found

iPhone 5.1 simulaterで発生。6.0では発生せず。

5.1でAdSupport.frameworkをいれておくと上記エラーになるようです。
対処法としては,このフレームワークをrequiredではなくoptionalにしておけば回避できます。

プロジェクト選択

TARGETSのプロジェクト名

Build Phases

Link Binary with Libraries
AdSupprt.frameworkのRequiredをOptionalに変更

以上です。

2012年10月21日日曜日

AdMob 6.2.1へ更新時のエラー

先日AdMobからメールが届き,バージョン6.2.1でiOS6に対応したのでアップデートしといてとのことだったので,今日試しに一つやってみました。

とりあえず何も考えずに以下のファイルを更新。

GADAdMobExtras.h
GADAdNetworkExtras.h
GADAdSize.h
GADBannerView.h
GADBannerViewDelegate.h
GADInterstitial.h
GADInterstitialDelegate.h
GADRequest.h
GADRequestError.h
libGoogleAdMobAds.a

そして実行!
エラー!


Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_ASIdentifierManager", referenced from:
      objc-class-ref in libGoogleAdMobAds.a(GADIdentifierUtilities.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

まあ,すんなり一発でいくとは思っていなかったので。

いろいろ検索して,最終的には解決法というかAdMobの公式ドキュメントに,
"AdSupport.framework"を追加しておけとの記述がありました。

ということで,プロジェクトのTARGETS→Linked Frameworks and Librariesに上記を追加。

これまでは動いていたので,今まで使用していたバージョンではこのフレームキットは必要なかったと思われます。

これですんなり動きました。

他のも暇があったら全部アップデートしとこうかなと思います。

2012年10月20日土曜日

FMDatabaseで最後にインサートしたレコードの_id取得

iOSでもAndroidでも,データベースはsqliteを使っています。
sqliteは小中規模のデータベース管理ソフトで,主にサーバではなくアプリケーションに組み込む形で使われています。

iPhoneではさらにラッパーとしてFMDatabaseを使用しています。
iOSのsqliteのライブラリはC言語のライブラリで提供されているようで,開発上,文法や型変換がネックになりかねません。
そこを吸収してくれるのがFMDatabaseです。

前置きはこれくらいで,今回は最後にテーブルに書き込んだレコードのidの値を取得する方法を記録しておきます。

FMDatabase *db = [self getDB];
int lastInsertId;
if([db executeUpdate:@"INSERT INTO TABLE1(RECORD1) VALUES(?)", record1]){
        lastInsertId = [db lastInsertRowId];
    }
    else{// 登録に失敗した場合
        NSLog(@"ERROR: %d: %@", [db lastErrorCode], [db lastErrorMessage]);
        [db close];
        return NO;
    }
}
[db close];

*getDBはファイルパスとか指定してdatabaseオブジェクトを取得するメソッドです。

上記のようにしてインサート直後にlastInsertRowIdメソッドでそのレコードのidを取得できます。

気をつけなければならないのは,[db close]後はもう取得できないということです。
後々に使用するのであれば,変数に値をコピーしておく必要があります。

ちなみにsqliteでは,たいていテーブルに_id列という一意の値が入る列を作成します。
上記で取得される値はこの_id列の値と同じです。

今日はこのあたりで。

2012年10月17日水曜日

ブログ表示回数+アプリダウンロード数1000件突破!

おかげさまで一昨日くらいに本ブログの表示回数が1000回を突破してました。

暇つぶしの名前の通り,気付いたこと,まとめておきたいことを暇なときに書いているだけにも関わらず,ご覧になって下さいました皆様,ありがとうございます。

そして,先ほど確認したところ,私が開発したiPhoneアプリの合計ダウンロード数も1000件を突破していました。

内訳は下記の通りです。
・Binary Calculation (9/4〜) 83ダウンロード
・HexadecimalCalculation (10/1〜) 130ダウンロード
・MahjongPoker (10/2〜)   605ダウンロード
・SortSort (10/14〜)  426ダウンロード
(10/17時点)

ダウンロードしていただいた皆様,ありがとうございます。

目標は高く,いつか百万ダウンロードされるアプリをつくれるよう日々頑張ります!

今後もよろしくお願いします。

StoryBoardの警告:Segues initiated directly from ...

現バージョンのXcodeで古いプロジェクトを開いたところ,StoryBoardに下記警告が出ていた。

MainStoryboard.storyboard: warning: Unsupported Configuration: Segues initiated directly from view controllers must have an identifier for use with -[UIViewController performSegueWithIdentifier:sender:]

問題の箇所は,ボタンとかからではなくView Controller(viewの下にあるアイコン)から直接次のビューへsegueをつないでいた箇所で,この場合はsegueにidentifierをつけろとのこと。

対処法は上記の通りで,該当segue(矢印)をクリックし,Attributes inspecterでこのsegueのidentifierを登録する。


ちなみにsegueに登録したidentifierは,画面遷移時に遷移元のView Controllerから遷移先のView Controllerに値を渡す処理とかでそのsegueを特定するのに使ったりする。

2012年10月14日日曜日

App Review Informationの編集結果

3日前,追加されていたApp Review Informationの項目を記入したが,本日その時waiting for review状態だったアプリが無事リリースされた。

どうやら,既にwaiting for review状態で該当個所を編集しても,レビュー待ち時間が延長されることはないようだ。

上記項目を編集すべきか迷っている方,編集しても特に問題ないようです。



あと,日曜日(向こう時間土曜日)でもレビューしていることを初めて知りました。

2012年10月11日木曜日

iTunes ConnectのApp Review Information

iTunes Connectで,Appleの審査待ちのアプリの状態を確認したところ,
ステータスはwaing for reviewのままだが,詳細編集画面が知らない間にエラー状態になっていた。

エラー内容を見ると,App Review項目を埋めて下さいと言う内容で,
実際にApp Review Informationという欄が空欄になっていた。
この項目,確か数日前までは存在していなかったと思う。

今のところApple Developer等からメールで連絡が来た形跡はない。

今ここを編集した場合,レビュー待ち時間がリセットされてしまうのか,
編集しなかった場合,レビュー対象から外れてしまうのか,
どちらにせよ不安にかられたが,結局今レビュー待ちになっている全appで上記項目を記入した。

項目は下記の通り
・First Name
・Last Name
・Email Address
・Phone Number
 *+081から
以下は必須ではないので未記入
・Review Notes
・Demo Account Information

レビュー待ち期間が延長にならないことを祈るばかりである。

10/14 追記:
レビュー待ち時間がリセットされることはないようです。

2012年10月6日土曜日

Xcode 4.5 + AdMobでエラー

Xcodeを4.5にアップデートして,AdMobを使用している既存のプロジェクトを開き,
iOSデバイス(実機やArchive)でRunすると,下記のエラーが発生しました。


ld: file is universal (3 slices) but does not contain a(n) armv7s slice: (workspace location)/(app-name)/libGoogleAdMobAds.a for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)



暫定的な対処方を記録しておきます。

Project Navigatorのプロジェクトをクリック
→「PROJECT」の下のプロジェクト名をクリック
→「Build Setting」タブを開く
→Valid Architecture からarmv7sを取り除き,armv7のみにする。

一応上記の方法で回避できました。
当然ながらarmv7sを取り除くことにより,他の機能に影響が出る場合はこの方法は使えません。
自分の環境では特に削除しても問題なさそうだったので,これでいこうと思います。

2012年10月1日月曜日

AppleからRejectされたアプリ

Appleから2回連続でRejectされたアプリがあり,
レビューによるとボタンが反応せず,まったく操作できないとのことでした。

こちらでは不具合を再現できず,どうしたものかと思っていたところ、
ふとXcodeをアップデートして,最新のiOS6(iPhone5にのっているもの)の
iPhoneシミュレータで起動したところ,再現されました。

最初のリジェクトされたときは1ヶ月前で,まだiPhone5発売前だったにも関わらず,
向こうのかたはそのデバイスでテストをしていたみたいです。

テスト環境を添えてくれるとかしてくれると助かったのですが・・・。

他にもRejectされて原因がよくわからない方,iOS5向けで開発されている方はお気をつけください。