Swiftのランタイムエラーを捕捉する
アプリがクラッシュした際に、ちょっとした後片付け的な処理をしたくて調べてた。
バージョン
- Xcode 9.4
- Swift4.1
NSSetUncaughtExceptionHandler
ググると、これがよく引っかかる。
NSSetUncaughtExceptionHandler(_:) - Foundation | Apple Developer Documentation
ただ、NSExceptionは捕捉できるけどSwiftランタイムエラーは捕捉できないっぽい。
ios - How to catch a Swift crash and do some logging - Stack Overflow
あと、うまく実装しないとCrashlyticsとかのハンドラーとかち合うみたい。
Signal
Stack Overflow でみつけたやつ。
Appleのアーカイブっぽいところに少しドキュメントがあった。
Technical Note TN2151: Understanding and Analyzing Application Crash Reports
この辺の記事も参考になった。 qiita.com
let SignalHandler : @convention(c) (Int32) -> Void = { (signal) -> Void in let log = "signal \(signal)" UserDefaults.standard.setValue(log, forKey: "signal1") sleep(1) exit(EXIT_FAILURE) } signal(SIGABRT, SignalHandler) signal(SIGILL, SignalHandler) signal(SIGSEGV, SignalHandler) signal(SIGFPE, SignalHandler) signal(SIGBUS, SignalHandler) signal(SIGPIPE, SignalHandler) signal(SIGTRAP, SignalHandler)
こんな感じでOSのシグナルをハンドリングできる。
Swiftというよりシステムプログラミングっぽくなった。
結局、今回はアプリがバックグラウンドに行くときと、フォアグラウンドへの復帰時などの処理を見直して対応した。