gpt4 book ai didi

ios - 将在 ios 中终止 Web 服务调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:28:21 27 4
gpt4 key购买 nike

我正在 iPhone 和 iPad 上开发应用程序,我在后台调用网络服务 (PHP) 并发送位置更新,我已经完成,但我也想在从后台删除应用程序时调用网络服务,所以是否可以让应用程序停留一段时间以便我可以调用网络服务,我已经尝试过 willterminate委托(delegate)方法

我的意思是后台术语是在我终止应用程序时调用网络服务

这就是我试图从通知中心调用的方法,它将从不同的 Controller 调用网络服务。

- (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:.
}

但是当我终止应用程序时,网络服务没有被调用。

任何建议,猜测提前致谢..

最佳答案

没有 100% 确定的方法可以实现这一点,但您可以使用它。

  1. 您可以使用位置更新方法来完成此任务。如果位置权限始终被授权,即使在应用程序关闭后,它也会继续调用 didUpdateLocation 方法。

我已经在我的一个应用程序中使用了这种方法,并且效果很好。

  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;
    }

现在在 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”。

注意:Webservice应该尽可能的轻,这样我们才能有更多的机会成功调用web服务。

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

  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)
    }
    }

I have checked both this technique in two different application, and both time I got success, but still there are some possibilities where I can say this technique, not 100% perfect.

关于ios - 将在 ios 中终止 Web 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22943503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com