目标是通知最终用户有关应用在后台时更改的可访问性。
广播方法 NSNotificationCenter 无法在后台运行。 第二种方法我在 applicationDidEnterBackground 中尝试了 beginBackgroundTaskWithExpirationHandler 但与之相关的问题:
a) 10分钟的时间限制
b)我调用一个结束循环来检测在主线程上运行的可达性状态,结果它会阻塞UI。代码: -
-(void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Application entered background state.");
// bgTask is a property of the class
if (isUserLogin) {
NSAssert(self.bgTask == UIBackgroundTaskInvalid, nil);
bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
dispatch_async(dispatch_get_current_queue(), ^{
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
});
}];
dispatch_async(dispatch_get_current_queue(), ^{
while ([application backgroundTimeRemaining] > 1.0) {
curReach = [[utilities sharedUtility]reachabilityChanged];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
NSLog(@"-----------back ground task------------");
if (netStatus == ReachableViaWWAN || netStatus == ReachableViaWiFi) {
//isNetworkMessagePopup = YES;
}
else{
// if (isNetworkMessagePopup) {
// isNetworkMessagePopup = NO;
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = FORMAT_UNABLE_TO_CONNECT_SERVER_DUE_TO_NO_INTERNET;
localNotif.alertAction = NSLocalizedString(@"Read Message", nil);
localNotif.soundName = @"pushNotification.caf";
localNotif.repeatInterval = 5;
//localNotif.applicationIconBadgeNumber = 1;
[application presentLocalNotificationNow:localNotif];
[localNotif release];
break;
//}
}
}
}
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
});
}
}
请建议我可以在iOS中通知用户更改可访问性和应用程序处于后台状态吗?
如果是,那么我怎样才能做到这一点。
感谢。
答案 0 :(得分:2)
您可以使用iOS App Programming Guide中所述的后台获取功能来检查覆盖能力,并在网络不可用时发布本地通知。
无法保证这种情况的调用频率 - 可能是每隔几分钟或更长时间 - 当然不是每隔几秒钟。