アプリを開発してた時 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