Xamarin Forms中能否通过代码禁用应用的通知设置?
iOS 如何通过代码禁用应用通知设置
苹果出于隐私权限控制的设计,没有向开发者开放直接通过代码修改系统设置中应用通知总开关的权限,你无法通过任何公开API直接切换系统设置里的通知权限状态。
你调用的UnregisterForRemoteNotifications仅会停止当前设备向苹果APNs推送服务注册,不会修改已经授予的通知权限,也不会改变系统设置里的通知开关状态,自然无法达到你要的禁用效果。
替代实现方案
- 方案1:服务端拦截远程推送
当用户触发禁用操作时,将当前设备的推送device token上报给你的后端服务,标记为禁用推送状态,后端不再向该token下发任何推送,即可实现实际禁用远程推送的效果,这是行业内最常用的处理方案。 - 方案2:应用层拦截所有通知展示
实现UNUserNotificationCenterDelegate代理的WillPresentNotification方法,当用户开启禁用开关后,所有推送到达应用时直接返回不展示的配置,无论是远程推送还是本地通知都不会展示给用户,效果和系统关闭通知一致:// 示例代码 UNUserNotificationCenter.Current.Delegate = new CustomNotificationDelegate(); // 在CustomNotificationDelegate类中实现 public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler) { if (用户已开启禁用通知开关) { completionHandler(UNNotificationPresentationOptions.None); return; } // 原有展示逻辑 completionHandler(UNNotificationPresentationOptions.Alert | UNNotificationPresentationOptions.Sound); } - 方案3:引导用户手动关闭系统通知
如果确实需要修改系统级的通知开关,可以弹出提示引导用户跳转至应用的系统设置页手动操作,跳转代码如下:UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString)); - 方案4:清空本地通知
如果还有本地通知需要禁用,可以调用如下代码清空所有待触发和已展示的本地通知:// 旧版iOS本地通知清空 UIApplication.SharedApplication.CancelAllLocalNotifications(); // 新版UNUserNotificationCenter清空 UNUserNotificationCenter.Current.RemoveAllPendingNotificationRequests(); UNUserNotificationCenter.Current.RemoveAllDeliveredNotifications();
内容的提问来源于stack exchange,提问作者Zeeshan shaikh
相关产品推荐
相关产品推荐

