如何以编程方式打开和关闭背景提取

时间:2015-01-18 16:30:32

标签: ios background-process

我有一个iOS应用程序,它使用后台提取来定期在后台下载新数据。过了一段时间,如果用户在试用期后没有购买完全访问权限,我希望能够关闭此功能。我该怎么做?

选项是在调用performFetchWithCompletionHandler时根本不做任何事情。问题是,我必须调用completionHandler并报告是否有任何新数据可用。如果我返回UIBackgroundFetchResultNoData,iOS可能会在一段时间后决定停止调用performFetchWithCompletionHandler。我也可以返回UIBackgroundFetchResultNewData,但正如Apple声明的那样,“声称内容可用但随后不下载任何内容”的应用程序不太可能获得执行时间。

另一种选择是使用较大的值调用setMinimumBackgroundFetchInterval,但这是一个相当丑陋的黑客,我不知道这个值有多大。

还有其他选择吗?

2 个答案:

答案 0 :(得分:4)

我不知道这会有效,但它应该有效。

如您所知,要使用后台提取,您需要做两件事:

  1. 实施UIApplicationDelegate方法application:performFetchWithCompletionHandler:
  2. fetch后台模式添加到Info.plist
  3. 当然,选项2在运行时无法更改。但是,您可以使用技巧以编程方式指示是否已实现委托方法。

    在您的app委托类中,添加以下方法:

    - (BOOL)respondsToSelector:(SEL)aSelector {
        if (aSelector == @selector(application:performFetchWithCompletionHandler:)) {
            // return YES if in trial mode or user has full access.
            // return NO otherwise
        }
    
        return [super respondsToSelector:aSelector];
    }
    

    假设由于委托方法是可选的,因此如果启用fetch模式,iOS框架不会盲目地调用委托方法。希望iOS框架首先检查代理是否首先响应委托方法。

    您需要尝试此操作,看看是否为respondsToSelector:委托方法调用了application:performFetchWithCompletionHandler:方法。如果是,那么这将有效。如果没有,那么对Apple感到羞耻。

答案 1 :(得分:1)

不是答案,但它想指出一些问题。您应该知道,您为setMinimumBackgroundFetchInterval指定的值纯粹是建议性的。 Apple会根据用户使用频率的频率来确定让您的应用获取新内容的频率。这个this link了解更多信息。

  

Apple提供了一种算法,根据您自己对应用的使用情况,定义后台提取应触发的频率。如果你经常使用它,那么它会尽可能频繁地获取,但如果你每天下午4点使用,那么后台提取应该在之前触发,所以你的数据在你启动时会更新。

此外,如果用户从不使用您的应用,则可能无法获取后台内容,在这种情况下,您必须在应用启动时进行更新。