2

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

  • 伪装成 VoIP 应用程序不是一个好的选择(不会被批准,请参阅iPhone:重复后台任务
  • 我不能使用位置更新,如果用户不四处走动,它应该可以工作

在模拟器中,使用beginBackgroundTaskWithExpirationHandlerwithdispatch_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(...)想重复一个网络请求或做一些有用的事情,但应用程序永远不会真正进入完全后台模式。有没有人有这种方法的经验?提示:仅在模拟器上测试,没有其他正在运行的应用程序。

4

3 回答 3

4

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 专注于整体电池使用情况和设备响应能力;一旦您的应用程序在后台运行,设计得可以优雅地工作,而不管给予多少关注。)

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


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

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

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

于 2016-05-18T23:23:25.893 回答
3

您无法在普通 iPhone 上执行此操作。如果你找到了解决办法,Apple 最终会修复漏洞并拒绝你的应用程序。

我不知道越狱的iphone,我怀疑它们可能会以某种方式出现。

于 2012-11-25T19:00:22.440 回答
0

我认为您可以使用“本地通知”来触发在特定时间发生的事情。

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/SchedulingandHandlingLocalNotifications.html#//apple_ref/doc/uid/TP40008194-CH5-SW1

于 2017-11-22T21:35:50.783 回答