web-dev-qa-db-ja.com

サブビューとしてGoogleマップを追加すると、exc_badでiOSアプリがクラッシュする

約3日前まで完全に問題なく動作したコードがあります。私は100%動作したずっと古いコミットに戻ろうとしましたが、今でもexc_badでクラッシュします。クラッシュは、デバイスでアプリを実行しているときにのみ発生します。シミュレータでアプリを実行したり、デバイスを使用してアプリを実行したりすると、デバイスは完全に正常に実行されます。 Google APIキーを変更すると、「このAPIキーを使用する権限がない可能性があります」と表示されましたが、クラッシュしなくなりました。

アプリは、xcodeを介してデバイスでアプリを実行しているときにのみクラッシュします。後でxcodeに接続せずにデバイスで同じバージョンを実行すると、正常に動作します。

問題のデバッグに役立つ情報をここに追加できるかわかりません。最近、xcodeを6.4に更新し、OSXを最新のアップデートでアップデートしました。

CocoaPodsを使用してインストールされたGoogle 1.10.1 SDKバージョンを使用しています

地図を追加するために使用するコード:

self.mapView = [GMSMapView mapWithFrame:self.view.bounds camera:camera];

self.mapView.myLocationEnabled = YES;
self.mapView.settings.myLocationButton = YES;
self.mapView.delegate = self;

[self.mapView addObserver:self
               forKeyPath:@"myLocation"
                  options:NSKeyValueObservingOptionNew
                  context:NULL];

[self.view insertSubview:self.mapView atIndex:1];

エラー自体は、code = 1、code = 2、およびcode = 257の間で異なります。コードではなくストーリーボードを使用してGMSMapViewを追加してみました。古いバージョンのxcodeをインストールしてもう一度実行してみましたが、何も変わりません。

サブビューの挿入行をコメントアウトしても、そのアプリはクラッシュしません。私はゾンビ計器ツールを実行してみましたが、計器を使用して実行すると、アプリは正常に動作します。

#0  0x0000000100c5dc34 in EAGLContext_renderbufferStorageFromDrawable(EAGLContext*, objc_selector*, unsigned long, id<EAGLDrawable>) ()
#1  0x00000001002404c0 in gmscore::renderer::ios::GLRenderTarget::CreateFramebuffer() ()
#2  0x00000001002403cc in gmscore::renderer::ios::GLRenderTarget::FrameStart() ()
#3  0x00000001002e7af4 in gmscore::renderer::EntityRenderer::Draw(bool) ()
#4  0x00000001002516f4 in -[GMSPhoenixRenderer drawIfNeeded] ()
#5  0x00000001002329a0 in -[GMSEntityRendererView draw] ()
#6  0x000000010028dc74 in -[GMSDisplayLink displayLinkFired:] ()
#7  0x0000000100c5ca9c in -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] ()
#8  0x00000001887f629c in CA::Display::DisplayLinkItem::dispatch() ()
#9  0x00000001887f6134 in CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) ()
#10 0x00000001855d1470 in IODispatchCalloutFromCFMessage ()
#11 0x00000001843c2dc4 in __CFMachPortPerform ()
#12 0x00000001843d7a54 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#13 0x00000001843d79b4 in __CFRunLoopDoSource1 ()
#14 0x00000001843d5934 in __CFRunLoopRun ()
#15 0x00000001843012d4 in CFRunLoopRunSpecific ()
#16 0x000000018db1f6fc in GSEventRunModal ()
#17 0x0000000188ec6fac in UIApplicationMain ()
#18 0x000000010002d794 in main at /Users/yoavschwartz/Documents/donkey_republic_ios/DonkeyRepublic/DonkeyRepublic/main.m:14
#19 0x0000000196272a08 in start ()

この問題は、コンピュータ/デバイスを再起動すると自動的に解決するようで、再び表示されます。何が起こっているのか本当にわかりません。

39
Yoav Schwartz

編集:問題の根源を見つけ、回避策があります。

この問題は、XCodeのOpenGL ESフレームキャプチャによって引き起こされているようです。この問題は、Apple= MetalがXCode 6.4/iOS 8.3の時点でMixに追加されたときに、フレームキャプチャデバッグシステム全体に何らかの影響を及ぼしていると思われます。

回避策:

  1. XCodeで、[Product]> [Scheme]> [Edit Scheme ...]に移動します。
  2. 左側の「実行」タブを選択します。
  3. 上部の[オプション]サブタブを選択します。
  4. 「GPU Frame Capture」を「Automatically Enabled」または「OpenGL ES」から「Metal」または「Disabled」に変更します。

これはOpenGL ESフレームキャプチャを無効にします。これはすばらしいことではありませんが、ビルドのデバッグを続行できます。

この問題がAppleの問題なのかGoogleの問題なのかはわかりませんが、両方にバグレポートを投稿します。幸せなコーディング!

-

以前の投稿:

私もこれを経験しているので、いくつかの詳細情報(これはコメントになりますが、まだ担当者がいません)。私が知ることができる限り:

  • この問題は、XCode 6.4およびXCode 7ベータ3で明らかです
  • XCodeの外部では実行されず、デバッグモードでのみ表示されます。
  • IOS 8.1.2では表示されませんが、iOS 8.3では表示されます。
  • これは、Google Maps 1.9.X(フレームワークファイルとしてインポート)と1.10.X(CocoaPodとしてインポートされ、最新のものを含む)の両方で発生します。
  • まだ完全に確認することはできませんが、XCode 6.3.2には表示されていません。これは、そのバージョンでは8.3用にコンパイルできないためかもしれません。

Swagバウンティの締め切りに間に合わない可能性がありますが、明日はさらに深く掘り下げて報告します。

106
Dave Cole

Yoav Schwartzさん、mapViewのinsertSubviewがビュー階層に挿入された後にのみmapView.delegateを割り当てようとしましたか?

私は同様のことを経験しており、ジュリアンが上で言及したように、それはXcode 6.4のバグであると思います。

ジェームス・ペレイラ/ @ marinehero

1
MarineHero

これは、Google Maps SDKを使用していたときにも起こりました。 Xcodeを再起動してプロジェクトを削除し、再インストールした後、バグレポートを提出しました。

これはあなたの問題ではなく、単なるバグです。テストフライトまたはApp Storeを介してビルドをインストールすると、魅力的に機能します。

デバッグするには、Xcodeを再起動し続け、可能であればXcode 7で実行してみてください。このバグが修正された可能性があります。

お役に立てば幸い、ジュリアン

1
Julian E.