SurfTideΔ for iOS版で天気情報取得中希に落ちるバグに対応

  • 投稿:
  • 更新:2020年3月 5日
  • by
  • in

s_std_sad_20200305.png

天気情報取得時に希に異常終了していたバグが特定できまし。現在 v1.2.4 を申請しているので数日で公開できると思います。
他、News取得時、ターゲットのニュースURLに不正なキャラクタ(主には漢字)が有る場合にも異常終了してバグも合わせて修正しました。(これはサーバ側でも対処済)
何れもiOS版のみのバグ修正になります。

この「希に」ってのが曲者で、毎回落ちるなら原因特定も早いんだけど「希に」だと問題の特定に時間がかかります。原因さえわかれば修正するのは簡単なんですけどね。

ここからはちょっと開発者向け

天気情報取得時のバグは完全にケアレスミスでした…
WEBサービスから取得した天気情報をCoreDataにキャッシュしている部分で、このメソッドそのものがスレッドなのに、それを考慮した作りになってませんでした。
同じような処理をしている「e-tide」では正しく実装しているにもかかわらずです(笑)

// appDelegate の抜粋
lazy var persistentContainer: NSPersistentContainer = {
 let container = NSPersistentContainer(name: "SurfTideDelta")
 container.loadPersistentStores(completionHandler: { (storeDescription, error) in
 if let error = error as NSError? {
 fatalError("Unresolved error \(error), \(error.userInfo)")
 }
 })
 return container
}()
---
これはミス(メインスレッドならOK)
↓
let context = self.appDelegate.persistentContainer.viewContext
---
Backgroundではこちらが正しい
↓
let context: NSManagedObjectContext = NSManagedObjectContext.init(concurrencyType: .privateQueueConcurrencyType)
context.parent = self.appDelegate.persistentContainer.viewContext

あともう1点ニュースの件
こちらは想定外というか、イメージURLに漢字(実際には①とか)があるときに「URL」でインスタンス化すると nil に…
ファイル名にそんな文字使うこと自体が変だとは思うんだけど(某官公庁のサイトデータ)落ちるのは頂けない…。なので、サーバーで不正文字を含むイメージURLは無効にするとともに、アプリの方でも対処ロジックを入れておきました。