iPhone 应用崩溃:UIKit

8
2015年10月29日更新:可能已经找到了原因。根据这篇StackOverflow的文章,我正在创建渐变层 - 它对我和我测试过的每个人都完美地工作,但其他人会有问题吗?
CAGradientLayer * g  = [CAGradientLayer layer];
UIColor * colourFrom = [UIColor colorWithRed:0.1 green:0.7 blue:0.3  alpha:1.0];
UIColor * colourTo   = [UIColor colorWithRed:0.1 green:0.8 blue:0.4 alpha:1.0];

g.frame        = self.view.bounds;
g.cornerRadius = 10;
g.startPoint   = CGPointMake(0.0, 0.5);
g.endPoint     = CGPointMake(1.0, 0.5);
g.colors       = [NSArray arrayWithObjects:(id)[colourFrom CGColor],
                                           (id)[colourTo CGColor],
                                           nil];
2015年10月27日更新: 仍然从Crashlytics中看到这些崩溃报告。
2015年10月26日更新: 我在StackOverflow上找到了这个帖子,它似乎与我遇到的问题完全相同(但没有答案...),不过他们正在使用Facebook/Twitter操作表,而我没有。这只是为了帮助诊断问题。

刚刚发布了一个应用程序到App Store,我们发现有小部分用户(约2%)在Crashlytics中出现以下崩溃:

看起来这只出现在iOS 9上,但在所有设备上都会出现。

Fatal Exception: NSInternalInconsistencyException Only RGBA or White color spaces are supported in this situation.

就我个人而言,我正在运行iOS 9.1的iPhone 6,并没有遇到这个问题。我也尝试在模拟器上测试,也没有问题,所以我不确定这个错误实际上是如何出现的。以下是来自Crashlytics的堆栈跟踪。

似乎有一个UIColor被添加到NSDictionary中而没有被编码,但我在应用程序中没有这样做。它似乎也可能与UIRemoteViewController有关,但我在应用程序中没有使用它(除非使用Facebook登录会导致这种情况 - 我已经尝试在手机和模拟器上使用Facebook登录,但是我仍然无法让这个错误出现)。

有人知道是什么原因导致这个问题吗?


Thread : Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 6512725832 __exceptionPreprocess
1  libobjc.A.dylib                6869942144 objc_exception_throw
2  CoreFoundation                 6512725528 +[NSException raise:format:]
3  Foundation                     6528403996 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  UIKit                          6606881444 -[UIColor encodeWithCoder:]
5  Foundation                     6528169072 _encodeObject
6  Foundation                     6528197336 +[NSKeyedArchiver archivedDataWithRootObject:]
7  UIKit                          6609904352 -[_UIAppearanceRecorder _recordInvocation:withClassName:containerClassNames:traitCollection:selectorString:forRemoteProcess:]
8  UIKit                          6609884356 __54+[_UIAppearance _recordersExcludingSource:withWindow:]_block_invoke
9  CoreFoundation                 6511594744 __65-[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:]_block_invoke
10 CoreFoundation                 6511594448 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:]
11 UIKit                          6609883592 +[_UIAppearance _recordersExcludingSource:withWindow:]
12 UIKit                          6611900724 UIViewServiceCurrentAppearanceSerializedRepresentations
13 UIKit                          6610654700 +[_UIRemoteViewController _requestViewController:traitCollection:fromServiceWithBundleIdentifier:service:connectionHandler:]
14 UIKit                          6610654160 +[_UIRemoteViewController requestViewControllerWithService:connectionHandler:]
15 UIKit                          6609355772 __117-[NSExtension(UIViewControllerAdditions) instantiateViewControllerWithInputItems:listenerEndpoint:connectionHandler:]_block_invoke_2
16 libdispatch.dylib              6878402280 _dispatch_call_block_and_release
17 libdispatch.dylib              6878402216 _dispatch_client_callout
18 libdispatch.dylib              6878424496 _dispatch_main_queue_callback_4CF
19 CoreFoundation                 6512427512 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
20 CoreFoundation                 6512418912 __CFRunLoopRun
21 CoreFoundation                 6511561888 CFRunLoopRunSpecific
22 GraphicsServices               6701891720 GSEventRunModal
23 UIKit                          6602887164 UIApplicationMain
24 MyApp                          4296179280 main (main.m:16)
25 libdyld.dylib                  6878603448 start

使用代码示例更新

这个函数在application:didFinishLaunchingWithOptions中被调用:

// Make the app look pretty
// Turn the status bar color white
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// Nav bar: Background colour
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0]];
// Nav bar: White text
[[UINavigationBar appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0], NSForegroundColorAttributeName, nil]];
// Nav bar: Tint colour
[UINavigationBar appearance].tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"TintNavBar"]];
// Tab Bar: Background color
[[UITabBar appearance] setBarTintColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0]];
// Tab bar: Tint colour
[UITabBar appearance].tintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"gradientSmall"]];
// UIControlSegment: Change the colours to just white
// @url https://dev59.com/CWox5IYBdhLWcg3wsGaC#21484829
[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[Ui getColour:UI_BODY_PRIMARY]}
                                               forState:UIControlStateNormal];

你能发布导致程序崩溃的代码行吗? - soumya
@Sujania 不,因为我不确定它实际来自哪里 - 我无法重现它,并且堆栈跟踪也没有指示出它的来源。 - cjhill
根据我的阅读,这是关于UIApperence或[UIColor colorWithPatternImage:]的错误。 - Nik
2个回答

3
根据我的阅读,这是在iOS 6中使用UIApperence或[UIColor colorWithPatternImage:]时出现的错误。因此,请检查您的代码中是否有该代码。如果您的应用程序中有该代码,则使用纯色。以下是我得出这个结论的一些链接:1) IOS erro at Posting to Facebook with the native Share dialog - UICGColor encodeWithCoder;2)UIApperance and various crashes;3)UIApperance and various crashes;4)iOS 6 MFMailComposeViewController: Only support RGBA or the White color space, this method is a hack

有可能是因为我在UIAppearance中设置了“colorWithPatternImage”……但是该应用程序仅适用于iOS 7及以上版本,而Crashlytics报告称它仅在iOS 9设备上崩溃(9.0、9.0.2和9.1)。 - cjhill
请问您能否发布一些关于您正在设置UIAppearance的控件的代码?您可以尝试像这样设置外观。[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nav_bar"] forBarMetrics:UIBarMetricsDefault]; - Nik
当然,我已经修改了原帖 - 它在底部。 - cjhill
你可以尝试使用colorwithRGB而不是colorWithPatternImage,并检查应用程序是否崩溃吗? - Nik
好的,是的,我可以。问题是我手头上的任何设备都没有遇到这个崩溃问题。我需要将代码更改推送到应用商店,看看会发生什么。我还需要看看设计师/老板是否乐意尝试一个星期的实验。 - cjhill

2
您的问题是通过UIColor实现的NSCoding无法编码图案颜色。 他们的颜色空间是kCGColorSpaceModelPattern,正如消息所说,它会破坏NSCoding因此不允许使用。

可以通过运行以下代码轻松证明这一点:

UIColor* color = [UIColor colorWithPatternImage:[UIImage imageNamed:@"whatever"]];
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:color];

[UIColor encodeWithCoder]中出现了同样的断言失败。

至于为什么要编码UIColors,这就不太清楚了。很可能与_UIAppearanceRecorder有关,但是谁知道呢。只要停止使用图案颜色,你就应该没问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接