自動車保険の詐欺師や書類に対するモバイルアプリケーション

今日、自動車の分析における経験を共有したいと考えています。 いいえ、Top Gearを起動する予定はありません。 もう1つのトピックがあります-モバイルアプリケーションを使用して自発的な自動車保険に関する書類をデジタル形式に転送する方法-よく知られているCASCO。



このトピックは、主にモバイルビジネスアプリケーションの開発とビジネスプロセスの自動化に関係する人々に関心があります。 iOSの開発例に関する興味深い技術的ポイントをお伝えします。







だから、問題に。 CASCOは、個人向けの保険会社の2番目に重要なサービスです。 最も人気のある、もちろん、CTP、そしてすぐに船体。 しかし、あなたはすべてのステップで文字通りMTPL保険に加入することができ、CASCOは汗をかかなければなりません:保険を選択するだけでなく、エージェントを待ち、紙片をいっぱいにし、エージェントと一緒に車の検査を行い、彼がすべての書類と写真をオフィスに持って行くまで待ちます、引受人はすべてをチェックし、同意を与え、その後、書類に署名し、お金を受け入れる準備ができ、あなたの車は最終的に保護されます。 ハレルヤ!







しかし、保険会社は、もちろん、官僚制度、事務処理、専門家の質の低い仕事が、サービスの開発と新規顧客の獲得を実際に妨げていることを理解しています。 そして何をすべきか?



この呼び出しには、iOSおよびAndroidの保険代理店のモバイルアプリケーション、サーバーパーツ、保険引受人ワークステーションのシステムを使用して回答しました。 アプリケーションを通じて、会社の代表者は注文を受け取り、保険会社に即座にデータを送信して完全な検査と写真の修正手順を実行できます。







単一のアプリケーションが保険会社の多くのタスクを解決します。

  1. より簡単な「職業への参入」を提供します。 カメラを提供してエージェントをフルタイムでトレーニングする代わりに、アプリケーションをダウンロードするためのリンクをエージェントに与えるだけで十分です。
  2. これにより、エージェントの品質が向上します。 アプリケーションに複数の「愚か者に対する保護」が組み込まれているため、この手順では技術を厳守する必要があります。
  3. 同時に、このテクノロジーは、あらゆる種類の不正行為や、アプリケーションで提供される制御手段と制限による不正行為から効果的に保護します。


その結果、保険会社は同時にCASCO契約締結のコストを削減し、エージェントの仕事の質を向上させ、不正行為から身を守る機会を得ました。



そして今、実装のために



いつものように、多くはかなり標準的でした。 しかし、興味深い技術的な問題もありました。その実装を共有したいと思います。



1.検査計画



アプリケーションへの登録後(およびログイン後)、ユーザー(保険代理店)には検査対象のアプリケーションのリストが表示されます。 要求に応じて、彼は将来の検査を計画するか、すぐに開始することができます。



検査をスケジュールするには、ユーザーは検査の日付と時刻を指定し、オプションで住所を指定できます。 検査のために、スマートフォンのカレンダーにイベントが自動的に作成され、検査の1時間前にアラームが設定されます。 ユーザーがスケジュールされた時間を変更すると、カレンダーのイベントも更新されます。







このような同期を実装するために、EventKitカレンダーの操作に標準ライブラリを使用しました。

標準カレンダーと同期する
- (void)syncEventForSurvey:(Survey *)survey completion:(void (^)(NSError *))completion { if (!survey.dateScheduled) return; [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ if (!granted || error) { if (completion) completion(error); return; } NSTimeInterval oneHour = 60*60; EKEvent *event = nil; if (survey.eventIdentifier) { event = [self.eventStore eventWithIdentifier:survey.eventIdentifier]; } if (!event) { event = [EKEvent eventWithEventStore:self.eventStore]; event.calendar = [self surveysCalendar]; event.title = survey.title; NSTimeInterval alarmOffset = -oneHour; EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:alarmOffset]; event.alarms = @[alarm]; } event.startDate = survey.dateScheduled; NSTimeInterval surveyDuration = oneHour; event.endDate = [event.startDate dateByAddingTimeInterval:surveyDuration]; NSError *saveError = nil; [self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&saveError]; if (!saveError) { survey.eventIdentifier = event.eventIdentifier; } if (completion) completion(saveError); }); }]; }
      
      









eventStoreは単なる[[EKEventStore alloc] init]です。

surveysCalendarは少し複雑です:



調査カレンダー
 - (EKCalendar *)surveysCalendar { NSString *calendarTitle = @" "; EKCalendar *calendar = nil; if (self.surveysCalendarIdentifier) { calendar = [self.eventStore calendarWithIdentifier:self.surveysCalendarIdentifier]; } if (!calendar) { NSArray *allCalendars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent]; calendar = [allCalendars etr_filter:^BOOL(EKCalendar *obj) { return [obj.title isEqualToString:calendarTitle]; }].firstObject; } if (!calendar) { calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore]; calendar.source = self.eventStore.defaultCalendarForNewEvents.source; calendar.title = calendarTitle; [self.eventStore saveCalendar:calendar commit:YES error:nil]; self.surveysCalendarIdentifier = calendar.calendarIdentifier; } return calendar; }
      
      







検査時にdateScheduledが設定されると、カレンダーとの同期が呼び出されます。 私たちのアプリケーションでは、計画された検査を維持しながらこれが起こります。



2.検査



検査を行うには、ユーザーは計画済みまたは最近ダウンロードした検査アプリケーションのリストからオブジェクトを選択し、「検査」ボタンをクリックします。 検査自体は、車両の検査と書類の追加という2つの部分で構成されています。







「ドキュメント」ブロックは、必要に応じて写真を撮ってサーバーに送信できるドキュメントのリストです。 この部分はオプションであり、制限もありません。



車の検査では、すべてがはるかに興味深いです。 いくつかのブロックで構成されています。





アプリケーションで「偽の」写真を防ぐために、いくつかの制限が実装されています。





2.1。 タイマー、または30分で追いつく



ユーザーが「検査開始」ボタンをクリックするとすぐに、カウントダウンが開始されます。 また、検査モードでは、アプリケーションのすべての画面にタイマーが表示されます。 車両(TS)が30分以内に検査されなかった場合、この検査のために撮影されたすべての写真は削除され、検査を再度開始する必要があります。 この制限により、1回の検査で異なる車の不正な撮影が防止されます。



2.2位置情報の制限



また、改ざんを防ぐために、最初に、ユーザーが検査を開始した地点から500メートル以上離れている場合、検査を中断したかったのです。 次のように実装しました:



検査の開始時に、アプリケーションは現在のジオロケーションを開始として保存し、次の30分間のジオロケーションの変更の通知にサブスクライブします。 新しい座標を受け取ると、開始点までの距離が500メートルを超えていないかどうかが比較されます。 開始点から500メートル以上離れている場合、検査は終了し、再度開始する必要があります。



だから、それは考案されました。 しかし、座標を取得する精度は信号源に大きく依存するため、この考えを放棄しなければなりませんでした。 状況によっては、モバイルデバイスがWi-Fiポイントでジオロケーションを決定するとき、それらを再接続するときに、アプリケーションは500メートル以上の距離変化に関する情報を受け取ることができますが、ユーザーは3つ通過していません。 このようなジャンプにより、検査は中断されました。 検査の場所、および地理的位置に関する情報のソースを制限することはできません。したがって、この制限を拒否する必要がありました。



ただし、安全性は維持されます。 検査プロセス中に撮影されたすべての写真は、サーバーに送信されるジオデータで補完されます。 また、ジオロケーションがないと、検査する機能がブロックされます。



2.3。 正しい写真のキャプチャ



アプリケーションで使用される写真は、アプリケーションでのみ作成および保存されます。 写真を図書館に保存したり、保険会社のサーバー以外の場所に写真を転送したりする方法はありません。 これは、エージェントが写真を偽造できず、車両の写真が間違った手に落ちないことを意味します。



検査プロセス中に、エージェントは、アプリケーションが実行する手順に従って、車のすべての要素の写真固定を行います。 写真を撮る必要がある各検査項目には、「Windshield」、「右側の車両」、「リアバンパーの右隅の車両の対角線」という名前が付いています。 適切な射撃角度を選択しやすくするために、アプリケーションにマスクとヒントが実装されています。 撮影モードで表示されるマスクには、車の車輪の位置のフレームが表示されます。 撮影モードからツールチップも利用できます。これには、対応するパースペクティブでの完成した写真の例が含まれています。











2.4。 ダメージ写真



そして最後に、アプリケーションで、エージェントは検出されたすべての自動車の損傷を示し、個別に写真を撮影します。 損傷のある部分を図に書き留めてください。 パーツが選択された後、ユーザーはパーツの特定のパーツと損傷のタイプを指定して、損傷の詳細写真と自動車部品の一般的な計画の欠陥の写真を2枚撮影できます。







自動車モデルのアプリケーションでは、エージェントは損傷のある車両部品を選択し、色で強調表示してから、損傷を撮影する段階に進みます。



図の曲線要素の選択を実現するために(そして車の詳細はすべて同じです)、SVG(Scalable Vector Graphics)形式から取得したベジェ曲線を使用しました。



ベジェ曲線を使用すると、複雑な曲線、この場合は自動車部品の輪郭、SVG(XMLベースの2次元ベクトル画像形式)の方程式を設定できます。 ベジエ曲線が車体部品の設計専用に設計されたことは興味深いです。

曲線とSVG形式の詳細については、こちらをご覧ください。

en.wikipedia.org/wiki/ベジエ曲線

en.wikipedia.org/wiki/Scalable_Vector_Graphics



また、図の一部を選択するためのレシピは次のようになります。

最初に、設計者はSVGの3つの投影図で機械の図を描きました。 画像をSVG形式からベジエ曲線形式の個別のパーツファイルのセットに変換しました(このためにPocketSVG-github.com/arielelkin/PocketSVGを使用できます)。



すべての.bezierファイルがプロジェクトに追加され、画面上でダイアグラムとともに使用されました。車のある背景画像が使用され、UIBezierPathの詳細が上に追加されます。

ベジェ曲線で作業する
 - (void)awakeFromNib { [super awakeFromNib]; NSArray *carParts = [SurveyStructure sharedStructure].carParts; NSMutableArray *newLayers = [NSMutableArray array]; for (SurveyStructureCarPart* part in carParts) { @autoreleasepool { NSString *filepath = [[NSBundle mainBundle] pathForResource:part.identifier ofType:@"bezier"]; UIBezierPath *bezier = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath]; CarPartLayer* layer = [[CarPartLayer alloc] initWithCarPart:part]; layer.anchorPoint = CGPointZero; layer.path = bezier.CGPath; layer.actions = @{@"fillColor": [NSNull null], @"opacity": [NSNull null]}; [newLayers addObject:layer]; [self.layersContainer.layer insertSublayer:layer atIndex:0]; } } self.carPartLayers = newLayers; }      : - (void)hightlightPartAtPoint:(CGPoint)point { for (CarPartLayer *layer in self.carPartLayers) { if (CGPathContainsPoint(layer.path, NULL, point, false)) { if (self.highlightedLayer != layer) { self.highlightedLayer = layer; } return; } } if (self.highlightedLayer != nil) { self.highlightedLayer = nil; } }
      
      









部品を選択しやすいように、図では「虫眼鏡」が使用されています(例: cocoapods.org/pods/iOS-MagnifyingGlass )。



3.データ転送



すべての必要な写真が撮影された後、アプリケーションはユーザーに検査を完了し、サーバーにデータを送信するように提供します。 ユーザーがマジックボタンを押すと、検査がディスパッチキューに転送されます。



3.1。 バックグラウンドで送信する



検査はバックグラウンドで送信されます。 そして、アプリケーションが実行されているとき、およびアプリケーションがバックグラウンドにあるとき。 UploadManagerシングルトンはFetchResultsControllerを使用します。このコントローラーは、検査のリストから「送信」ステータスのオブジェクトを選択します。 検査を送信に転送するとき、フェッチャーは何をダウンロードする必要があるかをマネージャーに伝えます。 マネージャーは検査データをサーバーにダウンロードし、オブジェクトのステータスを変更します。 その後、発送のための他の検査の可用性についてチェックが行われます。 この時点で他の契約がない場合、ダウンロードマネージャーはフェッチャーからの次の通知を待ちます。







アプリケーションがバックグラウンドで検査に関するデータを送信するために、backgroudタスクを追加しました:

バックグラウンド同期
 - (void)applicationDidEnterBackground:(UIApplication *)application { if ([[UploadSurveysManager sharedManager] isNeedUpload]) { self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ [application endBackgroundTask:self.bgTask]; self.bgTask = UIBackgroundTaskInvalid; }]; [[UploadSurveysManager sharedManager] uploadIfNeeded]; } }
      
      







必要なバックグラウンドモードは、プロジェクトInfo.plistで指定する必要があります:「アプリはネットワークからコンテンツをダウンロードします」

バックグラウンドでの開始プロセスの詳細な説明は、次の場所にあります。



developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW6



バックログのタスクには時間制限があることに注意してください。 バックグラウンドでダウンロードを効果的に使用するには、ダウンロードを少しずつ実行し、現在の状態を維持して、次にバックグラウンドタスクが開始されたときに送信を復元する必要があります。 これらの制限を満たすために、検査の送信を順番に処理します。 最初に、検査に関連する写真が個別に送信され、次に、対応するタスクの検査にそれらを接続する写真識別子のリストを含む特別な要求が送信されます。 この検査が送信されたと見なされた後にのみ。



3.2。 モバイルトラフィックの最適化



モバイルトラフィックを節約するために、アプリケーションはインターネット接続のタイプのチェックを実装しています。 アプリケーション設定で、「自動モードで携帯電話経由でデータを転送しない」オプションを有効にできます。 この設定を有効にすると、スマートフォンがWi-Fiネットワークに接続されている場合にのみ、実施された検査に関する情報がサーバーに送信されます。 さらに、別の契約でモバイル送信を有効にすることができます。



検査を緊急に送信する必要があり、Wi-Fiを使用できない場合、1つの契約の設定を有効にできます。Wi-Fiが使用可能な場合、検査が送信され、モバイルの場合は、モバイル通信経由で送信する設定の契約のみがオンになります。



おわりに



私たちのおかげで、車の所有者はCASCOをできるだけ簡単に手配する機会を得ました。



保険会社のために、一連のタスクを解決する便利なツールを作成しました。

  1. 作業効率を向上させ、
  2. 検査プロセスの標準化、
  3. 詐欺防止。




そして、私たちはいくつかの興味深い問題を解決しました。また、あなたがどのように学ぶのにも興味があることを願っています。





じゃあね!



All Articles