Swiftのランタイムエラーを捕捉する

アプリがクラッシュした際に、ちょっとした後片付け的な処理をしたくて調べてた。

バージョン

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

harasou.jp

        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というよりシステムプログラミングっぽくなった。

結局、今回はアプリがバックグラウンドに行くときと、フォアグラウンドへの復帰時などの処理を見直して対応した。

サンプルコード

github.com