iOS动作扩展中的后台任务

mix*_*ble 15 ios mailcore2 swift ios-app-extension

我正在为应用程序创建一个动作扩展,为用户准备一些数据,然后使用MailCore2将此信息发送到SMTP服务器.准备数据的速度非常快,但发送电子邮件可能需要一些时间(取决于其大小).这就是为什么我正在寻找一种在后台处理发送活动的方法.但这导致了不同解决方案的一些问题:

  1. 使用URLSession.这是在iOS扩展中处理大型上传或下载的第一种方法.但问题是MailCore2不使用URLSessions将数据传输到邮件服务器.所以这不可用.或者是否有可能以某种方式在URLSession中"包装"此调用?

  2. 使用UNUserNotificationCenter并在数据准备后从扩展发送本地通知.我们的想法是在收到此通知后在主应用程序中启动发送任务.问题:userNotificationCenter didReceive仅当用户单击通知时才会调用通知方法.简单的徽章通知不会调用委托方法.

  3. 使用后台提取.这在模拟器中工作正常,但在iOS设备上连接到SMTP服务器时出错.我遇到了与github.com/MailCore/mailcore2/issues/252中描述的相同的HELO问题.对于此问题,应该是一个解决方案MCOSMTPSession.isUseHeloIPEnabled = true,但这可能不适用于所有服务器.所以也不是一个完美的解决方案

任何想法,如何处理这样的任务?或者如何处理上述解决方案之一?

编辑:因为这个问题还没有收到任何答案:什么不清楚或需要哪些附加信息?

mix*_*ble 3

经过多次测试和失败后,我找到了以下解决方案来在扩展后台执行长时间执行的任务。即使扩展已经完成,这也会按预期工作:

\n\n
func performTask()\n{\n    // Perform the task in background.\n    let processinfo = ProcessInfo()\n    processinfo.performExpiringActivity(withReason: "Long task") { (expired) in\n        if (!expired) {\n            // Run task synchronously.\n            self.performLongTask()\n        }\n        else {\n            // Cancel task.\n            self.cancelLongTask()\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

此代码用于ProcessInfo.performExpiringActivity()在另一个线程中执行任务。\xe2\x80\x99s 中的任务很重要performLongTask()同步执行非常重要。当到达块的末尾时,线程将终止并结束任务的执行。

\n\n

类似的方法也适用于主应用程序。它在iOS 后台任务的小摘要中进行了详细描述。

\n