【问题标题】:Is there a way to notify the server that the app has been terminated?有没有办法通知服务器应用程序已终止?
【发布时间】:2019-08-31 13:12:40
【问题描述】:

我编写了向 applicationWillTerminate 发送 URLRequest 的代码,但发现这是错误的。 有没有其他方法可以通知服务器应用程序已终止? 下面的代码接收并返回服务端返回的数据,但由于只是通知服务端应用结束,原则上不需要。

 func applicationWillTerminate(_ application: UIApplication) {
    appExitRequest()
}

func appExitRequest() {
    let settings = UserDefaults.standard
    let id = settings.string(forKey: myId)

    guard let myId = id?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
        return
    }


    guard let req_url = URL(string: "http://localhost/test.php/terminate?myId=\(myId)") else {
        return
    }
    print(req_url)
    let req = URLRequest(url: req_url)
    let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)
    let task = session.dataTask(with: req, completionHandler: {
        (data, response, error) in
        session.finishTasksAndInvalidate()
        do {
            print("OK", data ?? "Empty")
        } catch {
            print("Failure", error)
        }
    })
    task.resume()
}

【问题讨论】:

  • 尝试记录它终止的时间,并在应用再次启动后将该信息发送到服务器?
  • 当然也有这样的方法。但是,因为我们只想在数据库中记录活跃用户,所以我们不能等待应用重新启动。
  • 为什么不使用某种分析引擎(Adobe、Firebase 等)来监控活动会话的数量?这些足够先进,可以在商业环境中为您提供准确的 KPI。
  • 需要识别个人用户,而不是用户总数。 Firebase 能做到吗?
  • 这里可以使用socket,发送socket消息会比URLRequest更快,任务也更小。

标签: ios swift terminate


【解决方案1】:
  • 这是唯一可用于调用 API 以告知应用已终止的函数。

【讨论】:

  • 是这样吗...如何在此函数中发送 URLRequest?
  • 在此函数内的后台线程中进行 API 调用。这肯定会起作用。我尝试使用 websockets 通知服务器该用户现在离线并且它起作用了。
  • 非常感谢。学习了websocket。如果您不介意,可以给我看代码吗?
  • 很抱歉现在没有代码,我已经离开了我以前的公司。
  • 非常感谢,我就拿来做例子吧
【解决方案2】:

applicationWillTerminate 不会在用户通过在任务切换器中向上滑动应用程序来终止应用程序时调用。 仅当 iOS 看门狗进程因任何原因(如高内存消耗等)杀死您的应用时才会调用它。

因此,如果您信任此方法,您的用例仍然不会得到完全处理。 此外,Apple 目前还没有公开原生回调方法来处理这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多