越狱设备 [UIDeviceRGBColor superview] 上 loadNibNamed 时可能崩溃:无法识别的选择器

Posted

技术标签:

【中文标题】越狱设备 [UIDeviceRGBColor superview] 上 loadNibNamed 时可能崩溃:无法识别的选择器【英文标题】:Possible crash when loadNibNamed on jailbreak devices [UIDeviceRGBColor superview]: unrecognized selector 【发布时间】:2014-03-26 05:06:49 【问题描述】:

我的代码如下所示:

CGRect screenRect = [[UIScreen mainScreen] bounds];
SomeView *infoView;
if(screenRect.size.height != 568.0)
    // iPhone 5/5s users crash in the next line
    infoView = [[[NSBundle mainBundle] loadNibNamed:@"SomeViews" owner:self options:nil] objectAtIndex:1];  
else
    infoView = [[[NSBundle mainBundle] loadNibNamed:@"SomeViews" owner:self options:nil] objectAtIndex:0]

但是,我从 Crashlytics 获得了一些针对 iPhone 5/5s 用户的崩溃报告,作为上述代码中的注释。

我很惊讶 5/5 秒的高度不是 568,因为我的应用只支持纵向。我有数百个活跃用户,只有 4 个用户发生了 12 次崩溃。

即使 iPhone 5/5s 设备加载了错误的笔尖(适用于 3.5 英寸屏幕),也不会导致崩溃。 (我刚刚测试过。)

http://crashes.to/s/1ddc169b801

Crashlytics 还向我展示了 90% 的崩溃发生在越狱设备上,这让我想知道越狱设备是否可以以任何方式改变这个值?

Fatal Exception: NSInvalidArgumentException
-[UIDeviceRGBColor superview]: unrecognized selector sent to instance 0x14732db0

0
CoreFoundation  
__exceptionPreprocess + 130
1
libobjc.A.dylib 
objc_exception_throw + 38
2
CoreFoundation  
-[NSObject(NSObject) doesNotRecognizeSelector:] + 202

...

22
UIKit   
-[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 138
23
Banck   
BKAddRecordPagingViewController.m line 244 // line 244 is loadNibNamed
-[BKAddRecordPagingViewController viewDidLoad]

崩溃报告链接显示了原因,但我不知道为什么,因为我在 nib 文件中只使用了内置的 UILabel、UIImageView、UITextView。

谁能给我一些建议以更好地检查是否在越狱设备上使用 4 英寸屏幕? 第二个问题是 loadNibNamed 内部崩溃的原因是什么?

【问题讨论】:

您的应用程序的性质是否可能会吸引喜欢越狱手机的同一类型的用户?很难想象越狱是导致这次崩溃的原因。 我不这么认为。只有不到 10% 的其他崩溃来自越狱手机。 今天还有几起死机,都是越狱手机造成的。 crashes.to/s/1ddc169b801 我也收到了这些崩溃报告,尽管我什至没有告诉我是哪个控制器导致了问题。我有一些加载xib的。 1 个应用显示 100% 越狱,另一个显示 33% 越狱。 我只从 40k 中的 24 个用户那里得到它,所以不太担心,但我很想知道原因,特别是因为它似乎也发生在没有 JB 设备上(除非他们可能有让 Crashlytics 认为他们不是 JB 的方法)。 【参考方案1】:

我怀疑 Cydia Tweak “Eclipse” 有一个过度发布的错误。 (Eclipse.dylib 列在您的崩溃跟踪中)

您的 NIB 中的 UIView 实例正在被释放,并且内存被重用于 UIDeviceRGBColor 实例。

看看您是否可以使用 Cydia Eclipse 插件进行复制?您可以使用 Instruments 跟踪您的分配。

【讨论】:

我向列出的 Eclipse 的作者发送了一封电子邮件。如果他回复,我会通知您。我在任何地方都找不到它的源代码。 如果库 Eclipse.dylib 也被加载了,你可能会拒绝加载 这是一个有趣的想法。我们甚至会从哪里开始检测它?也许只是抛出一条消息。 如果您发现 Eclipse 独有的符号名称,您可以调用 dlsym 并查看它是否返回非零结果。 (要在 Eclipse 上查找符号,请下载 dylib 并在其上运行nm 工具) 没错,我可以确认它是由以下原因引起的:iphonehacks.com/2014/01/… 几个月前我在 HockeyApp 中看到了这个崩溃,我刚刚联系了一位遇到这些崩溃的用户。跨度> 【参考方案2】:

使用 UIScreen mainScreen

CGRect screenBounds = [[UIScreen mainScreen] bounds];
if (screenBounds.size.height == 568) 
// code for 4-inch screen
 else 
// code for 3.5-inch screen

我觉得跟jb没关系。

【讨论】:

我不知道它是否相关,但在您的代码中您正在比较浮点数(高度 == 568.0)。你永远不应该这样做:在两种情况下都使用整数 ((int)screenBounds.size.height == 568)【参考方案3】:

建议一:

不要将浮点数等同于 568.0f。只需检查它是否大于 567 且小于 1024

建议 2:

此代码库有一种非常直接的方法来检测各种 ios 设备。 --https://github.com/froztbytes/UIDeviceHardware

【讨论】:

我不认为 if 语句是导致崩溃的原因。我遇到了同样的崩溃,但我只为表格单元加载 .xib。

以上是关于越狱设备 [UIDeviceRGBColor superview] 上 loadNibNamed 时可能崩溃:无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

iOS安全攻防之越狱设备检测

一键开机越狱安装Cydia软件

iOS越狱 Checkra1n Linux越狱

IOS判断设备是否已越狱

使用 Apple 的工具和证书为越狱设备构建 IPA

判断iOS设备是否越狱