马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
以下是关于 iOS 通知开发的体系限定和隐私规范的详细指南,帮助避免常见问题并提升用户体验:
一、iOS 体系限定与应对策略
1. 后台使命时长限定
限定类型具体规则办理方案当地通知触发应用克制后,UNTimeIntervalNotificationTrigger 可能不触发改用 UNCalendarNotificationTrigger 或后台使命续期后台处理时间收到推送后约有 30秒 执行时间(实测通常更短)关键逻辑需在前台预加载,后台仅做标记Service Extension处理富媒体通知最长运行 30秒大文件下载应利用 URLSession 后台下载 代码示例 - 后台使命优化:
- // 使用 BGTaskScheduler 延长后台时间
- BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.youapp.refresh", using: nil) { task in
- self.handleAppRefresh(task: task as! BGAppRefreshTask)
- }
- func handleAppRefresh(task: BGAppRefreshTask) {
- task.expirationHandler = {
- // 任务即将超时时清理资源
- }
-
- // 实际任务逻辑(如更新数据后发本地通知)
- DispatchQueue.global().async {
- fetchNewData { result in
- if result {
- scheduleLocalNotification()
- }
- task.setTaskCompleted(success: true)
- }
- }
- }
复制代码 2. 通知数量限定
限定项阈值发起待处理当地通知64个(超出时最早的通知会被丢弃)紧张通知利用 repeats: false通知分组表现同一线程ID默认表现最新2条(可睁开)公道设置 threadIdentifier 分组优化本事:
- let content = UNMutableNotificationContent()
- content.threadIdentifier = "ORDER_UPDATE_123" // 相同ID的通知自动分组
复制代码 二、用户隐私与推送规范
1. 隐私合规要求
地区法规关键要求实现发起GDPR(欧盟)必须得到用户明确同意后才能发送营销通知实现分层授权(必要通知/营销通知)CCPA(加州)提供"不贩卖个人信息"的选项通知设置中增长数据利用开关中国个人信息保护法需单独同意敏感权限(如地理位置通知)分场景哀求权限 合规授权流程示例:
- func requestNotificationAuthorization() {
- let options: UNAuthorizationOptions = [.alert, .badge]
- UNUserNotificationCenter.current().requestAuthorization(options: options) { granted, _ in
- if granted {
- // 基础权限已授权,再请求营销权限
- DispatchQueue.main.async {
- showMarketingPermissionDialog()
- }
- }
- }
- }
复制代码 2. 推送频率发起
通知类型保举频率用户容忍度交易类(订单/支付)及时发送★★★★★交际互动(批评/点赞)≤ 5条/小时★★★☆☆营销推送≤ 1条/天★★☆☆☆消息资讯≤ 3条/天★★★☆☆ 频率控制方案:
- // 使用 UserDefaults 记录最后发送时间
- func canSendMarketingNotification() -> Bool {
- let lastSendDate = UserDefaults.standard.object(forKey: "lastMarketingDate") as? Date ?? Date.distantPast
- return Calendar.current.dateComponents([.day], from: lastSendDate, to: Date()).day! >= 1
- }
复制代码 三、最佳实践清单
1. 必做项
- 测试全部场景:应用在前台/后台/克制状态下的通知表现
- 处理权限拒绝:引导用户去设置界面开启权限(利用 UIApplication.openSettingsURLString)
- 清算逾期通知:应用启动时移除已无意义的预定通知
- UNUserNotificationCenter.current().removeAllDeliveredNotifications()
复制代码 2. 避免项
- ❌ 滥用临时授权(Provisional):静默发送过多通知会导致用户关闭权限
- ❌ 过度利用角标:未读数量超过20时iOS会主动表现"…",失去提示意义
- ❌ 忽略勿扰模式:查抄 UIScreen.main.isCaptured 避免在屏幕录制时发送敏感通知
3. 性能优化
- 附件预处理:图片压缩到 ≤10MB,视频 ≤50MB
- func compressImage(_ url: URL) -> URL? {
- guard let image = UIImage(contentsOfFile: url.path) else { return nil }
- let targetSize = CGSize(width: 1200, height: 1200) // 适合通知的尺寸
- let renderer = UIGraphicsImageRenderer(size: targetSize)
- let resizedImage = renderer.image { _ in image.draw(in: CGRect(origin: .zero, size: targetSize)) }
- // 保存到临时目录...
- }
复制代码 - 淘汰唤醒次数:归并多个数据更新到单次通知
四、调试本事
- 模拟器快速测试:
- # 通过终端触发通知
- xcrun simctl push booted com.you.app.id payload.json
复制代码 - 真机日志过滤:
- // 在AppDelegate中添加
- func printNotificationSettings() {
- UNUserNotificationCenter.current().getNotificationSettings { settings in
- print("当前权限状态: \(settings.authorizationStatus.rawValue)")
- }
- }
复制代码 - 崩溃预防:
- // 所有UNUserNotificationCenter回调必须调用completionHandler
- func userNotificationCenter(_ center: UNUserNotificationCenter,
- willPresent notification: UNNotification,
- withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
- completionHandler([]) // 即使不显示也要调用
- }
复制代码 通过遵照这些规范,可以在满足体系限定和隐私要求的前提下,构建出高效、用户友好的通知体系。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |