Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在应用程序处于后台时重复任务(例如,从服务器中提取某些内容),而不使用APN_Ios_Background_Push Notification - Fatal编程技术网

Ios 在应用程序处于后台时重复任务(例如,从服务器中提取某些内容),而不使用APN

Ios 在应用程序处于后台时重复任务(例如,从服务器中提取某些内容),而不使用APN,ios,background,push-notification,Ios,Background,Push Notification,除了使用推送通知触发应用程序定期运行某些代码(特别是:从服务器拉取新消息)之外,有没有一种苹果批准的好方法 伪装成VoIP应用不是一个好的选择(不会被批准,请参阅) 我不能使用位置更新,如果用户不移动,它应该可以工作 在模拟器中,使用beginBackgroundTaskWithExpirationHandler和dispatch\u async可以为您提供10分钟的后台时间,我发现如果后台“自行重新启动”,则BackgroundTimeResisting属性似乎总是重置为10分钟。这是密码

除了使用推送通知触发应用程序定期运行某些代码(特别是:从服务器拉取新消息)之外,有没有一种苹果批准的好方法

  • 伪装成VoIP应用不是一个好的选择(不会被批准,请参阅)
  • 我不能使用位置更新,如果用户不移动,它应该可以工作
在模拟器中,使用
beginBackgroundTaskWithExpirationHandler
dispatch\u async
可以为您提供10分钟的后台时间,我发现如果后台“自行重新启动”,则
BackgroundTimeResisting
属性似乎总是重置为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];

    /* ... */
}

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

在普通iphone上无法做到这一点。如果你找到了一种方法,苹果最终会修补漏洞并拒绝你的应用


我不知道被越狱的iPhone,我怀疑它可能以某种方式出现在它们身上。

苹果批准的替代品列在

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

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


因此,“后台提取”是相关的选择。例如,请参阅“机会主义地下载远程内容”

然而,这并没有给你(开发者)在Android中应有的控制程度。有“setMinimumBackgroundFetchInterval”,但请注意这是一个最小值:iOS决定何时调用应用程序进行下一次后台提取。(苹果专注于电池的整体使用和设备的响应能力;一旦你的应用程序进入后台,无论它受到的关注有多少,设计都要优雅地工作。)

注意:如果用户杀死你的应用程序,“后台抓取”将被杀死。这是故意的。(从用户的角度来看,这是一件好事:大多数应用程序如果被杀死,应该保持死机状态。)


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

非常关注电池的用户可能会定期关闭所有应用程序。如果他们今天不想被你的应用程序打扰,他们会忽略或删除你的应用程序的推送通知。认为这是一件好事:在不积极使用你的应用程序的日子里,你不会因为耗尽电池而惹恼用户。 喜欢严格控制手机运行内容的用户将不允许为您的应用发送推送通知。(例如,我讨厌每天收到短信通知。不要打电话给我,我会打电话给你。)在这种情况下,一旦你的应用程序被杀死,你就无能为力(因为推送通知是恢复你死去的应用程序的唯一方法,而我,用户,对此说了“不”)。一定要考虑如何为这样的用户服务。(当他们第一次重新打开你的应用程序时,你的内容可能会过时。)

我认为你可以使用“本地通知”在特定时间触发某些事件