gpt4 book ai didi

ios - UILocalNotification 在后台 10 分钟后不提示

转载 作者:行者123 更新时间:2023-11-29 13:01:02 25 4
gpt4 key购买 nike

didFinishLaunchingWithOptions 中,计时器循环每 1 分钟调用一次函数 httpRequest

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//rest of code

NSTimer *notifyTimer = [NSTimer timerWithTimeInterval:60 target:self selector:@selector(httpRequest) userInfo:nil repeats:YES];//7200.0
[[NSRunLoop mainRunLoop] addTimer:notifyTimer forMode:NSDefaultRunLoopMode];

return YES;
}

按下主页按钮后,应用程序将进入后台并调用函数 applicationDidEnterBackground 因此后台任务开始。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier bgTask;
UIApplication *app = [UIApplication sharedApplication];
expirationHandler = ^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
};
bgTask = UIBackgroundTaskInvalid;
bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];

}

通过 httpRequest 函数,我每隔 1 分钟就会从 Web 服务器获取 Y,因此 UILocalNotification 每秒钟触发一次。

-(NSString *)httpRequest {

NSURL *url = [NSURL URLWithString:@"http://192.168.10.67/t.php"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

NSString *userAgent = [NSString stringWithFormat:@"bgTaskTest-IOS"];
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"];

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];

[request setHTTPMethod:@"GET"];

[request setTimeoutInterval:25];

NSURLResponse *response;

NSData *dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

NSString *stringReply = [[NSString alloc] initWithData:dataReply encoding:NSASCIIStringEncoding];

if ([stringReply isEqualToString:@"Y"]) {
[self showLocalNotification:nil]; //calling UILocalNotification
} else {
NSLog(@"%@",stringReply);
}

return stringReply;
}

函数 showLocalNotification 根据 httpRequest 函数的响应每 1 分钟调用一次。

-(void)showLocalNotification {

NSString *msg = @"test message";

[[UIApplication sharedApplication] cancelAllLocalNotifications];

UILocalNotification *_localNotification = [[UILocalNotification alloc]init];

_localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];

_localNotification.timeZone = [NSTimeZone defaultTimeZone];

_localNotification.alertBody = msg;

_localNotification.soundName = UILocalNotificationDefaultSoundName;

_localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber]+1;

[[UIApplication sharedApplication] scheduleLocalNotification:_localNotification];
//[[UIApplication sharedApplication] presentLocalNotificationNow:_localNotification];

}

一切正常,当应用程序在后台时,每 1 分钟通知提示一次。

但我的问题是后台任务的生命周期是 10 分钟,所以 10 分钟后没有通知提示。出于这个原因,我在 beginBackgroundTaskWithExpirationHandler 中再次启动后台任务,但我的应用程序在此时重新启动后台任务时终止。

当应用程序处于后台时,我无法使用超过 10 分钟的通知。

请任何人帮助我。

最佳答案

没有办法(在应用商店指南内)在后台运行任意代码超过十分钟(如您所见)。

10 分钟后,您的应用将被暂停。有几种方法可以解决这个问题,注册其他后台模式(例如后台音频、连续播放无声文件)或后台 voip 或后台定位服务。

这些 hacky 解决方法将使您的应用程序未暂停,但是您的应用程序将不会获得商店的批准。

在 iOS7 中,在后台运行代码方面取得了进步,但是没有任何东西可以满足您的需求。

因此,如果这是供您自己使用的应用程序,请使用私有(private) API 或我上面建议的方法,但是如果您想在商店中获取此应用程序,恐怕您就不走运了。

关于ios - UILocalNotification 在后台 10 分钟后不提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19762071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com