You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:28:14