将在ios中终止Web服务调用

时间:2014-04-08 16:54:41

标签: ios

我正在开发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提前..

3 个答案:

答案 0 :(得分:5)

目前还没有100%确定的方法,但你可以使用它。

  1. 您可以使用位置更新方法来完成此任务。如果位置权限始终被授权,则即使在应用程序关闭后,它也会继续调用didUpdateLocation方法。
  2. 我在我的一个应用程序中使用了这个方法,并且它的工作非常完美。

    1. 如果您使用的是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;
      }
      
    2. 现在在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服务调用。

      我已经检查了我的一个应用程序,以便在用户退出应用程序时让用户离线。

      1. 在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)
            }
        }
        
      2.   

        我已经在两个不同的应用程序中检查了这种技术,并且两次都获得了成功,但仍有一些可能性我可以说这种技术,而不是100%完美。

答案 1 :(得分:0)

   - (void)applicationWillTerminate:(UIApplication *)application {
      [comm getDataFrom:offlineURL forHttpMethod:@"POST" withHttpBody:httpBody 
      forRequest:2];
       sleep(3);
   }

答案 2 :(得分:0)

斯威夫特 5

func applicationWillTerminate(_ application: UIApplication)
{
    var ourServiceCompleted = false

    serviceCall {
        ourServiceCompleted = true
    }
    
    while !ourServiceCompleted {
        RunLoop.current.run(mode: RunLoop.Mode.default,
                            before: NSDate.distantFuture)
    }
}