iOS 通知

iOS 通知分为本地推送和远程推送两类

一. 本地推送使用流程

1. 注册通知
objectivec 复制代码
//请求通知权限
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (error) { NSLog(@"request authorization error: %@", error); }
}];

//注册通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
2.推送通知
objectivec 复制代码
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; //标题
content.sound = [UNNotificationSound defaultSound];
        
NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber + 1;
content.badge = @(badge);
content.body = message;// 本地推送一定要有内容,即body不能为空。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
    if (@available(iOS 15.0, *)) 
    {
        content.interruptionLevel = UNNotificationInterruptionLevelTimeSensitive;//会使手机亮屏且会播放声音;可能会在免打扰模式(焦点模式)下展示
             // @"{"aps":{"interruption-level":"time-sensitive"}}";
             // @"{"aps":{"interruption-level":"active"}}";
             content.body = message;// 本地推送一定要有内容,即body不能为空。
    }
#endif

// repeats,是否重复,如果重复的话时间必须大于60s,要不会报错
//UNCalendarNotificationTrigger 如果是时间触发
//UNLocationNotificationTrigger 地点触发
 UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01  repeats:NO];

 /* */
//添加通知的标识符,可以用于移除,更新等搡作
NSString * identifier = [[NSUUID UUID] UUIDString];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) 
{
    if(!error)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
                     
        });
    }
}];


//点击本地通知回调 
/*API_DEPRECATED("Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]"*/

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    //
}

二.远程推送(APNS)

1. 远程推送的五步骤

1).应该程序注册APNS消息推送

2).ios 从APNS Server得到devicetoken.

3).应用程将devicetoken发送从自己的服务器。

4).服务器将消息发送给APNS服务器。

5).APNS发送给app

苹果官司方给机制解释图

2. 远程推送大小限制

远程通知负载的大小根据服务器使用的API不同而不同

当使用HTTP/2 provider API时,负载最大为4kB;当使用legacy binary interface时,负载最大为2kB。当负载大小超过规定的负载大小时,APNs会拒绝发送此通知

3.推送通知实现
1)首先 设置 app 的bundle Id 支持 通知推送
2)申请推送通知证书,这个证书主要是服务器需要使用的

推送证书的申请过程和其它证书类似

3)app 注册通知 这部分和本地通知是一样的。
objectivec 复制代码
//请求通知权限
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (error) { NSLog(@"request authorization error: %@", error); }
}];

//注册通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
4)收到APNS 发送的token 并发送给服务器
objectivec 复制代码
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //注册推送消息成功
    //收到deviceToken并发送给服务器
    NSLog(@"deviceToken = %@", deviceToken);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error API_AVAILABLE(ios(3.0))
{
    //注册推送消息失败
}

服务器收到token后,需要发送消息时,就可以把token,消息内容和证书一起发送给

APNS服务器,APNS就推送给app了。

5)app收到推送通知后的处理

1> app被杀死时,用户点击通知会在didFinishLaunchingWithOptions获取通知内容

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

...
    
// 注册通知类型
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (error) { NSLog(@"request authorization error: %@", error); }
}];
[[UIApplication sharedApplication] registerForRemoteNotifications];


// app 被杀死时用户点击通知 获取推送内容
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
   //能过点击通知启动app
   NSLog(@"userInfo = %@", userInfo);

}

...

}

2> app在后台,点击通知

复制代码
//老版处理
/*- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    DDLogDebug(@"userInfo ----->%@",userInfo);
}*/

//新版处理
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler
{
    DDLogDebug(@"userInfo ----->%@",userInfo);
}

三.推送功能的测试

有个推送测试的工具 SmartPush

下载地址:

1、Github地址:https://github.com/shaojiankui/SmartPush

2、release安装包:https://github.com/shaojiankui/SmartPush/releases

3、消息体格式:

复制代码
{
  "aps": {
    "alert": {
      "title": "新消息",
      "body": "您有一条新的消息!"
    },
    "badge": 1,
    "sound": "default"
  },
  "customData": {
    "type": "message",
    "id": "12345"
  }
}
相关推荐
HarderCoder2 小时前
iOS 知识积累第一弹:从 struct 到 APP 生命周期的全景复盘
ios
叽哥12 小时前
Flutter Riverpod上手指南
android·flutter·ios
用户092 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan2 天前
iOS26适配指南之UIColor
ios·swift
权咚2 天前
阿权的开发经验小集
git·ios·xcode
用户092 天前
TipKit与CloudKit同步完全指南
ios·swift
法的空间2 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_915918413 天前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张3 天前
iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
android·安全·ios·小程序·uni-app·iphone·webview
Magnetic_h3 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa