当用户终止应用程序时,我可以进行 api 调用吗?

2023-11-26

当用户终止应用程序(强制关闭)时,我需要进行 API 调用。我所做的直接实施如下。

在应用程序委托中,我添加了以下代码。

func applicationWillTerminate(_ application: UIApplication) {
    print("________TERMINATED___________")
    testAPICall()
}

func testAPICall(){
    let url = getURL()
    let contentHeader = ["Content-Type": "application/json"]
    Alamofire.request(url,
                  method: .put,
                  parameters: ["username": "[email protected]"],
                  encoding: JSONEncoding.default,
                  headers: contentHeader).responseJSON { (response) -> Void in
                    print("-----")
                  }
}

然而,该电话并未被拨打。并在经历文档,我发现在这个方法中完成任务只需要 5 秒,最重要的是,进行 api 调用不是这里需要完成的任务。所以我想知道,有什么方法可以做到这一点。


这是一个两方面的问题

第 1 阶段:确保 API 调用在每次用户终止应用程序时/在应用程序变为活动状态之前启动

你可以随时利用expiration handler背景模式iOS application在你的应用程序委托中

declare var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0);

并在你的应用程序委托中

 func applicationDidEnterBackground(_ application: UIApplication) {

    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
        // Do something to stop our background task or the app will be killed
        application.endBackgroundTask(self.bgTask)
        self.bgTask = UIBackgroundTaskIdentifier.invalid
    })

    DispatchQueue.global(qos: .background).async {
        //make your API call here
    }
    // Perform your background task here
    print("The task has started")
}

后台过期处理程序将确保您每次将应用程序置于非活动状态或终止时都有足够的时间来启动 API 调用

第 2 阶段:确保 API 调用启动成功完成

尽管过期处理程序可能会确保您有足够的时间来启动 API 调用,但它无法确保 API 调用成功完成。如果 API 调用需要更长的时间并且请求正在执行且时间耗尽怎么办?

确保 API 调用在启动后成功的唯一方法是确保使用正确的配置URLSession

根据文档

后台会话允许您执行内容的上传和下载 当您的应用程序未运行时在后台运行。

link: https://developer.apple.com/documentation/foundation/nsurlsession?language=objc

因此,请利用后台会话并使用上传任务。不要使用简单的 get/post API(您将使用某些参数来访问),而是要求您的后端开发人员接受一个文件并将所有参数数据放入该文件中(如果有的话),然后使用后台会话启动上传任务。

一旦上传任务从后台会话开始,即使您的应用程序被终止,iOS也会完成它(除非您显然遇到身份验证挑战)。

我相信这是确保启动 API 调用并确保应用程序不活动/终止后完成的最接近的方法。我与一位苹果开发人员就此进行了讨论,他们同意这可能是一个可能的解决方案:)

希望能帮助到你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当用户终止应用程序时,我可以进行 api 调用吗? 的相关文章

随机推荐

  • 为什么在 Windows 上尝试 Socket.connect 失败需要 1 秒?

    使用 net 时 我注意到尝试连接到未侦听的端口总是需要 1 秒 检查这是否是 net 抽象中的问题或者是否是较低级别的问题 并将其与 linux 进行比较 其中不成功telnet大约需要 3 毫秒 我使用了一个 node js 脚本来连接
  • 使用 Angular CLI 和 Angular 5 在运行时动态加载新模块

    目前我正在开发一个托管在客户端服务器上的项目 对于新的 模块 有无意重新编译整个应用程序 也就是说 客户想要在运行时更新路由器 延 迟加载模块 我已经尝试了几种方法 但无法使其发挥作用 我想知道你们中是否有人知道我还可以尝试什么或我错过了什
  • 如何使用 jQuery 发出指定 contentType 的 jsonp POST 请求?

    我需要使用内容类型 application json 发出 jsonp POST 请求 我可以像这样向服务器发出 POST 请求 jQuery ajax type POST url url data data success success
  • Swift 中的#pragma 标记?

    在 Objective C 中 我可以使用 pragma mark在符号导航器中标记我的代码部分 由于这是一个 C 预处理器命令 因此它在 Swift 中不可用 Swift 中是否有替代方案 或者我是否必须使用丑陋的注释 您可以使用 MAR
  • 在scrapy中抓取后发送电子邮件

    pipeline py代码 class Examplepipeline object def init self dispatcher connect self spider opened signal signals spider ope
  • 是否可以使用 Linkedin Api 获取所有 Linkedin 个人资料帖子

    我正在尝试使用 linkedin API 来显示我的个人资料的提要 我从第一天开始就发布了这些内容 帖子包括媒体 图像 视频等 我想知道是否有可用的 Api 我可以在其中传递一些参数并获取我的 linkedin 个人资料的所有帖子 如果有人
  • 是否有必要在 return 语句中使用 std::move ,并且应该返回右值引用吗?

    我试图理解 C 11 的右值引用和移动语义 这些示例之间有什么区别 哪些示例不进行矢量复制 第一个例子 std vector
  • 如何在控制器中不使用 Rails 操作参数

    我正在 Rails 服务器中为 Shipworks 实现第三方 API 并且 Shipworks 客户端应用程序正在发布action具有 Shipworks 特定语义的参数 然而 Rails 路由逻辑会将此参数覆盖为控制器方法的名称 我是否
  • 如何更新 pandas 中的现有数据框?

    给定这两个数据框 gt gt gt df1 pd DataFrame c1 a a b b c2 x y x y val 0 gt gt gt df1 c1 c2 val 0 a x 0 1 a y 0 2 b x 0 3 b y 0 gt
  • Unity3D,从Unity.UI面板构建PNG?

    考虑任何 Unity UICanvas你可能有 想象一个典型的Panel在那张画布上 假设它恰好包含一些图像 也许一些文本等等 如果您可以将该面板 仅面板 转换为屏幕截图 Texture2D 或 PNG 那将非常方便 我唯一能想到的就是使用
  • 更改 Forge 中的材料

    目前 我们正在让客户端在页面加载时检索对象状态 这将导致模型中的 待处理 对象变成不同的颜色 然后我们轮询更改以更新着色 首先 当查看器加载时 挂起的对象会着色 然后我们继续轮询以再次检查和更改状态 以使 Forge 以不同的颜色渲染它们并
  • 编辑QTableView单元格后如何更改背景颜色?

    我有这个带有自定义模型和委托的 QTableView 编辑后如何更改单元格的背景颜色 我应该在代表处这样做吗setModelData index model setData index QVariant True Qt UserRole 然
  • 将 ActionBar 主页按钮设置在右侧

    我可以将 ActionBar 中的主页按钮设置在右侧吗 android R id home 我想更改主页按钮的位置 因为该语言使用从右到左的打字方式 是否可以 如果是 请告诉我该怎么做 如果没有 如何将 ActionBarDrawerTog
  • Python 会在赋值时创建对象的副本吗?

    当我尝试这段代码时 dict a dict b dict c dict c hello goodbye print dict a print dict b print dict c 我预计它只会初始化dict a dict b and di
  • 媒体播放器、打瞌睡模式、唤醒锁和前台服务

    我读过几篇关于 Android M 中新的 打瞌睡 模式的文章 还有 Android 开发者网站上的文章 https developer android com training monitoring device state doze s
  • PHP正则表达式用于强密码验证[重复]

    这个问题在这里已经有答案了 我在网上看到过以下正则表达式 8 d W n A Z a z 仅当字符串满足以下条件时才验证 contain at least 1 upper case letter contain at least 1 low
  • Github级联合并的做法是怎样的?

    github上是否有任何选项或实践可以提供像bitbucket这样的自动PR级联 https confluence atlassian com bitbucketserver automatic branch merging 7766399
  • ES6 Arrow 函数正在改变 Meteor.publish 中的 this 范围 [重复]

    这个问题在这里已经有答案了 所以我开始使用ES6Meteor 但显然如果你尝试使用Meteor publish带有箭头函数的语法 this userId是未定义的 而如果你将它与常规一起使用function this userId工作完美
  • C++ 中对象的静态和动态内存分配

    在C 程序中 对于一个类 如何获取任意时刻静态创建和动态创建的活动对象的数量 可悲的是你不能 斯科特 迈耶 Scott Meyer 的一本书中有整整一个章节 他继续讲述试图实现这一目标的挑战 但缺点是这是不可能的 更有效的 C 第 27 条
  • 当用户终止应用程序时,我可以进行 api 调用吗?

    当用户终止应用程序 强制关闭 时 我需要进行 API 调用 我所做的直接实施如下 在应用程序委托中 我添加了以下代码 func applicationWillTerminate application UIApplication print