iPhone アプリの新しいビルドをテストしているときに、applicationWillEnterForeground の後でアプリを再開すると、アプリ ウィンドウが完全に黒くなることがあります。アプリを再び機能させる唯一の方法は、アプリを完全に閉じてからアプリを再起動することです。一貫して再現するための手順を特定できていません。この問題はランダムに発生するようですが、アプリがバックグラウンドに置かれた後にアプリに戻ったときにのみ発生します。数秒後に発生する場合もあれば、1 週間以上発生しない場合もあります。
通常の操作中のメイン ビューのスレッドは次のとおりです。
この問題が発生し、デバッガーを一時停止したときのスレッドは次のとおりです。
私が試したこと
アプリの再開時にすべてをログに記録する
アプリが再開しても、異常はないようです。applicationDidBecomeActive
さらに、ホームボタンが押されるまで、私のコードは実行されません。
2013-05-15 22:22:23 AppDelegate::applicationDidBecomeActive
2013-05-15 22:22:23 self.window = <UIWindow: 0x1dd6ee80; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x1dd6ef80>>
2013-05-15 22:22:23 self.window.subviews.count = 7
2013-05-15 22:22:23 self.navigationController = <UINavigationController: 0x1dd87190>
2013-05-15 22:22:23 self.navigationController.visibleViewController = <MyViewController: 0x1dd7ffe0>
2013-05-15 22:22:23 self.navigationController.view = <UILayoutContainerView: 0x1dd876e0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x1dd877a0>>
2013-05-15 22:22:23 self.navigationController.viewControllers.count = 1
2013-05-15 22:22:23 TestFlight: App Token is recognized
2013-05-15 22:22:24 AppDelegate::applicationWillResignActive
2013-05-15 22:22:24 TestFlight: End of Session
ログに最初は気になった項目がいくつかありますが、通常の運用中に観察したので、関連性はないと思います。念のため、ここにそれらを示します。
ApplicationWillEnterForeground の直後:
installd[54] <Error>: 0x2ff8d000 filter_attributes: Info.plist keys requested via MobileInstallationLookup/Browse in client Xcode (via mobile_installation_proxy) were not found in MobileInstallation's cache. Please file a bug requesting that these keys be added: <CFBasicHash 0x1cd86080 [0x3c44d100]>{type = mutable set, count = 18,
entries =>
0 : <CFString 0x3c4399f4 [0x3c44d100]>{contents = "CFBundlePackageType"}
1 : <CFString 0x1cebf1e0 [0x3c44d100]>{contents = "BuildMachineOSBuild"}
2 : <CFString 0x3c43aa44 [0x3c44d100]>{contents = "CFBundleResourceSpecification"}
3 : <CFString 0x1ce90cf0 [0x3c44d100]>{contents = "DTPlatformBuild"}
4 : <CFString 0x3c437794 [0x3c44d100]>{contents = "DTCompiler"}
5 : <CFString 0x3c439564 [0x3c44d100]>{contents = "CFBundleSignature"}
6 : <CFString 0x3c43a224 [0x3c44d100]>{contents = "DTSDKName"}
7 : <CFString 0x1cebe5f0 [0x3c44d100]>{contents = "NSBundleResolvedPath"}
8 : <CFString 0x3c436eb4 [0x3c44d100]>{contents = "UISupportedInterfaceOrientations"}
10 : <CFString 0x3c43ee84 [0x3c44d100]>{contents = "DTXcode"}
13 : <CFString 0x3c43eeb4 [0x3c44d100]>{contents = "CFBundleInfoDictionaryVersion"}
16 : <CFString 0x3c43c304 [0x3c44d100]>{contents = "CFBundleSupportedPlatforms"}
17 : <CFString 0x1ceabd10 [0x3c44d100]>{contents = "DTXcodeBuild"}
18 : <CFString 0x1cebb610 [0x3c44d100]>{contents = "UIStatusBarTintParameters"}
19 : <CFString 0x3c43ae54 [0x3c44d100]>{contents = "DTPlatformVersion"}
20 : <CFString 0x3c43dbf4 [0x3c44d100]>{contents = "DTPlatformName"}
21 : <CFString 0x3c43ec84 [0x3c44d100]>{contents = "CFBundleDevelopmentRegion"}
22 : <CFString 0x1ceb9ae0 [0x3c44d100]>{contents = "DTSDKBuild"}
}
その後まもなく:
lockdownd[45] <Notice>: 2ff24000 special_case_get: MGCopyAnswer(kMGQReleaseType) returned NULL
TestFlight の削除
これは TestFlight を介して配布されたビルドであり、以前のいくつかのリリースで正常に使用されています。Xcode によってデプロイされたビルドでもこの動作を確認したため、少なくともデプロイに関しては、潜在的な攻撃者として TestFlight を除外しています。さらに、コードから TestFlight 呼び出しを削除し、アプリケーションをテストしました。数日後、問題を観察したので、TestFlight とは関係がないことがわかりました。
すべての NSURLConnections が非同期で実行されることを確認しました
UI のすべての更新がメイン スレッドで実行されることを確認しました。
この時点で私が実際に持っている唯一の情報は、どういうわけか main と UIApplicationMain がスタック上にないということです。どうすればそれが起こりますか?
また、このアプリは SDWebImage を使用しており、この問題が発生したときに表示されるビューに UIImageViews があるため、そこに問題がある可能性がありますが、使用頻度の高いライブラリにこのような明らかな欠陥があるとは思えません。