甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

UIWebViewのコンテンツ読み込みメソッドで最近はまったこと

UIWebViewには、表示するコンテンツを読み込むためのメソッドとして、次の3つが用意されている。

  • loadRequest:
  • loadHTMLString:baseURL:
  • loadData:MIMEType:textEncodingName:baseURL:

これらのメソッドはコンテンツ読み込みを行うという点では同じだけれど、メソッドに渡す引数の形式が異なるし、挙動が異なる部分もある。Class Reference等に記載がなく、違いに気がつくまでに時間がかかり少々苦労したこともあったので、ここに情報をまとめておく。

続きを読む

iOS 7 GUI for Sketchが出ていたことに今日気がついた

かつてSketch*1を購入したときに、iOS AppのUIモック制作に役立つデータをいくつか集めていた*2のだけれど、その後デザインが全面的に刷新されたiOS 7がリリースされたことにより、これらのモック制作用データが使えなくなってしまった。そのため、Sketchの最近の用途はスクリーンショットの加工が多く、UIモック制作に利用することは全くなくなってしまっていた。

今日、あまり作業時間に余裕がない状況下でスクリーンショットの加工にSketchを使い、改めて操作のしやすさに惚れ惚れした。そういえば、UIモック制作にSketchを使おうと思っていたことがあったな。そろそろiOS 7版のSketchデータが出ているかもしれない。ふとそう思って探してみたら……あった!

ここまでいろいろなパーツが用意されているのは本当にありがたい。公開日は2013年11月7日なので、約4ヶ月間このデータの存在に気がついていなかったことになる。社内でSketchユーザが増えてきているので、Sketchでデザインデータをやりとりすることも検討したい。

estimote beaconsのDeveloper Preview Kitが届いた

estimote beaconsのDeveloper Preview Kitが仕事場に届いた。

パッケージにも書かれているとおり、これはまだFCC/CEの認可を受けていない評価用の開発キットだ。

カバーを外すとメッセージカードが入っていて、宛名とEstimote, IncのCEOであるJakub Krzychのサインの部分が手書きだった。

Developer Preview Kitにはbeaconが3つ入っている。

estimoteのiOSアプリ内で提供されているデモの一部については、estimoteのiOS SDKとともにGitHubソースコードが公開されている。試しにDistanceDemoを少しいじってビルドしてbeaconの認識のされ方を確認してみたら、自席に置いたbeacon3つが部屋を出たくらいのところで1つも認識されなくなった。これを使った勤怠アプリなどを簡単に作ることができそうだ。アイデア次第では広告系でも面白いことができそう。もう少しきちんと使い方を把握しておかなくては。

Camera Overlay Viewを設定するとiOS 7.0以降でアプリが操作不能になる問題への対処方法

少し前の話。UIImagePickerControllerを使った写真撮影機能を実装していたとき、iOS 7未満では何の問題もない次のようなコードをiOS 7.0以降で実行すると、シャッターボタンをタップして写真撮影を行ったぐらいのタイミングで以降のアプリ操作不能になる現象が発生した。

- (void)launchCamera {
    
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        
        UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
        pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
        pickerController.delegate = self;
        UIImage *image = [UIImage imageNamed:@"OverlayImage"];
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        imageView.image = image;
        imageView.contentMode = UIViewContentModeScaleAspectFill;
        imageView.userInteractionEnabled = YES;
        pickerController.cameraOverlayView = imageView;
        
        [self presentViewController:pickerController animated:YES completion:NULL];
    }
}

処理を部分的にコメントアウトしながら挙動を確認して直接の原因と思われる箇所を限定していくと、

pickerController.cameraOverlayView = imageView;

という処理が入っている場合にのみ現象が発生することが明らかになった。そこで、iOS 7におけるCamera Overlay Viewについて情報収集してみたところ、AppleのDeveloper Forumsでこの問題が取りあげられている場所があるのを発見した。(https://devforums.apple.com/message/890325#890325 。閲覧には開発者登録が必要。)

Developer Forumsでの回答を参考にすると、Camera Overlay ViewがpointInside:withEvent:でNOを返すようにすることでこの問題を解決できるようだ。そこで、UIImageViewのサブクラスを作成し、pointInside:withEventを次のようにオーバーライドするようにした。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return NO;
}

このカスタムImage Viewクラスを使ってCamera Overlay Viewを設定したところ、iOS 7.0以降でも写真撮影後に正常に処理を継続することができるようになった。

以下は蛇足というか教訓というか。

UIImageViewPickerControllerのように、クラス自体は古くから存在している場合、これまでのバージョンのOSでは正常動作しているコードでも、新しいバージョンのOSでのみ問題となることがある。そのようなときに、いざ原因特定のための情報収集してみると、クラス名等のキーワードだけでは無関係の情報がヒットしやすく、調査が少々難航してしまう。

新しいOSバージョンでのみ発生する問題について調査する場合、(少なくともiOSOS Xに関する問題については)Developer Forumsは比較的に質の高い情報が得られるのだと実感した。iOS 7はiOS 6までと比べてリリース直後のこのようなちょっとした問題に遭遇することが多いので、意識的にDevelop Forumsを活用していこうと思った。

Appleに交換依頼していたケーブルが届いた

昨日交換依頼を出したケーブルが本日さっそく届いた。かなり対応が早かったので驚いた。運送業者からの受け取り時に破損ケーブルを運送業者に渡す必要があった。*1

届いた新品のケーブルの動作確認。問題があればアップルサービスセンターまで電話連絡する必要があるとのことだが、確認の結果、問題がなかったので今回の手続きはこれで完了となった。

*1:運送業者に旧部品を渡さない限り新部品を受け取れないシステムらしい。

AppleCare登録済iPhone 4Sに付属していたケーブルの交換依頼を出してみた

先日、iPhone 4Sに付属していた30ピン-USBケーブルの皮膜が破れて断線寸前になってしまった。



このiPhone 4SはAppleCareに登録済だったので、Appleのサポートページから交換依頼を出すことにした。

続きを読む

CocoaPods利用時にUnit Testがfile not foundエラーにより実行できない場合の対処方法

CocoaPods利用時にXcodeでCommand+UによりUnit Testを開始しようとしたら、外部ライブラリのヘッダファイルをインポートしているところについて次のようなエラーが出て、テストが開始できなかった。

'....h' file not found

対処方法をまとめておく。*1

*1:CocoaPods: 0.20.2、Xcode: 4.6.3で確認。

続きを読む