有两种类型的远程通知:后台更新通知(其有效负载包含content-available: 1)和常规推送通知。前一种是无声的,用户什么也看不到,后者是用户在锁屏上收到消息的地方。
对于 iOS 应用程序,始终允许后台更新通知,而无需用户授予您任何权限。只有当您要发送通知以提醒用户时,用户才必须首先授予您权限。因此,当您启用这些功能时,您是在告诉系统您的应用应该接收通知,但系统不知道是哪种类型,因此它允许您注册到 APNS 并在后台接收通知。只有这样做意味着您的用户不会看到提示他们允许您的应用程序发送通知的警报,并且您的应用程序将没有通知设置 - 用户无法关闭他们甚至不知道的东西。
为了提示您的用户授予您权限,查看“设置”应用中的权限设置,并能够发送带有声音和消息的通知,您必须在代码中的某个位置向系统请求此类权限使用以下代码:
iOS 9:
UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil))
然后在您的 App Delegate 中实现func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) 哟检查用户是否已授予您权限。 (检查notificationSettings.types是否为空,如果是则用户已拒绝)。
iOS 10 及更高版本:
import UserNotifications
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted in
if (granted) {
// ...
}
}
当您执行这些代码时,系统会立即向用户显示警报,要求他们授予或拒绝您的应用程序显示通知的权限,这些通知可以包含警报、声音并在您的应用程序图标上显示一个徽章。做出选择后,用户可以进入“设置”应用并查看/更改他们的选择,您现在将看到您的应用具有通知设置。
附:由于用户可以稍后修改和更改他们的通知设置到您的应用程序,您不应该将授予的状态存储在您的应用程序中。相反,每次需要时使用适当的 API 来获取当前状态。对于 iOS 9,检查 UIApplication.shared.currentUserNotificationSettings?.types 是否为空(空表示您没有权限),在 iOS 10 及更高版本上使用 UNUserNotificationCenter.current().getNotificationSettings { settings in ... } 检查设置是否包含任何类型。可选地,调用requestAuthorization 也可以直接返回您授予的布尔值,如果用户已被提醒并做出选择,requestAuthorization 方法将直接为您提供用户的选择,而无需再次询问。
TL;DR您尚未向用户请求权限。他们不会看到权限警报,并且在您完成此操作之前,您不会在“设置”应用中找到您的应用的通知设置。