gpt4 book ai didi

ios - 在没有 APN 的情况下,当应用程序处于后台时重复执行任务(例如从服务器中提取内容)

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:08:59 26 4
gpt4 key购买 nike

除了使用推送通知触发应用程序定期运行某些代码(特别是:从服务器拉取新消息)之外,是否有 Apple 批准的良好替代方案?

  • 伪装成 VoIP 应用程序不是一个好的选择(不会被批准,参见 iPhone: repeating background task)
  • 我不能使用位置更新,如果用户不四处走动,它应该可以工作

在模拟器中,使用 beginBackgroundTaskWithExpirationHandlerdispatch_async 会给你 10 分钟的后台时间,我发现如果后台“自行重启”, backgroundTimeRemaining 属性似乎总是​​重置为 10 分钟。这是代码。

- (void) work
{
UIApplication *application = [UIApplication sharedApplication];

NSLog(@"bg %@ (T-%.1f seconds)",
[NSDate date],
[application backgroundTimeRemaining]);
sleep(10);

[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;

[self startTask];
}

- (void)startTask
{
UIApplication *application = [UIApplication sharedApplication];
_bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"expired at %@", [NSDate date]);

[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,
0),
^{ [self work]; });
}

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
/* ... */

[self startTask];

/* ... */
}

在后台运行某些东西是否是一种公认​​的做法?我的意思是,大多数时候我只是sleep(...),直到我想重复网络请求或做一些有用的事情,但应用程序永远不会真正进入完全后台模式。有没有人有这种方法的经验?提示:仅在没有其他正在运行的应用程序的情况下在模拟器上进行测试。

最佳答案

Apple 批准的替代品列在 https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

查看“表 3-1 应用的后台模式”,从服务器重复获取信息的两个相关替代方案是“后台获取”或“远程通知”。

“远程通知”是推送通知,您说您不想使用它。


因此,“后台获取”是相关的选择。例如,参见 https://blog.newrelic.com/2016/01/13/ios9-background-execution “趁机下载远程内容”。

但是,这并没有为您(开发人员)提供您在 Android 中拥有的控制程度。有“setMinimumBackgroundFetchInterval”,但请注意这是一个最小值:iOS 决定何时调用您的应用程序以进行下一次后台提取。 (Apple 专注于整体电池使用情况和设备响应能力;一旦您的应用程序在后台运行,请设计为优雅地工作,无论给予多少关注。)

注意:如果用户终止了您的应用,“后台获取”也将随之终止。这是设计使然。 (从用户的角度来看,这是一件好事:大多数应用程序在被杀死后应该保持死状态。)


考虑结合使用“推送通知”(远程通知)和“后台获取”。例如,如果用户允许您的应用程序“推送通知”,则每天推送一次,并向用户发送文本通知。如果他们打开该通知,那将打开您的应用程序。然后开始数据获取。如果他们点击主页按钮,则使用“后台获取”继续在一天中定期获取数据。

对电池非常敏感的用户可能会定期关闭所有应用程序。如果他们今天不想被您的应用程序打扰,他们将忽略或删除您应用程序的推送通知。认为这是一件好事:您不会在用户不积极使用您的应用的日子里耗尽电池而惹恼他们。

喜欢严格控制手机上运行的内容的用户将不允许您的应用推送通知。 (例如,我讨厌每天收到短信通知。不要给我打电话,我会调用你。)在这种情况下,一旦你的应用程序被杀死,你就无能为力了(因为推送通知是唯一的方式复活你死掉的应用程序,而我,用户,对此说了“不”)。请务必考虑您将如何为此类用户提供服务。 (当他们第一次重新打开您的应用时,您的内容可能已经过时。)

关于ios - 在没有 APN 的情况下,当应用程序处于后台时重复执行任务(例如从服务器中提取内容),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553718/

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