使用 Xamarin.iOS (C#) 在 iOS 中进行后台处理:我应该使用哪种方法?

Posted

技术标签:

【中文标题】使用 Xamarin.iOS (C#) 在 iOS 中进行后台处理:我应该使用哪种方法?【英文标题】:Backgrounding in iOS with Xamarin.iOS (C#): Which method should I use? 【发布时间】:2017-04-21 16:28:43 【问题描述】:

我在 ios 上进行后台处理时遇到了一些问题。首先,让我做一个简单的解释:

我在一家工作管理公司工作,该公司可以接收和分发用于定位公用设施的票证。用户可以从我们的服务器下载票证,对其进行处理,并将他们的回复发送回我们的服务器。下载的票据进入本地 SQLite 数据库,用户做出的响应存储在 另一个 本地 SQLite 数据库中。我的同事用 C# 在 Xamarin 中编写了 android 应用程序,他下载票证和上传响应的智能过程如下:

    从我们的服务器下载票证到本地 SQLite 数据库,“票证” 检查本地“响应”SQLite 数据库,看看是否有响应 如果有响应,请将其发送到我们的服务器 等待 5 分钟 重复

这允许用户最初下载一批票并开始处理它们。如果在用户没有互联网的情况下运行此过程,则不会发生任何事情,并且计时器将重置。这个过程将允许用户在没有互联网的情况下对工单做出响应,并且只要他们有互联网就可以上传响应/下载新的工单。

我的问题是,在 iOS 上,后台设置比在 Android 上要严格得多。有后台获取,然后有推送通知。使用后台获取,系统“计算最佳机会”运行PerformFetch 方法,并且没有给我必要的严格的 5 分钟计时器。使用推送通知,如果用户没有互联网,他们将永远不会收到推送通知。

我真的很想能够像上面描述的那样简单地设置一个 5 分钟的计时器并运行该过程,检查是否有任何新票证,如果有任何票证,则发送任何新响应。但由于 iOS 后台的限制性,我不能这样做。

有什么建议吗?他们将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

确实,您不能在像 Android 这样的 iOS App 中创建后台服务。但是在阅读了您的要求之后,您似乎并不真的需要所有任务的后台服务-仅当用户离线更新数据并关闭应用程序时才需要它-当互联网连接再次可用时,永远不要再次打开。但这是对 iOS 的限制,无论如何你都无法在 iOS 中实现这一点。

对于其他任务,您可以在应用处于活动状态时从服务器异步获取数据。

您可以简单地创建 5 分钟的计时器 - 只有在您的应用处于活动状态时才会运行该计时器。那时,您可以执行代码以获取新票证并以异步模式向服务器发送响应。 Check here for more detail about how to do this in Xamarin。

这个过程是异步的,不会干扰常规的 UI 活动。只要有互联网连接,用户就可以在计时器上检查数据库中的新票、更新数据库中的响应等。

【讨论】:

以上是关于使用 Xamarin.iOS (C#) 在 iOS 中进行后台处理:我应该使用哪种方法?的主要内容,如果未能解决你的问题,请参考以下文章

C# Xamarin IOS:相当于 C# IOS Xamarin 中的 SystemClock.ElapsedRealtime()

使用 xamarin.ios c# 以编程方式添加嵌套的堆栈视图

ViewDidAppear 导致我的标签消失(Xamarin.ios,C#)

如何隐藏数字键盘,我使用的是 Xamarin iOS (C#)

如何使用 c# 在 Xamarin.Ios 中将 UIColor 转换为字符串和字符串转换为 UIColor

C# Monotouch/Xamarin.iOS - 可滚动的 UIView