如何编写用户按下主页按钮时不会暂停的代码

时间:2017-03-08 00:25:31

标签: ios swift

我想在ios应用中实现图片同步。为此,我所做的是

  1. 拍张照片
  2. 将该照片上传到firebase
  3. 获取firebase存储的url并将其发送到api服务器,以便服务器将该信息存储到数据库
  4. 只要应用程序正在运行,它就可以正常运行,但是当我从应用程序退出按主页按钮时,一切都会暂停。

    那么,如果应用程序进入主页,如何运行不会暂停的代码?

2 个答案:

答案 0 :(得分:1)

根据此文档,

  

对于需要执行更多执行时间的任务,您必须这样做   请求特定权限,以便在后台运行它们   他们被停职了。在iOS中,只允许使用特定的应用类型   在后台运行:

  •   

    在后台播放用户可听内容的应用,   比如音乐播放器应用

  •   

    在内容中录制音频内容的应用   后台应用程序,让用户了解他们的位置   时间,例如导航应用

  •   

    支持互联网语音的应用   协议(VoIP)需要下载和处理新内容的应用程序   定期

  •   

    从外部附件接收定期更新的应用

  •   

    实施这些服务的应用必须声明他们的服务   支持和使用系统框架来实现相关方面   那些服务

  

声明服务让系统知道哪个   您使用的服务,但在某些情况下,它是系统框架   实际上会阻止您的申请被暂停。

链接:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

以下是如何实施(摘自this answerAshley Mills):

func doUpdate () {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

    let taskID = beginBackgroundUpdateTask()

    var response: NSURLResponse?, error: NSError?, request: NSURLRequest?

    let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

    // Do something with the result

    endBackgroundUpdateTask(taskID)

    })
}

func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
    return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})
}

func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) {
    UIApplication.sharedApplication().endBackgroundTask(taskID)
}

答案 1 :(得分:0)

[Swift3]这对我有用

func doUpdate () {
    DispatchQueue.global(qos: .background).async {
        let taskID = self.beginBackgroundUpdateTask()
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5), execute: {
            print("printing after 10 min")
        })
        DispatchQueue.main.async {
            self.endBackgroundUpdateTask(taskID: taskID)
        }
    }
}


func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier {
    return UIApplication.shared.beginBackgroundTask(expirationHandler: {})
}


func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) {
    UIApplication.shared.endBackgroundTask(taskID)
}

不确定完成此操作的最长时间是什么,因为我看到有expirationHandler