在Xamarin中使用ACR通知插件,如何配置Notification模型实现定时通知?
解决ACR通知插件打开应用即触发的问题
嘿,我看你在Xamarin里用ACR通知插件时遇到了触发时间不对的问题——明明设置了至少晚一天的日期,结果打开应用就全发出来了。这大概率是你对Notification模型的属性配置理解错了,咱们一步步来搞定它。
核心问题出在哪?
先看你写的代码:
var notif = new Notification(){ Id = count++, Date = item.PostDate.Date, Title = item.Type.Equals(DayType.Duminica) ? item.Title : $"{item.Title} {Helpers.GetCurrentDateOldFormat(item.PostDate.AddDays(-13))}", Message = item.Content, When = App.Settings.NotificationTime // new TimeSpan(08, 00, 00) };
这里最大的错误是**When属性的赋值类型不对**!ACR的Notification.When要求的是DateTimeOffset(具体的日期+时间),但你给的是TimeSpan(只是一个时间跨度)。插件会把这个TimeSpan解析成从1970年1月1日开始的时间,那肯定是早就过去的时间了,所以一打开应用就会触发所有通知。
另外,你单独设置的Date属性其实不是用来指定触发时间的,它只是通知显示的日期字段,和触发逻辑无关。
正确的配置方式
要让通知在指定时间触发,你需要把目标日期和目标时间合并成一个完整的未来DateTime,再转成DateTimeOffset赋值给When。还要加个判断,如果合并后的时间已经在当前时间之前(比如今天8点已经过了,你却设置今天8点触发),自动调到第二天,避免立即触发。
修改后的代码如下:
// 第一步:把目标日期和时间合并成完整的DateTime var triggerDateTime = item.PostDate.Date.Add(App.Settings.NotificationTime); // 第二步:检查触发时间是否已经过去,如果是就推迟到第二天 if (triggerDateTime <= DateTime.Now) { triggerDateTime = triggerDateTime.AddDays(1); } // 第三步:创建通知,正确设置When属性 var notif = new Notification() { Id = count++, Title = item.Type.Equals(DayType.Duminica) ? item.Title : $"{item.Title} {Helpers.GetCurrentDateOldFormat(item.PostDate.AddDays(-13))}", Message = item.Content, // 把合并好的DateTime转成DateTimeOffset When = new DateTimeOffset(triggerDateTime) }; // 最后别忘了调用调度方法,把通知加入队列 await Notifications.Current.ScheduleAsync(notif);
额外要注意的点
- 确保
item.PostDate.Date本身是未来的日期,如果这个日期已经是过去的,那合并后的触发时间还是过去的,依然会立即触发。 - 如果需要重复通知(比如每天同一时间发),可以加上
RepeatType = RepeatType.Daily属性,单次通知就不用加。 - 测试的时候可以把触发时间设成当前时间后几分钟,看看是不是到点才触发,验证配置是否正确。
内容的提问来源于stack exchange,提问作者ORober
相关产品推荐
相关产品推荐

