2

我正在使用 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") ,结果相同。

4

2 回答 2

4

你那里有很多不必要的代码。除非backgroundRefreshStatus选择器在 iOS 7 之前作为私有 API 存在,否则您不需要版本检查。

您的使用@selector也不正确,您不需要使用performSelector,只需调用方法:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(backgroundRefreshStatus)]) {
    UIBackgroundRefreshStatus refreshStatus = [[UIApplication sharedApplication] backgroundRefreshStatus];
}
于 2013-11-05T16:31:17.720 回答
1

您正在使用字符串作为选择器。尝试不使用字符串:

UIApplication *app = [UIApplication sharedApplication];
if([app respondsToSelector:@selector(backgroundRefreshStatus)])
{
    UIBackgroundRefreshStatus outcome = [app performSelector:@selector(backgroundRefreshStatus)];
    // or outcome = [app backgroundRefreshStatus]
}
于 2013-11-05T16:29:57.933 回答