Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
Objective c 后台提取似乎未启动_Objective C_Xcode6_Ios8.1_Background Fetch - Fatal编程技术网

Objective c 后台提取似乎未启动

Objective c 后台提取似乎未启动,objective-c,xcode6,ios8.1,background-fetch,Objective C,Xcode6,Ios8.1,Background Fetch,在我的应用程序中,我执行了下面列出的操作,并在应用程序获取例程中添加了计数器,以突出显示iOS 8.1调用获取的次数 打开背景模式并启用背景提取 为“performFetchWithCompletionHandler”编写了代码。NSLog消息指示提取过程的开始和结束。计数器位于这些消息之间 在“didFinishLaunchingWithOptions”中添加了代码。但是,我没有使用“setMinimumBackgroundFetchInterval”,而是使用了60秒的双精度 当我在调试中通

在我的应用程序中,我执行了下面列出的操作,并在应用程序获取例程中添加了计数器,以突出显示iOS 8.1调用获取的次数

  • 打开背景模式并启用背景提取
  • 为“performFetchWithCompletionHandler”编写了代码。NSLog消息指示提取过程的开始和结束。计数器位于这些消息之间
  • 在“didFinishLaunchingWithOptions”中添加了代码。但是,我没有使用“setMinimumBackgroundFetchInterval”,而是使用了60秒的双精度
  • 当我在调试中通过设置“Simulate Background Fetch”来测试代码时,所有的工作都像预期的那样完美,没有任何问题。计数器工作并显示预期值

    然而,当我在iPhone上上线时,启动应用程序,然后点击主页按钮进入后台,等待一两个小时或一夜。没有发生任何事情,没有获取,没有下载,所有计数器保持为零

    如果我不能让它工作,我将需要创建自己的后台线程并直接管理它,我不希望这样做


    非常感谢您的任何意见和建议。

    iOS以某种方式获取背景信息。它唤醒了它认为用户经常使用的应用程序。尝试在唤醒手机几次后打开应用程序

    正如kkarayannis所写,iOS将了解多久调用一次你的应用程序。我看到了和我第一次写背景资料时一样的行为。我认为,你不仅应该手动打开你的应用程序,还应该触发手动刷新。IOS将了解到用户希望定期加载数据,并开始自己加载数据


    您是否也尝试过使用“setMinimumBackgroundFetchInterval”而不是120秒?也许这段时间太短了。不过,为了更好地理解,您也可以跳过代码。

    从iOS 8开始,我的两个应用程序都出现了同样的问题。在iOS 7中,后台刷新触发非常可靠。在iOS 8中,它只是停止了。如果我从xcode启动任何一个应用程序进入后台获取模式,一切都会正常工作。在iOS中,后台刷新本身刚刚停止触发。我有一个充满希望的理论,我现在正在尝试。这是我的想法

    如果用户强制将应用程序从多任务屏幕中删除,iOS将从后台刷新中排除应用程序。苹果是如何实现这种行为的?一种方法是将最小提取间隔设置为UIApplicationBackgroundFetchIntervalNever。简单的豌豆。让我们假设他们就是这样做的。您的应用程序是在每次启动时设置最小提取间隔,还是仅在首次启动时设置

    在我的例子中,我只是在我的应用程序的初始设置中设置最小提取间隔。如果用户强制终止了应用程序,并且iOS实际上正在将最小提取间隔设置为UIApplicationBackgroundFetchIntervalNever,那么我的应用程序将处于从不状态。我在我的一个应用程序中做了一个小改动,这样它就可以在每次启动时设置最小的获取间隔。到目前为止还不错

    更新:

    在我的背景下一切都很好

    目前正在开发的我的应用程序和正在开发的我的应用程序都再次可靠地触发后台抓取

    执行此操作的代码可能非常简单

    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:minimumBackgroundFetchInterval];
    
    每次调用应用程序启动都会起到作用,但是,您会考虑是否将该值设置为适合应用程序的当前状态。在我的例子中,我的一个应用程序是音乐会列表应用程序。如果用户还没有选择音乐会的地点,那么设置最小背景提取间隔是没有意义的。我有一个NSUserDefault来跟踪是否设置了位置。下面是我设置获取间隔的代码的近似值

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if ([INCUserDefaults isLocationConfigured]) {
            [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:kSecondsIntervalForUpcomingShowsBackgroundFetch];
        }
    
        return YES;
    }
    

    在我发布bug修复之前,我只是在设置过程中设置最小后台获取间隔。现在,我在安装过程中以及应用程序启动时设置它,如果安装过程之前已经完成。

    苹果使用一种秘密算法来确定获取事件的频率。此算法可能基于应用程序使用模式(即:用户使用应用程序的频率和时间)在获取事件开始一致到达之前,可能需要几天时间。


    若fetch事件在模拟器中工作,则证明所有设置都正确。您只能等待。

    谢谢您的回复。我已经做了很多次了,不高兴。谢谢。我也尝试过这样做。但我发现的是:后台提取实际上对这两种方法都有效。然而,一天、两天或几天之后就开始了。因为IOS决定了获取时间,我发现这个功能对于我的需求来说是不可靠的。我确实需要一个背景方法,将监测和火灾在设定的时间。我将开始学习其他背景模式,以满足我的应用程序的需要。如果后台提取性能、频率可以改进或修改,我非常希望听到故事或答案。我的见解是,在iOS上没有可靠的定期执行。是一种生活方式的产品,而不是嵌入式计算机。很好的观察。我在初始启动时设置了最小提取间隔。你还有其他消息吗?你把每次发射的代码放在哪里了?你能分享你的代码的例子吗?