i phoneアプリの通信エラー処理
TRANSCRIPT
![Page 1: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/1.jpg)
iPhoneアプリの通信エラー処理id:ninjinkun / @ninjinkun
![Page 2: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/2.jpg)
はじめに
• 年末にiOS Advent Calendarに参加しました
• 25日まで毎日日替わりで記事を書く
• http://atnd.org/events/22792
• http://ninjinkun.hatenablog.com/entry/2011/12/23/224918
![Page 3: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/3.jpg)
はじめに
• 通信エラー処理の設計• ケーススタディ• 実装
![Page 4: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/4.jpg)
通信は失敗する通信エラー処理の設計
• 内蔵IO→だいたい成功するものと思って設計してる
• 容量オーバー、ファイル名重複etc…
• 通信IO→失敗する可能性を考慮して設計する
• iPhoneはモバイルデバイス
• 通信は高い確率で失敗する• 辺境、トンネル、etc…
• 異常系ではなく正常系の一部として捉える
![Page 5: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/5.jpg)
理想的なエラー処理通信エラー処理の設計
• 偉い人曰く…
エラーメッセージボックスは、プログラムがバカなので処理を停止するといっているようなものであり、避けなければならない
エラーメッセージには、究極のアイロニーがある。ユーザーがエラーを犯すのを防いではくれないのだ。
![Page 6: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/6.jpg)
理想的なエラー処理通信エラー処理の設計
• 偉い人曰く…
エラーダイアログは、必ず礼儀正しく、わかりやすく問題点を示し、役に立つものでなければならない。
ユーザーに必要な情報を提供した上で、必ず一つは解決策を提示せよ
![Page 7: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/7.jpg)
エラー処理プラン通信エラー処理の設計
松 ユーザーの操作をインタラプトせずにレジュームする
竹 ユーザーの操作をインタラプトしてレジュームする
梅 エラーメッセージを表示するだけ
![Page 8: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/8.jpg)
ケーススタディ
• Path
![Page 9: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/9.jpg)
ケーススタディ
• 失敗してもメッセージボックスに入る• アプリが終了してもバックグラウンドで勝手にレジューム
• OS組み込みだからできること
• ユーザーがエラーを意識しなくても良くなっている• 松プラン
![Page 10: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/10.jpg)
ケーススタディ
• アップロードキューが実装されている• 失敗するとレジュームできる• 複数の写真をレジューム可能• ユーザーが自力でレジュームする作業は必要• 竹プラン
![Page 11: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/11.jpg)
ケーススタディ
• 通信が失敗しても何も言わない• ひどい
![Page 12: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/12.jpg)
Path
ケーススタディ
• 失敗しても成功したように見せている• 後から通信が繋がれば再度送信(自動)• 単なるPOST / GETではなくデータを同期している(?)
• ユーザーにエラーを意識させない• 松プラン• その反面送信が完了していないことには気づかない…
![Page 13: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/13.jpg)
実装
• エラーの表示• UIAlertView
• レジューム処理• UIViewControllerの復元
• キューhttps://github.com/ninjinkun/AlertResume
![Page 14: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/14.jpg)
エラーの表示実装
• UIAlertView
• NSErrorと協調させると便利
• NSAlertViewにはNSErrorを引数に取るコンストラクタが存在していた
• …ですよね?
![Page 15: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/15.jpg)
エラーの表示実装
• NSErrorには表示用のパラメータが揃っている
• 全てuserInfoのデータへのショートカット
• localizedDiscription
• localizedFailureReason
• localizedRecoverySuggestion
• localizedRecoveryOptions
![Page 16: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/16.jpg)
エラーの表示実装
NSArray *buttons = [NSArray arrayWithObjects:@"キャンセル", @"再試行する", nil]; NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: @"ネットワークエラーが発生しました", NSLocalizedDescriptionKey, @”ネットワークに接続できません”, NSLocalizedFailureReasonErrorKey, @"接続を確認して…", NSLocalizedRecoverySuggestionErrorKey, buttons, NSLocalizedRecoveryOptionsErrorKey, nil]; NSError*error = [NSError errorWithDomain:@"com.hoge.fuga" code:100 userInfo:userInfo];
![Page 17: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/17.jpg)
エラーの表示実装
• UIAlertViewに食わせて表示する@implementation UIAlertView (NSErrorAddition)
-(id)initWithError:(NSError *)error { self = [super init]; if (self) { self.title = [error localizedDescription]; self.message = [[NSArray arrayWithObjects:[error localizedFailureReason], [error localizedRecoverySuggestion], nil] componentsJoinedByString:@"\n"]; NSArray* optionTitles = [error localizedRecoveryOptions]; for (NSString *title in optionTitles) { [self addButtonWithTitle:title]; } } return self;}
@end
![Page 18: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/18.jpg)
レジューム処理実装
• ViewControllerごとレジューム
• POSTの画面をもう一度開きます
• レジューム操作が直感的• 予期しないところでViewControllerが開いてしまう
![Page 19: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/19.jpg)
レジューム処理実装
• キューでレジューム• リクエストをキューに保存しておく• 成功したらキューからは削除• 失敗したらキューのビューから再試行操作を行う• キューをプレビューするビューを作る必要有り
![Page 20: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/20.jpg)
まとめ
• 通信エラー処理の方法について考察した• 通信エラーは正常系の一部として考えよう• 様々なアプリのケースを観察した• Pathはがんばっている
• 通信エラー処理を実装してみた• UIAlertView
• レジューム処理2種類
• 大変だけどがんばりましょう
![Page 21: I phoneアプリの通信エラー処理](https://reader035.vdocuments.net/reader035/viewer/2022081512/5563171dd8b42a81528b4e6e/html5/thumbnails/21.jpg)
最近出たこの本が結構良いと思ってますおまけ
• iOSプログラミング 第2版
• アーロン・ヒレガス, ジョー・コンウェイ