【问题标题】:iOS7 background fetch?iOS7后台获取?
【发布时间】:2014-06-19 06:17:12
【问题描述】:

在我的应用程序中,我想使用 iOS 7 后台获取功能向服务器发送一些数据。我还在目标的功能部分中选中了后台获取复选框(当然还有一个自动添加到 plist 中的标志)。

在 AppDelegate 中我这样做了:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    //[application setMinimumBackgroundFetchInterval:10]; also tried this
    return YES;
}

然后在委托方法中我这样做了:

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

        LocationManager = [[CLLocationManager alloc] init];

        LocationManager.delegate = self;
        LocationManager.desiredAccuracy = kCLLocationAccuracyBest;
        LocationManager.distanceFilter = 50.0;
        [LocationManager startUpdatingLocation];

        /** NEW DATA EXISTS AND WAS SUCCESSFULLY PROCESSED **/
        if (YES) {

             completionHandler(UIBackgroundFetchResultNewData);
        }
        else
             completionHandler(UIBackgroundFetchResultFailed);
 }

然后我将我的 iPhone 连接到 XCode 并运行应用程序,然后从调试菜单中单击模拟后台获取。委托方法被调用并且位置在服务器上更新了一次,但它再也没有发生过,系统永远不会在后台唤醒应用程序。 我做错了什么?任何帮助将不胜感激。

编辑: 是否可以使用后台获取在服务器上发送数据? Edit-2 如果我使用远程通知代替后台获取以在服务器上发送数据,那么在这种情况下,是否保证系统在收到远程通知后会唤醒我的应用程序?

【问题讨论】:

  • 在做出任何决定之前,请通过@walle84 答案下的 cmets。
  • 请注意,Simulate Background Fetch 在 Xcode 6 中已损坏(已在 6.3.1 中验证不工作),并在 Xcode 6 发行说明的“已知问题”部分中提到。 Other threadRelease Notes

标签: ios objective-c cllocationmanager ios7.1


【解决方案1】:

简单的回答是调用 performFetchWithCompletionHandler 方法取决于设备的 iOS 何时调用它。我很久以前也遇到过同样的问题,发现它也可以在几分钟或几小时或一天或一周内被调用。另外 ** UIApplicationBackgroundFetchIntervalMinimum ** 并不意味着它会在最短的时间内调用它,它可能永远不会或最小,最终取决于操作系统调用 preformFetch 方法。所以最后你可以等待操作系统调用 performFetchWithCompletionHandler 方法。

【讨论】:

  • 但我想每 20 或 30 分钟更新一次位置,如前所述,我还尝试将自己的时间间隔设置为 10 秒。
  • @Bharat 您需要在您的应用上使用定位服务后台模式。然后从那里你可以用你所说的间隔和 startUpdating 位置运行一个 NSTimer。 performFetchWithCompletionHandler 不会在设置的时间间隔内执行,因为操作系统决定何时调用它。
  • 即使您将时间间隔设置为 20 或 10 秒,它也无法正常工作,因为我阅读了有关后台获取的信息。完全取决于操作系统来调用该 performFetch 方法,如前所述,它可能需要数小时或数天。在创建它的演示时,我确实尝试过自己并遇到了同样的问题。
  • @jeraldo 我在尝试后台获取之前做了同样的事情,但是让应用程序在后台始终处于活动状态并不是一个好主意,苹果永远不会批准它。
  • @Bharat 这里是link 这可能对你有帮助。
【解决方案2】:

iOS 的智能方式是,如果您的应用程序的后台操作消耗更多资源,它甚至会停止再次调用它。后台获取的时间间隔从不固定,只要空闲,操作系统就会调用它。如果您的应用程序的后台操作消耗的资源较少,则更有可能再次调用它。您不一定每 20 或 30 分钟更新一次位置。即使你提到了间隔,如果操作系统不是空闲的,它也不会执行你的 fetch 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多