iOS上运行的代码,每天一次iOS上运行的代码,每天一次(iOS Run Code Once a D

2019-05-17 08:09发布

这个应用程序背后的想法很简单:下载一个文件。 不过这个应用程序将是人谁不经常上网的范围内,所以我需要知道在,说上午9:00,将文件下载到硬盘驱动器。 将有应用程序内的按钮手动做得一样好,但我已经得到了工作。

据我了解,这将是困难的,如果它甚至有可能。 我知道,iOS不喜欢多任务,但我也知道,这确实可以对背景定时器功能。 我愿意接受任何形式的建议,任何人都可能要做到这一点,即使这意味着写一个单独的应用程序。 谢谢。

编辑:我看到有使用通知,甚至也许日历工作的可能性。 这一类的想法,也欢迎。

编辑2:我也看了一些有关外部服务器启动一个应用程序,但它没有给出说明。

Answer 1:

下面是关于后台执行,并通知和定时器等有关的应用程序调度一些活动定期发生的情况。

  1. 应用程序不能在后台执行,除非:

    1. 它要求从OS额外的时间来做到这一点。 这是用做beginBackgroundTaskWithExpirationHandler 。 它没有指定(故意)苹果这一额外的时间有多长,但是在实践中是10分钟左右。

    2. 一个应用程序有一个背景模式中,模式是:网络电话,音频,位置,书报摊。 即使有这些类型的应用程序不能没有一些限制执行中的一个。 本次讨论的其余部分假定应用程序没有后台模式。

  2. 当一个应用程序被暂停它不能做任何事情来直接唤起本身。 它不能事先已经安排一个NSTimer,它不能利用类似performSelector:afterDelay。 等等

    只有这样应用程序可以活跃起来是如果用户确实的东西将其激活。 用户可以从通过下面的做到这一点:

    1. 直接从它的图标,启动程序

    2. 启动应用程序响应先前由应用计划,而这是一个活跃的本地通知。

    3. 启动应用程序响应于由服务器发送的远程通知。

    4. 还有几个国家:比如,如果应用程序注册到处理通过URL启动URL启动; 或者,如果其注册到有能力处理特定类型的内容。

如果一个应用程序在前台运行时的本地/远程通知火灾然后应用程序直接接收它。

如果应用程序是不是当前在前台当本地/远程通知火灾然后应用程序不会收到它。 有没有被通知触发时执行的代码!

只有当用户选择通知将应用程序变得活跃,它可以执行。

需要注意的是,用户可以禁用通知,无论是对整个设备,或只为特定的应用程序,在这种情况下,用户将不会看到它们。 如果设备被关闭时,通知是因火灾则丢失。



Answer 2:

我敢肯定这是不可能的,顶多你可以做的就是发送推送通知给用户,让他们在需要时手动更新。



Answer 3:

你可以使用本地通知。 当用户打开时出现的通知他们执行代码。 您可以设置本地通知在指定的时间间隔重复发生(如每天,每小时,每周,等等)。 这仍然需要用户打开该应用获取过程开始。

UILocalNotification类参考

一旦委托方法火灾,你只能得到几秒钟来执行代码。 注册一个长期运行的后台任务,并下载任何你需要做的。 如果不能完成在的10分钟得到任务下载,那么你需要重新考虑你的下载策略。

苹果多任务和Backgrounding

我们正在使用iOS应用上,我的工作这个相同的概念,因此,如果您设置正确,这将工作。

UPDATE

对于那些好奇这将如何工作,你只需要实现UILocalNotification委托方法。 他们从UIApplicationDelegate应该已经到位继承。

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// start your long running bg task here and update your file

}

**更新2 **

马丁轰的回答是最正确为止。 但是,这引出了一个问题,如果用户从来没有打开的应用程序,什么是下载它们永远不会看到数据的意义呢? 一个反复出现的本地通知,提醒他们打开应用程序和更新可能是最好的办法,但仍需要用户与应用互动,如果他们想要保持当前和最新的。



Answer 4:

背景应用程序有一个设定的时间限制(我相信10分钟路程,但不要引用我认为,它可能是以下)完成任何他们正在研究。 您将无法使用后台任务做你想要什么。

你可以做的设置与上次下载的日期的NSUserDefault。 在启动检查保存日期,如果日期不是当前日期,它是上午9点后,开始下载编程。



Answer 5:

你试过以下?

if ([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0)
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:600];


- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    completionHandler(UIBackgroundFetchResultNewData);
}


文章来源: iOS Run Code Once a Day