ラベル iOS6 の投稿を表示しています。 すべての投稿を表示
ラベル iOS6 の投稿を表示しています。 すべての投稿を表示

2013年7月9日火曜日

古いアプリをiOS6対応にしたらupside downにならない件を解決

■症状■

古いプロジェクトをiOS 6対応にしたら、portrait upside downにならない。NotificationでOrientationが変わったことは検出できるけど、Viewが回転しないので横向きになったまま。

iOS6のデフォルトではiPhoneではupside down以外が許可、iPadでは全方向が許可されていますので、それがそのまま効いていて変更できていない、ということになります。


■一般的な対策■

iOS 6ではshouldAutorotateToInterfaceOrientationが廃止になったので、対象ViewControllerでsupportedInterfaceOrientationsとshouldAutorotateを使う。


- (BOOL)shouldAutorotate {
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}

iOS 6対応として最初から作ったプロジェクトはこれで動きます。しかし、viewやらcontrollerをいろいろいじっている古くからのプロジェクトはこれではダメでした。

個人的困ったのはSalesforce対応アプリです。Salesforce mobile SDK for iOSの最新版ver 1.5でも未だにStoryboardやARCに対応していないので、中身は結構古いまま。テンプレートからiOS 6 targetにしても、upside downは働いてくれません。

その一方で…iOS 5をターゲットにすると、Web ViewのログインでID入力欄をタップしただけでSIGABRTするのは私だけでしょうか?


■原因■

root view controllerが別にあるためview controller上で上記shouldAutorotate / suportedInterfaceOrientationsをいじったとしても、標準のUINavigationController等で上書きされてしまう。


■解決策■

私のプロジェクトでは、Storyboard上のUINavigationControllerからメインviewを呼び出していましたので、UINavigationControllerのサブクラスNavigationControllerを作り、上記shouldAutorotate / supportedInterfaceOrientationsを貼ります。その上で、Storyboard上のnavigation controllerのcustom classをNavigationControllerに変更します。これでうまく行きました。いやはや。



■Salesforce mobile SDK for iOSの場合■

上記Salesforce mobile SDKの場合、テンプレートから作成されるプロジェクトはAppDelegate.hのnewRootViewControllerでViewとUINavigationControllerを生成しています。

上記と同じ手順でUINavigationControllerのサブクラスNavigationControllerを作り、AppDelegate.mにインクルードしてから、newRootViewControllerを書き換えます(書き換え箇所は赤字)。


- (UIViewController*)newRootViewController {
    RootViewController *rootVC = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    NavigationController *navVC = [[NavigationController alloc] initWithRootViewController:rootVC];
    [rootVC release];
    
    return navVC;
}



2013年7月8日月曜日

Salesforce mobile SDK for iOS 1.5

五十肩とか自転車レースとか転倒等によりすっかりご無沙汰してしまいました。今日はSalesforce mobile SDK for iOS 1.5のお話。

■感想:速い…?■

1.3当時は更新がうまいこと反映されないなどの問題があったので切っていたのですが、今回試してみたら起動がヤケに速い。記事によるとデフォルトでonになったとのこと。せっかくなので試してみたら、以前の問題は解消していて、これならキャッシュとして十分機能していると判断し、今回からONにしました。

Authentificateも早くなったような気がします。私のアホなアプリ「FourChatter」はあまり処理らしい処理をしていないのに(いないからこそ?)、2回目以降の起動時間が1/4ぐらいになりました。

■問題点■

ご存知の通り、iOS 6でOrientationの仕様が大きく変わっています。そのせいかどうか、SDKから作ったテンプレートアプリのinfo.plist上でPortrait Upside Downに設定しても、upside downになってくれません。他の方向へは問題なくrotateしますし、UIDeviceOrientationDidChangeNotificationでnotificationを受けるとちゃんと「upside downになるで」と通知が来ますが、表示は横を向いたままです。

追記:解決しました→古いアプリをiOS6対応にしたらupside downにならない件を解決

SFNativeRestAppDelegate.mを見ると「iOS 6になったらこの書き方はダメ」って書いてある書き方が多々あるけど、うーむ…。

かといってiOS 5でビルドするとSalesforceへのログイン画面に触っただけで落ちるし…困ったもんだ。

■そこに別の問題が■

アップデートしたアプリをAppleへ送付しようとしたのですが、失敗しました。Validate...は成功しますが、Distributeでエラーが…。


ググるとJVM関連のトラブルのようで、JDK 6が立ち上がるようにすれば良いという解決策などが出ているのですが、ダメでした…。この件、アップルに問い合わせメールを送って対応待ちです。いやはや。

2013年2月21日木曜日

iOS 6にすると起動しない

サマリー

  • 現象:起動しない
  • 調査
  • 解決策1:エミュレータを削除
  • 解決策2:デバッガを変更

夏休みの宿題は8月下旬に始める子供だった私は、例によってリリース直前になって「そういえばiOS 6で試してなかった」ということに気づいて慌てるのだった(完)。



■現象:起動しない■

Xcode 4.5上でiOS 5.1用に作っていたアプリをiOS 6で起動しようとしたら、エミュレータが起動した直後、スプラッシュも出ないうちにアプリが即死します。デバッグコンソールすら出てくれません。

■調査■

XcodeのView->Debug Area->Activate Consoleでログを見るとそこには
    error: failed to attach to process ID 0
というエラーメッセージが出ていました。これをそのままGoogle先生で検索すると、日本語のページと、困った時のStackoverflowさんが2件。経験上、Stackoverflowさんを先に見ます。

■解決策1:エミュレータを削除■

まずその1(「error: failed to attach to process ID 0」)。結果的にはこれが大正解でした。

iOSシミュレータを終了してから、
  • ホーム下のLibrary/Application Support/iPhone Simurator/<対象バージョン>/Applications内の中にあるファイルを全て削除
これだけです。

なお、それ以前にiOSシミュレータの「コンテンツと設定をリセット...」も試したのですが、は効きませんでした。というかリセットしたり言語設定を切り替えるとそのままハングすることがあったのですが、削除してからは問題なしです。

■解決策2:デバッガを変更■

次がこれ(「Failed to Attach to Process ID Xcode」)。デバッガをLLDBからGDBに変更します。
  • XcodeのProduct->Edit Scheme
  • スキーマ編集画面で左側のバーから「Run YourApp.app Debug」を選択し、右側の「Info」タブを選ぶ
  • DebuggerをGDBに切り替える
  • Product->Clean

これでもまだアプリが立ち上がらない場合には、さっきのDebugger選択画面でLaunchを「Wait for YourApp.app to launch」に切り替えて、エミュレータ上でアプリのアイコンをタップしてみてください。それでもダメならDebugger=None。

ただ、一度起動するとLLDBに戻してもうまくいくという報告もあるので(「[Objective-C]iOSシミュレータでのデバッグができなくなった」)、iOSシミュレータでバージョンを切り替えたりした時にエミュレータの設定がおかしくなったのが原因ではないかなと思っています。

これでもうまく行かない場合は、対象アーキテクチャからarm7sを外す(「iPhone 5からはarmv7sアーキテクチャ」)というのもあるようです。特に外部のライブラリがarm7s非対応の場合はこれしかありません。私は先にこっちを試したのですが、変化ありませんでした。