我正在开发iPhone和iPhone的应用程序iPad和iPad我在后台中调用 webservice (PHP)并发送位置更新,我已经完成但我还想在删除时调用webservice来自后台的应用程序,所以可以让应用程序停留几次,以便我可以调用webservice,我已尝试使用 willterminate 委托方法
我的意思是背景术语是在我终止应用程序时调用web服务
这就是我试图从notificationcenter调用一个方法,它将从不同的控制器调用一个web服务。
- (void)applicationWillTerminate:(UIApplication *)application
{
[[NSNotificationCenter defaultCenter]postNotificationName:@"Deactiviate" object:nil];
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
但是当我终止app时,不会调用webservice。
任何建议,猜测 Thanx提前..
答案 0 :(得分:5)
目前还没有100%确定的方法,但你可以使用它。
我在我的一个应用程序中使用了这个方法,并且它的工作非常完美。
如果您使用的是NSURLSession,则可以使用以下技巧。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//Sample webservice block
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
downloadTask = [session downloadTaskWithURL:[NSURL URLWithString:@"http://cdn.tutsplus.com/mobile/uploads/2013/12/sample.jpg"]]; // downloadTask = NSURLSessionDownloadTask object
return YES;
}
现在在ApplicationWillTerminate中:
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
[downloadTask resume];
sleep(5); // sleep main thread for 5 seconds after webservice call, so that it gets time to call webservice.
}
我们也可以使用GCD在主线程上调用“resume”调用。
注意: Web服务应尽可能轻松,以便我们能够更有可能成功进行Web服务调用。
我已经检查了我的一个应用程序,以便在用户退出应用程序时让用户离线。
在Swift 3.0中使用runLoopMode:
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
var finished = false
self.webServiceBlock { success in
print("response we got here")
finished = true
}
while !finished {
RunLoop.current.run(mode: RunLoopMode.defaultRunLoopMode,
before: NSDate.distantFuture)
}
}
我已经在两个不同的应用程序中检查了这种技术,并且两次都获得了成功,但仍有一些可能性我可以说这种技术,而不是100%完美。
答案 1 :(得分:0)
- (void)applicationWillTerminate:(UIApplication *)application {
[comm getDataFrom:offlineURL forHttpMethod:@"POST" withHttpBody:httpBody
forRequest:2];
sleep(3);
}
答案 2 :(得分:0)
func applicationWillTerminate(_ application: UIApplication)
{
var ourServiceCompleted = false
serviceCall {
ourServiceCompleted = true
}
while !ourServiceCompleted {
RunLoop.current.run(mode: RunLoop.Mode.default,
before: NSDate.distantFuture)
}
}