Objective-C
iOS
バグ

iOS開発時 見逃しちゃった 細かいバグ集

アプリを開発してた時 or 他の人が開発しているアプリを見た時に、ぼけっとしていると見逃してしまいそうなiOS開発特有の細かいバグをピックアップしました。
今後の教訓として、活用していこうと思います。

UITextField/UITextView

入力制限を実装した時

TextFieldの入力制限をdelegateで行った時に、外部キーボードから入力制限をした文字列が入力できてしまい、バグになった。
さらに、入力制限を行った->バリデーションが要らないということで、バリデーション処理を行っていなかったので、被害が拡大した。

ViewController以下のような外部キーボード無効化処理を入れると防げた。
そもそも、TextFieldの入力制限を完全に行うのは手間がかかるので、バリデーションをしっかりやったほうがいいと反省しました。

// BackKeyを無効化
- (NSArray *)keyCommands {
    return @[[UIKeyCommand keyCommandWithInput:@"\b" modifierFlags:0 action:@selector(description)]];
}

GPS(CoreLocation)

バッテリー周り

不用意にGPSを最高精度にしたため、バッテリーの減る速度が早くなった。

CLLocationManager *locationManager = [CLLocationManager new];
locationManager.desiredAccuracy = kCLLocationAccuracyBest; //不必要に精度を高くしない

WebView

ネットワーク エラー表示

Webページの読み込み失敗時にアラートを表示する仕様があるときに、
ページが表示しきる前に、次のページに遷移すると読み込み失敗時にアラートが表示されるバグが発生した。

次のページに遷移する時に、現在表示中のページ読み込みが読み込み失敗(=キャンセル)扱いになるので、エラーコードにNSURLErrorCancelledが指定されていた時は、無視するように実装すると、不必要なエラーアラートが表示されなくなった。

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    if ([error code] != NSURLErrorCancelled) {
        //エラー処理
    }
}

Photos.frameworkで画像取得/表示

iCloud上のみにある画像の拡大表示

PHImageを使用して、iCloudで管理されている画像を表示する時、

  • サムネイル : 端末内
  • オリジナル画像 : iCloudのみ

の条件を満たす画像が、大きいサイズを指定した時に表示されないバグが発生した。
テストの時は、

  • iCloudにしかないデータを使用してなかった
  • サムネイルは問題なく表示されていた

ため、バグに気づかなかった。

PHImageRequestOptionsを生成する時に、networkAccessAllowedをYESにすれば、PHImageが勝手にiCloudから取得してきてくれます。

PHImageRequestOptions *requestOptions = [PHImageRequestOptions new];
requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
requestOptions.synchronous = NO;
requestOptions.networkAccessAllowed = YES;

[[PHImageManager defaultManager] requestImageForAsset:asset
                                           targetSize:PHImageManagerMaximumSize
                                          contentMode:PHImageContentModeDefault
                                              options:requestOptions
                                        resultHandler: ^(UIImage *image, NSDictionary *info){
    // 取得したimageを反映
}];

resizeMode・deliveryModeについては、以下のスライドがわかりやすかったです。
https://www.slideshare.net/kanamenoto/photos-vs-assets-library-photosframework