1月 11 2013

iOS Team Provisioning Profile: * を復活させる方法

iOS Provisioning Portal から iOS Team Provisioning Profile: * を削除してしまった場合、以下の方法で再作成できます。

Xcode の Organizer ウィンドウを開き、ウィンドウ左のペインにリストされているデバイス名を Control-Click します。表示されたポップアップメニューから Add Device to Provisioning Portal を選択します。

あとは Xcode が処理してくれます。
既に Provisioning Portal に登録済みのデバイスに対し、Add Device to Provisioning Portal を行っても問題はないようです。


12月 18 2012

Xcode ビルド設定で利用できる変数の確認

$(SRCROOT) や $(CONFIGURATION) など忘れたときには、
Xcode Build Setting Reference を参照しましょう。

手っ取り早く、

$ xcodebuild -showBuildSettings

で確認できたりもします。


11月 22 2012

NSTimer と UIScrollView

+[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]

で作成したタイマーは、UIScrollView のスクロール中に指定時間が経過しても selector を呼び出してくれません。

この場合は

+[NSTimer timerWithTimeInterval:target:selector:userInfo:repeats:]

でタイマーを作成し、

-[NSRunLoop addTimer:forMode:]

で NSRunLoop にタイマーを追加してください。
このとき forMode には NSRunLoopCommonModes を指定します。


11月 10 2012

symbolicatecrash には .crash と .app.dSYM/ と .app/ が必要

ごくまれに、場合によっては頻繁に、どこか別の環境でビルドされた Ad-Hoc ビルドのクラッシュログを見なければならないことがあります。

うまく symbolicatecrash で結果を得るには以下の手順が必要です。
(Ad-Hoc ビルドした .ipa やそのとき生成された .dSYM は入手済みとして話を進めます)

Xcode 4.5.2 の場合、symbolicatecrash は

/Applications/Xcode.app/Contents/Developer/Platforms/
iPhoneOS.platform/Developer/Library/PrivateFrameworks/
DTDeviceKit.framework/Versions/A/Resources

にあります。パスを通すとか、エイリアスを作成するなどしてください。

$ symbolicatecrash MyApp.crash MyApp.app.dSYM/

とすると、

Error: “DEVELOPER_DIR” is not defined at …以下省略

となるので、

DEVELOPER_DIR を設定してあげます。

$ export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer/"

または

% setenv DEVELOPER_DIR /Applications/Xcode.app/Contents/Developer/

再度、

$ symbolicatecrash MyApp.crash MyApp.app.dSYM/

するとクラッシュログの解析結果が出力されるようになりますが、

2   CoreFoundation              0x34279b70 -[__NSArrayM objectAtIndex:] + 160
3   MyApp                   	0x00175470 0xca000 + 702554

といったように、フレームワークのアドレスはシンボル表示されますが、
アプリのアドレスがシンボル表示されません。

これを解決するには、MyApp.app/ が必要です。

$ unzip MyApp.ipa

とすると、Payload/MyApp.app が取り出せますので、
この状態で、

$ symbolicatecrash MyApp.crash MyApp.app.dSYM/

を行います。すると

2   CoreFoundation               0x34279b70 -[__NSArrayM objectAtIndex:] + 160
3   MyApp                        0x00175470 -[MyApp cogitoergosum] (MyApp.m:664)

のような結果が得られ、当初の目的が果たせます。
解凍した MyApp.app は適当な場所にあっても探してくれるようです。

これが探していた情報だったと言う人は
私が作った iOS アプリの紹介ビデオでも見ていってください。


11月 3 2012

XcodeのOrganizerに現れる不要なTEAMSを削除する方法

キーチェーンアクセスの中にある、不要なTEAMSに属する証明書をすべて削除して、Xcodeを再起動すればOK。


8月 23 2012

iPhone 5 以外の「新しい何か」


5月 8 2012

スタティックライブラリに含まれるコードのアーキテクチャを確認する方法

スタティックライブラリにどのアーキテクチャのコードが含まれているか確認したい場合、
以下のコマンドで確認することができます。

lipo -info libStaticLibrary.a

または

lipo -detailed_info libStaticLibrary.a

スタティックライブラリだけでなく、実行ファイルやダイナミックライブラリを指定することもできます。


3月 23 2012

iOS 開発で使用する証明書、プロビジョニングプロファイルの内容を確認する方法

iOS 開発を行っていて、証明書要求(CertificateSigningRequest.certSigningRequest)を作成することがありますが、この内容が知りたくなった場合、ターミナルで以下のコマンドを実行します。

openssl req -inform pem -in CertificateSigningRequest.certSigningRequest -text

iOS Provisioning Portal から取得した証明書の内容が知りたければ、以下のコマンドを実行します。

openssl x509 -inform der -in distribution_identity.cer -text

他の開発環境へ証明書やプライベートキーを持っていく場合、p12 ファイルを作成し転送しますが、そのファイルの内容が知りたくなったら、以下のコマンドを実行します。
.p12 は通常パスワードをかけてあるはずなので、要求があればパスワードを入力します。

openssl pkcs12 -info -in 証明書.p12

プロビジョニングプロファイルの内容が見たい場合は、以下のコマンドを実行します。
プロビジョニングプロファイルには plist ファイルが埋め込まれています。これは vi コマンドなどでファイルを開くと確認できます。

openssl pkcs7 -inform der -print_certs -in your.mobileprovision -text

3月 14 2012

Mac mini と Apple Wireless Keyboard で Lion 復元機能を呼び出す

Lion の復元機能を呼び出すには、Mac を起動しながら Command + R を押し続ければよいのですが、Mac mini と Apple Wireless Keyboard を使用している場合は、ちょっとだけ注意が必要です。

決してあせらずに、画面がグレーになったら Command + R を押しましょう。早すぎると認識してくれません。


3月 14 2012

iOS プロジェクトで Base64 エンコード/デコードを行う

iOS プロジェクトで Base64 エンコードが必要になったので、取り急ぎ簡単な方法を探しました。
確認は Mac OS X 10.7.3 / Xcode 4.3.1 で行っています。

(1) http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html から NSData_Base64.zip をダウンロードし、解凍します。

(2) NSData_Base64 フォルダ内にある NSData+Base64.h と NSData+Base64.m の2ファイルを開発中のプロジェクトに追加します。

(3) あとはエンコードしたいところで、

// Encode base64
NSData *targetData = ...
NSString *encodedString = [targetData base64EncodedString];

デコードなら、

// Decode base64
NSString *base64String = ...
NSData * decodedData = [NSData dataFromBase64String:base64String];

といった具合に使用します。NSData+Base64.h のインポートを忘れないようにしましょう。

OpenSSL を使っても Base64 エンコーディングできるようですが、OpenSSL 関連のライブラリは iOS に含まれていないので、今回その方法は採用しませんでした。
ここ http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html には OpenSSL を使用した方法も説明されているので、興味のある方はどうぞ。

ちなみに、-base64EncodedString を使用した場合、64文字ごとに改行した Base64 文字列が生成されます。このとき使用される改行コードは CR+LF です。改行して欲しくないとか、80文字ごとで改行して欲しいなどの要求がある場合は、ソースを少しだけ調整すれば対応可能なようですので、ソースを一読されることをお勧めします。