xpwnのdmgでDecrypt

以前書いたvfdecryptを使うとiOS 6.0からはバグったdmgファイルしか生成できなくなりました。代替としてxpwnのdmgを使う事で正常にDecryptできます。

Xpwnからdmgをビルドする

xpwnのコードからビルドします。

git clone git://github.com/planetbeing/xpwn.git
cd xpwn
mkdir build
cd build
cmake ..
make dmg-bin

warningが出ますが、dmgはコンパイルできてます。dmg/dmgがそれです。/usr/local/bin/にでも入れときましょう。

dmgでDecrypt

dmg extract XXX-XXXX-XXX.dmg output.dmg -k <key>

アプリのスタートアップ機能を搭載したInfinityTask v1.4

InfinityTaskの1.4をリリースしました。1.4では実験的な機能としてアプリのスタートアップを登録できる機能を追加しました。 「Startup Applications」の項目でアプリをオンにするとRespring後に自動でそのアプリが起動します。 SafariとChromeではこの起動時にOpenTabBackground++が動作するようにしました。

この起動は電話やメールと同様のサイレントな起動をしますので、通常のアプリ起動シーケンスとは異なる起動シーケンスになります。 このためアプリ側の各種初期化を行うメソッドの実装によっては望みの状態まで起動されない事もあります。(特にゲーム系はスタート画面まで行かない事が多いです)

本機能の主眼であるSafari, Chromeにおいては起動されてOTB++が動作する事を確認済みです。

iPadかどうか判別する

[[UIDevice currentDevice] isWildcat]
でもいいんですが、無駄にPrivate API使うのも危険なので(とは言えAppleのコードではかなり使われているのでこれの仕様が変わったり無くなったりする事はほぼ無いんじゃないかとは思いますが)、最近良く見かける下記のやり方の方が良さそう。
static BOOL IsPad(void)
{
    return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
}

これも安心のiOS 3.2+

画面が縦なのか横なのかを判別する

これまで色々なメソッド使ってみたりしましたが、これ以上ない正解に辿りついたのでメモ。

static BOOL IsLandscape(void)
{
    return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}

ちなみにステータスバーが非表示でも大丈夫みたいです。
Available in iOS 2.0 or higherの安心設計。

resizableImageWithCapInsets:(UIEdgeInsets)capInsets でちょっとハマった話

Capの左右(上下)の合計を画像の幅(高さ)と同じにした時のバグ(iOS 5)

ボタン用の下のような画像を背景に使った時にこんなコードを書いてハマったケース。

[button setBackgroundImage:[bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(20.0f, 22.0f, 20.0f, 22.0f)] forState:UIControlStateNormal];
こう書くとiOS 6ではうまくいくのだけど、iOS 5では通常時は普通の表示だけどボタンを押下すると何か欠ける。

これは元画像の幅44pxに対してUIEdgeInsetsMakeのleftとrightの合計が44pxで同一になっているのが原因だ。左右端が表示されているのは画像の高さが47pxでtop+bottomは40だからだろう。ちなみに同一になるように書いてもiOS 6では丁度境界の1pxを引き伸ばしているのか、いい具合に表示された。丁度にする必要はないので若干数値を減らせばOKだ。
[button setBackgroundImage:[bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f)] forState:UIControlStateNormal];

Capの左右(上下)で片方だけ0指定した時のバグ(iOS 5)

先ほどの画像のUIActivityViewController呼び出し時みたいなViewの背景に指定している画像は右のような1x44の画像で、これをリサイズさせて背景に指定しているが、上の方にしか適応されていない。コードはこんな感じだ。
_backgroundImageView.image = [bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(43.0f, 0, 0, 0)];
これはCap-topを43にして残りの下1pxを伸ばしてくれると思って書いたコードだ。これの原因はtopに1以上の値を指定したがbottomは0を指定しているためだ。どうやら左右(上下)の数値の組み合わせは0,0の組み合わせでなければ1以上を指定して引き伸ばす範囲を明確にしないとダメらしい。ちなみにこれもiOS 6ではイイカンジに引き伸ばして表示された。解決の為には1以上を指定すればいいので、引き伸ばすピクセルが一番下の1pxではなく下から2px目になってしまうが、以下のようにすれば良い。
_backgroundImageView.image = [bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(42.0f, 0, 1.0f, 0)];

これでiOS 5でもちゃんと引き伸ばされる。