我需要什么的总体思路:
我正在将一个 Android 应用程序移植到 iOS(使用 Xamarin,但我可以很容易地从目标 C 转换为 C#),它严重依赖 AlarmManager 对我不拥有的网站上的 HTML 页面进行背景检查。AlarmManager 本质上是一个 Android 的任务调度器。用户可以将频率设置为他们想要的任何值。
我试过的:
后台抓取:
app.SetMinimumBackgroundFetchInterval(240);
UNUserNotificationCenter.Current.RequestAuthorization(UNAuthorizationOptions.Alert, (approved, err) =>
{
// Handle approval
});
UNUserNotificationCenter.Current.Delegate = new WEBSITEFUNCTIONS.UserNotificationCenterDelegate();
return base.FinishedLaunching(app, options);
public override void PerformFetch(UIApplication application, Action<UIBackgroundFetchResult> completionHandler)
{
System.Diagnostics.Debug.WriteLine("interval");
WEBSITEFUNCTIONS kf = new WEBSITEFUNCTIONS();
kf.doCheck();
completionHandler(UIBackgroundFetchResult.NewData);
}
Perform Fetch 只是直接从不调用。我需要一些一致性(休息一分钟没什么大不了的……但几个小时就不行了)。我让它运行,它只是直接从来没有工作过。我已经阅读了很多关于 PerformFetch 工作原理的文章,但我认为它不会给我用户所需的关键响应时间。
UserNotifications:iOS 10 的新增功能是可以重复通知。但是,这会重复相同的通知。
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger(60, true);
var requestID = "sampleRequest";
var request = UNNotificationRequest.FromIdentifier(requestID, content, trigger);
UNUserNotificationCenter.Current.AddNotificationRequest(request, (err) =>
{
if (err != null)
{
// Do something with error...
}
});
推送警报:
我自己的服务器
我可以设置一个服务器来进行检查,然后向 Firebase Cloud Messaging 发送一条消息,向用户发送一条关于新项目的消息。我在 Android 版本上大约有 500 个活跃用户,如果他们每 5 分钟检查 5 个不同的页面,以 90 kbs 的速度检查,那大约是每小时半个 gig 的带宽。
所以缺点是:
- 过多的带宽使用将使我的家庭互联网速度变慢
- 我需要自己保护它
- 停电有时会持续数天,使最终用户置身事外
- 他们的服务器可以在任何给定时刻从我的机器上启动,如果发生这种情况,我可以从我的 ISP 获得一个新的 IP 地址......假设他们允许
使用我的共享主机,每 15 分钟设置一次 cronjob
我可以设置一个 cronjob 每 15 分钟发出一次警报。这不是最快的,但比依赖第一个选项要好得多(因为它永远不会被调用)
- 再一次,我只能任由他们的服务器不让我离开。如果他们这样做,该应用程序将完全崩溃。
- 共享主机可能会让我对他们的服务器施加太大压力(Hostgator 声称无限带宽,我不确定他们是否希望我这样做)