Background FetchでWKWebViewを更新しようとすると、正常に動作しない場合があるようです。
具体的には、アプリがフォアグラウンドに居る時にiPhoneのSleepボタンを押してスリープさせ、その状態でBackground FetchからWKWebViewにURLをロードしようとすると動作しません。アプリをバックグラウンドに下げてからSleepさせた場合は、問題は発生しないようです。
また、iOS12以前や、シミュレータ ではこの問題は発生しないようです。
WebKitのソースを確認してみると、WebKit側でアプリのバックグラウンドへの移行をハンドリングして処理を制御するようなロジックが入ってるっぽいです。
iOS13からUIScene周りの処理が加わったようで、それが問題になっているようでした。
対処方法としては、バッドノウハウ的な方法になりますが、下記のコードのように、WKWebViewが所属するUISceneをobjectに設定してUISceneWillEnterForegroundNotificationを送ってやれば、WebKit側がアプリがフォアグラウンドに移行したと誤認してWKWebViewのロードが実施されるようになります。
1 2 3 4 5 6 7 8 |
/// iOS13のバグ対策に、アプリ起動通知を送信 func sendDummyNotification() { if UIApplication.shared.applicationState == .background { if #available(iOS 13.0, *) { NotificationCenter.default.post(name: Notification.Name("UISceneWillEnterForegroundNotification"), object: parentView?.window?.windowScene) } } } |