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

每日/夜间唤醒Xamarin.iOS应用及本地通知技术问题咨询

解决方案:Xamarin原生健身应用通知联动日志优化方案

Hey there! 我之前开发Xamarin.Android和Xamarin.iOS的健身类应用时,也碰到过类似的通知与日志联动的需求,结合原生平台特性,给你分享几个落地的解决方案:

一、点击本地通知直接跳转训练日志记录页面

针对Xamarin.Android

  1. 创建通知时,给PendingIntent附加跳转目标Activity的意图,同时携带训练计划ID等关键参数:
var intent = new Intent(this, typeof(LogRecordActivity));
intent.PutExtra("TrainingPlanId", planId); // 传递训练计划唯一标识
intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);

// Android 12+ 需添加Immutable/Mutable标记
var pendingIntent = PendingIntent.GetActivity(this, notificationId, intent, PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Immutable);

// 构建并发送通知
var notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentTitle("锻炼提醒")
    .SetContentText("嘿,该锻炼了")
    .SetSmallIcon(Resource.Drawable.ic_workout_notify)
    .SetContentIntent(pendingIntent)
    .SetAutoCancel(true);

var notificationManager = NotificationManagerCompat.From(this);
notificationManager.Notify(notificationId, notificationBuilder.Build());
  1. 在LogRecordActivity中接收参数并自动初始化日志表单:
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    if (Intent.HasExtra("TrainingPlanId"))
    {
        var planId = Intent.GetIntExtra("TrainingPlanId", -1);
        // 根据ID从本地数据库加载训练计划,自动填充日志项
        LoadTargetTrainingPlan(planId);
    }
}

针对Xamarin.iOS

  1. 创建通知请求时,通过UserInfo携带训练计划参数:
var content = new UNMutableNotificationContent();
content.Title = "锻炼提醒";
content.Body = "嘿,该锻炼了";
content.UserInfo = new NSDictionary("TrainingPlanId", planId.ToString());

// 复用你已有的重复触发逻辑
var trigger = UNCalendarNotificationTrigger.CreateTrigger(dateComponents, repeats: true);

var request = UNNotificationRequest.FromIdentifier(notificationId.ToString(), content, trigger);
UNUserNotificationCenter.Current.AddNotificationRequest(request, (err) => 
{
    if (err != null) Console.WriteLine($"通知创建失败:{err.LocalizedDescription}");
});
  1. 在AppDelegate中处理通知点击跳转:
public override void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
{
    var userInfo = response.Notification.Request.Content.UserInfo;
    if (userInfo.ContainsKey(new NSString("TrainingPlanId")))
    {
        var planId = int.Parse(userInfo[new NSString("TrainingPlanId")].ToString());
        // 跳转到日志记录页面并传递参数
        var logVC = new LogRecordViewController(planId);
        var navController = Window.RootViewController as UINavigationController;
        navController?.PushViewController(logVC, animated: true);
    }
    completionHandler();
}

二、自动关联训练计划到日志记录

核心思路是用通知携带的唯一标识关联本地数据:

  • 提前把训练计划的ID、名称、预设动作等信息存在本地数据库(比如SQLite-net);
  • 跳转日志页面后,根据携带的ID查询数据,自动填充日志表单的训练名称、动作列表等字段;
  • 对于重复通知,确保每次触发的通知携带的计划ID与用户设定的训练计划匹配,避免关联错误。

额外注意事项

  • Android 12及以上版本,PendingIntent必须指定Immutable或Mutable标记,否则会抛出权限异常;
  • iOS需在Info.plist中配置NSUserNotificationUsageDescription,申请本地通知权限;
  • 测试杀死应用后的通知跳转逻辑:Android需调整PendingIntent的Flags确保能唤醒应用,iOS则依赖UNUserNotificationCenter的回调正常触发。

内容的提问来源于stack exchange,提问作者wallef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:45