28

私はアップルストアにアプリを持っていて、iOS6のアップデート後、内に何百ものクラッシュレポートがありますMKMapView。デバイスでクラッシュを再現できません。の問題のようEAGLContextです。アプリではOpenGLを使用していませんがMKMapView、異なるコントローラーに複数のインスタンスがあります。ここで同様の問題が見つかりました。マップを表示するとiOS6アプリがEAGLContextでクラッシュしますが、OpenGLを使用します。

ここにバックトレースがあります:

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x1
Crashed Thread:  0

Thread 0 Crashed:
0   libGPUSupportMercury.dylib          0x00000e22 gpus_ReturnNotPermittedKillClient + 10
1   libGPUSupportMercury.dylib          0x3bccc5fb gldCreateContext + 190
2   GLEngine                            0x344c2b15 gliCreateContextWithShared + 676
3   OpenGLES                            0x0000491d -[EAGLContext initWithAPI:properties:] + 1433
4   OpenGLES                            0x000042d7 -[EAGLContext initWithAPI:sharedWithCompute:] + 143
5   VectorKit                           0x00011c81 -[VGLGPU init] + 105
6   VectorKit                           0x000d4659 __24+[VGLGPU sharedInstance]_block_invoke_0 + 49
7   libdispatch.dylib                   0x000014b7 _dispatch_client_callout + 23
8   libdispatch.dylib                   0x000073f7 dispatch_once_f$VARIANT$mp + 43
9   VectorKit                           0x00011c13 +[VGLGPU sharedInstance] + 39
10  VectorKit                           0x00001db1 -[VKMainLoop updateLinkState] + 485
11  VectorKit                           0x00001955 -[VKScreenCanvas _updateDisplayStatus:] + 109
12  UIKit                               0x0001c371 -[UIView initWithFrame:] + 129
13  VectorKit                           0x00010ca5 -[VGLScreenCanvas initWithFrame:context:] + 53
14  VectorKit                           0x00010a7d -[VKScreenCanvas initWithFrame:context:] + 57
15  VectorKit                           0x00010a3f -[VKScreenCanvas initWithFrame:] + 39
16  VectorKit                           0x000106bd -[VKMapCanvas initWithFrame:shouldRasterize:] + 65
17  VectorKit                           0x000104bb -[VKMapView initWithFrame:andGlobe:shouldRasterize:] + 647
18  MapKit                              0x0000dc95 -[MKMapView _commonInitAndEnableLoading:fromIB:] + 725
19  MapKit                              0x0000d811 -[MKMapView initWithFrame:] + 257
.....
4

4 に答える 4

24

マップサブビューを含むウィンドウをポップアップするのと同じように、ユーザーがアプリをバックグラウンドで表示するときにも、同様の問題が発生していました。バックグラウンドでopenGL呼び出しを使用したマップが原因で、クラッシュが発生しているようです。マップサブビューの作成を次のようなチェックでラップする必要がありました。

UIApplicationState appState = [[UIApplication sharedApplication] applicationState];
    if( (appState != UIApplicationStateBackground) && (appState != UIApplicationStateInactive))
    {
        // Do map subview initialization...
    }
    else
    {
        self.attemptedToLoadMap = YES;
    }

アプリがフォアグラウンドに戻った場合にサブビューを追加して表示できるように、ブール値を節約しました。

再描画操作(注釈の追加など)を引き起こす方法でマップを操作しているときはいつでも、これを行う必要があります。

于 2012-10-25T21:30:53.097 に答える
3

http://developer.apple.com/library/ios/#qa/qa1766/_index.html

このテクニカルQAはこの問題に対処します

于 2013-01-04T21:42:32.593 に答える
3

私たちはアプリでこれの原因を見つけたので、他の誰かに役立つ場合に備えて解決策を投稿したいと思いました。プライマリビューコントローラは、表示されているときに重要な場所の変更を監視し、非表示になっているときに監視を停止します。一部のユーザーは、この画面で無関係のクラッシュを経験し、アプリの監視を終了しました。アプリが重要な位置変更の更新に登録されている場合、iOSが実行されていない場合、iOSは実際にアプリをバックグラウンドで起動して、新しい位置を通知します。私たちのアプリは最初に表示されたときに地図を表示するため、これによりクラッシュが発生しました。Appleのサポートにより、iOS 8.xを実行している32ビットデバイスにバグがあり、アプリがバックグラウンドにあるときにMapView(または他のOpenGLコンテキスト)が更新されるとクラッシュする可能性があることが確認されました。

コードを変更して、場所が大幅に変更されたためにアプリが起動した場合、すぐに監視を停止し、例外をスローしてアプリをクラッシュさせます。これはユーザーには完全に見えないため、ユーザーはクラッシュに気付かず、それ以上のクラッシュが発生するのを防ぎます。

- (void)validateLaunchWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions[@"UIApplicationLaunchOptionsLocationKey"]) {
        // the app was launched due to a significant location change, which is not valid and causes crashes
        // prevent this from happening again by disabling significant location monitoring
        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        [locationManager stopMonitoringSignificantLocationChanges];

        // intentionally crashing the app here; it is not in a good state and it needs to be prevented from
        // getting to any code that would re-enable significant location monitoring
        @throw [NSException exceptionWithName:@"com.redacted.significantLocationLaunch"
                                       reason:@"app may not be launched due to significant location changes"
                                     userInfo:@{}];
    }
}

このクラッシュは何千回も発生しましたが、原因を特定するまでテストデバイスで再現できませんでした。複製したい場合(および修正を確認したい場合)、アプリが重要な場所の変更の監視を開始した直後に@throw例外をスローします。アプリがクラッシュしたら、ドライブに行きます。携帯電話がセルタワーを切り替えるとすぐに、iOSはバックグラウンドでアプリを起動し、クラッシュします。ユーザーの電話の1つを手に入れ、クラッシュログを調べることができました。クラッシュはすべて、彼女の通勤中に発生しました。

于 2014-12-16T21:00:57.327 に答える
2

私は同様のスタックトレースに直面しています。コンソールでは、実際の問題についてより詳細に説明されていることに気付きました。バックグラウンドでGPUを使用することはできません。iOS 5のマップはタイルベースだったので、GPUを使用しなかったと思いますが、iOS 6の新しいマップはベクターグラフィックスを使用しているため、GPUを使用しています。その結果、以前はバックグラウンドにあったマップ作業をバックグラウンドで実行できなくなります。

于 2012-10-08T02:59:01.717 に答える