XcodeのArchivingでハングアップ

Xcode 5.0.2で公開用のアーカイブを作成しようと、Product => Archiveと進んだのですが、Archiveの途中で止まってしまいます。

マシンを再起動しても

Compiling 27 of 28 source files …

の表示のまま進行がストップしてしまいます。Xcodeのメニューはプルダウンされるのですが、終了を選択しても何も起こりません。

デバッグモードならシミュレータや実機で動作するので、Archiveの際の何かが原因のようです。

ネットで検索してみるとstackoverflowに、LLVMのオプティマイズのレベルの違いで同様の事が起こるという記事がありました。この記事ではバージョンが異なりますがコンパイラのバグのようです。私の場合はどうなんでしょうか。

ともかくビルドさせるために、XcodeのApple LLVM 5.0 – Code Generation項目を変更してみることにしました。

デフォルトのリリース用設定は「Fastest, Smallest [-Os]」ですが、デバッグ用は「None [-O0]」になっています。

スクリーンショット 2013-12-12 20.41.00

そこで、リリース用もデバッグ用と同じ設定でビルドすることにしました。

スクリーンショット 2013-12-12 20.38.59

これで無事Archiveは作成できたのですが、本当のところはこの対応で良いのか分かりません。記事のようにどこかを修正すると回避できるのかもしれません。

Provisioning profileに別の実機を加える

たまにしか使わない機種を接続してXcodeからRunしてみると

A valid provisioning profile for this executable was not found

が表示されて実行できません。このメッセージは前にも出会ったことがあり、どう解決したのか覚えたいません。解決していないのかもしれません。

provisionin profile関係は試行錯誤しているうちに解決してしまうことが多いのですが、今回の原因はprovisioning profileに接続したハードウェアが登録されていないのが原因だったので、追加したprovisionin profileを作りました。

iOS Dev CenterにSign inして、Certiticates, Identifiers & Profiles
、iOS AppsのCertificatesのProvisioning Profilesから、ハードウェアを追加するprofilesを選んでEditします。

Devices:の中から必要なデバイスにチェックをしてGenerateしました。

これをダウンドードして、ダブルクリックでインストールしたのですが、ここを見るとちょっと配慮が必要だったようです。

私の場合は、Xcodeで見ると妙なprofileに設定されてしまったので、手動で元のprofile名に直して無事Runできるようになりました。

iOSシミュレータの保存ディレクトリを表示する

iOSシミュレータを使っていてどこにデータが保存されてしまうのか、よく忘れてしまいます。その都度適当にgoogleで調べたりしていたのですが、メモしておくことにしました。國居貴浩著『iPhoneアプリ開発のコツとツボ35』に載っています。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                    NSUserDomainMask, YES);
NSString *documentsDirectory =
[paths objectAtIndex:0];
NSLog(@"dir=%@", documentsDirectory); 

Xcodeの補完のままに「NSDocumentationDirectory」としてしまい、アレっということがありました。ちゃんと確認しないとダメですね。

Objective-Cで簡単な正規表現を使う

Objective-Cで正規表現を使うのrubyなどに比べてちょっと面倒ですが、単純なものなら簡単に処理できるようです。

文字列「あいう(えお)」からカッコ前と、カッコの中を取り出す
正規表現/(.+)\s*((.+))/だとすると、必要な文字列は

@"(.+)\\s*\\((.+)\\)";

になります。バックスペースは「\」となります。あとはパターンに当てはめてば良いだけでした。


NSString *regexpStr = @"(.+)\\s*\\((.+)\\)";
NSRegularExpression *regexp 
= [NSRegularExpression regularExpressionWithPattern:regexpStr options:0 error:nil];
NSTextCheckingResult *match 
= [regexp firstMatchInString:itemStr options:0 range:NSMakeRange(0, str.length)];
if (match.numberOfRanges) {    // マッチした全体    
    NSString *str0 = [itemStr substringWithRange:[match rangeAtIndex:0]]; // 最初のカッコの中
    NSString *str1 = [itemStr substringWithRange:[match rangeAtIndex:1]]; // 2番目のカッコ の中
    NSString *str2 = [itemStr substringWithRange:[match rangeAtIndex:2]];  
    ...

ビューコントローラを呼びだして透明にする(modalview)

ビューコントローラを呼びだして透明にするのは、こんな方法でいいらしい。

UIStoryboard *storyboard = 
[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
NewViewController *vc = 
[storyboard instantiateViewControllerWithIdentifier:@"newVc"];

vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:newVC animated:NO completion:nil];

iOSアプリ「StampFrame」

IMG_0401

iOSのアプリをリリースしました。(使い方はblog.bicam.com)

拡大・縮小しても切手のギザギザ(パーフォレーションとい言うそうです)が変わらないようになっています。

IMG_0399      IMG_0400

そのかわりにギザギザの数が変化するようにしました。単純にUIGesturePinchRecognizerで拡大するとギザギザも変化してしまうので、そのつどboundsのサイズを修正しています。