読者です 読者をやめる 読者になる 読者になる

ぽじてぃぶしんきんぐ

1年目エンジニアのブログ。備忘録と趣味の垂れ流し。

Admobの取得をviewDidLoad()に置いてると「this application is modifying the auto layout engine...」と出る件の対処法@Swift

以前Admobを導入してみた記事を書きました。
seiya-orz.hatenablog.com

テスト運用していると、たまにWebThreadからExceptionを受け取って、アプリが止まることがありました。
そのエラーの内容は「This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.」リリースした時にも起こるかもよ、とか言われてます。

このエラーは、要するに、バックグラウンドスレッドからレイアウトいじっちゃダメですよ、という話。

ただ、自分で書いている部分にレイアウトをいじっている部分は見当たらなく、なんとなくAdmobのせいなのではないか、と思い始めました。とくに、bannerViewに広告を挿しこんでいるのはバックグラウンドな感じがしましたし。

ということで調べてみると、たぶんこの記事が該当します。
groups.google.com

ということで解決策。

dispatch_async(dispatch_get_main_queue(), {
   //広告部分
   self.bannerView.adSize = kGADAdSizeSmartBannerPortrait
   self.bannerView.adUnitID = self.AdMobID  // テスト用ID
   self.bannerView.rootViewController = self
   let admobRequest:GADRequest = GADRequest()
   if self.AdMobTest {
      if self.SimulatorTest {
          admobRequest.testDevices = [kGADSimulatorID]
      } else {
          admobRequest.testDevices = [self.TEST_DEVICE_ID]
      }
   }
   self.bannerView.loadRequest(admobRequest)
})

このdispatch_async()内に広告取得にあたるコードを書き込むことで解決できるようです。今のところExceptionは発生していません。

Admobの公式に書いといてほしかった。もしかしたら書いてるのか?

おわり。