performSelector "backgroundRefreshStatus" 在 iOS 7 上崩溃
Posted
技术标签:
【中文标题】performSelector "backgroundRefreshStatus" 在 iOS 7 上崩溃【英文标题】:performSelector "backgroundRefreshStatus" crashes on iOS 7 【发布时间】:2013-11-05 16:22:36 【问题描述】:我正在使用 Xcode 5/ios SDK 6.1 进行构建。如果应用在 iOS 7.x 设备上运行,则应检查是否为应用设置了“设置 -> 常规 -> 背景应用刷新”设置。由于此属性仅在 iOS 7 上可用,我正在这样做:
if([[UIApplication sharedApplication] respondsToSelector:@selector(backgroundRefreshStatus)])
NSInteger outcome=[[[UIApplication sharedApplication] performSelector:@selector(backgroundRefreshStatus)] integerValue];
//do something with "outcome"
但是...应用程序在 iOS 7 上的“performSelector”行崩溃,这很奇怪,因为它通过了“respondsToSelector”调用?有谁知道为什么?我也尝试了 NSSelectorFromString(@"backgroundRefreshStatus") 得到相同的结果。
【问题讨论】:
你需要 id 结果=[[UIApplication sharedApplication] performSelector:@selector(backgroundRefreshStatus)]; 如果使用 ARC,将整数分配给id
可能会崩溃。
如果您想使用 iOS 7 功能,为什么要针对 6.1 构建?
感谢您的 cmets。我编辑了原始帖子。它仍然在 iOS 7 设备上崩溃。
【参考方案1】:
那里有很多不必要的代码。除非 backgroundRefreshStatus
选择器在 iOS 7 之前作为私有 API 存在,否则您不需要版本检查。
你使用@selector
也是不对的,不需要使用performSelector
,直接调用方法即可:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(backgroundRefreshStatus)])
UIBackgroundRefreshStatus refreshStatus = [[UIApplication sharedApplication] backgroundRefreshStatus];
【讨论】:
它不会与 iOS 6 SDK 一起编译,因为那里既没有定义“UIBackgroundRefreshStatus”也没有定义“backgroundRefreshStatus”! 您真的应该使用 iOS 7 SDK 进行开发,并通过使用检查接收器respondsToSelector
等技术来实现与 iOS 6 的向后兼容,而不是使用旧的 SDK 并尝试“向前兼容” '。如果您坚持使用较旧的 SDK(实现与 iOS 6 和 7 的兼容性不是必需的),则在这种情况下您必须使用 NSInvocation,因为 UIBackgroundRefreshStatus 是一种原始类型,非常混乱。跨度>
【参考方案2】:
您正在使用字符串作为选择器。尝试不使用字符串:
UIApplication *app = [UIApplication sharedApplication];
if([app respondsToSelector:@selector(backgroundRefreshStatus)])
UIBackgroundRefreshStatus outcome = [app performSelector:@selector(backgroundRefreshStatus)];
// or outcome = [app backgroundRefreshStatus]
【讨论】:
你是对的字符串。这是我的错,因为在我的代码中它是正确的。我改变了我原来的帖子。您的解决方案的问题是“UIBackgroundRefreshStatus”在 iOS 6.1 SDK 中不可用,因此无法编译。我尝试的是: NSInteger status=[[[UIApplication sharedApplication] performSelector:@selector(backgroundRefreshStatus)] integerValue];但没有成功。以上是关于performSelector "backgroundRefreshStatus" 在 iOS 7 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章