2011-03-22 105 views
17

我正在研究监视后台中重要位置更改的应用程序。我一直在阅读关于ios4和应用程序生命周期的所有答案(当然,我想都是!),但是我无法弄清楚的是当应用程序在后台被唤醒时是否可以进行任何网络访问作为一个重大的位置变化的结果。iPhone应用程序可以在后台唤醒以显着改变位置吗?

该应用程序当前通过TCP套接字进行网络访问。套接字在应用程序暂停时关闭。

作为接收位置更改事件的结果,我是否可以重新连接套接字,接收一些数据,发送新位置,然后在仍处于后台的情况下关闭套接字?在办公室静止时很难测试!我们可以假设网络活动需要不到10秒的时间才能完成。还假定该应用程序没有注册为一个VoIP应用程序(可能/应该是?...)

任何想法?

回答

11

是的。您可以根据重大变化事件来进行网络处理。

当您在醒来时(从终止或暂停状态)发生重大更改时唤醒到后台状态时,您可以发出http请求。如果您在完成HTTP请求之前发现应用程序被终止,则可以通过UIApplication上的beginBackgroundTaskWithExpirationHandler:方法要求额外的后台处理时间。

我花了一段时间在短途旅行中测试了一下。 :)

+0

谢谢RBT,这听起来很有说服力。 – Roger 2011-03-24 09:02:19

+1

从技术的角度来看,这是可能的。但苹果允许吗?您的应用程序(使用此技术)是否已获得批准? – Toastor 2011-07-26 09:02:44

+1

@Toastor是的。事实上,这是一个在论坛上的苹果员工,他们也建议我这样做。 – RedBlueThing 2011-07-26 12:29:30

4

我只想确认RedBlueThing的答案的一些细节。

我现在使用以下来完成此操作。 bgTask被声明为UIBackgroundTaskIdentifier

bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: 
      ^{ 
       [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
      }]; 

// Now call methods doing network activity 
// ... 
// WHEN I KNOW THE LAST ACTION HAS COMPLETED USE THIS BLOCK OF CODE 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
} 

希望这有助于出去,因为我看到不少人在关注这个问题。

+0

罗杰,你是如何实现你的网络电话?我努力让它们在后台发送,http://stackoverflow.com/questions/12463091/ios-background-location-not-sending-http-request – 2012-09-17 21:15:12

相关问题