iOS 18使用setAlternateIconName更换图标后通知图标不更新问题咨询
iOS 18中setAlternateIconName更换图标后通知图标不更新的问题与解决方法
问题背景
使用setAlternateIconName动态更换应用图标时,iOS 15上系统通知会同步显示新图标,但iOS 18中仅应用图标更新成功,通知仍展示旧图标。相关配置已完成:Assets.xcassets中添加了替代图标,Build Settings设置INCLUDE_ALL_APPICON_ASSETS = YES、ALTERNATE_APPICON_NAMES = AppIcon_ClubIcon,图标更换逻辑代码如下:
- (void)changeIconToClub { if ([[UIApplication sharedApplication] supportsAlternateIcons]) { [[UIApplication sharedApplication] setAlternateIconName:@"AppIcon_ClubIcon" completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"Failed to change icon: %@", error.localizedDescription); } }]; } else { NSLog(@"Alternate icons are not supported on this device."); } }
已知情况
iOS 18对通知框架的图标获取逻辑做了调整,默认不会自动同步通过setAlternateIconName更换的替代图标,这是当前版本的行为变更,并非API调用错误。
解决方案
1. 发送通知时手动指定图标(推荐)
在创建本地通知或配置远程推送payload时,明确指定通知要使用的图标名称,让通知直接关联对应的替代图标:
本地通知实现(Objective-C)
UNMutableNotificationContent *notificationContent = [[UNMutableNotificationContent alloc] init]; notificationContent.title = @"示例通知"; notificationContent.body = @"这是一条使用自定义图标的通知"; // 设置与更换后的图标一致的名称 notificationContent.appIconName = @"AppIcon_ClubIcon"; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"customIconNotification" content:notificationContent trigger:nil]; [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"添加通知失败: %@", error.localizedDescription); } }];
远程推送Payload配置
在推送的JSON payload中添加app-icon-name字段,值为你的替代图标名称:
{ "aps": { "alert": { "title": "远程推送通知", "body": "使用自定义图标展示" }, "app-icon-name": "AppIcon_ClubIcon" } }
2. 清理历史通知(仅适用于已展示的旧通知)
如果是已经显示在通知中心的历史通知,由于iOS 18的缓存机制,无法直接更新其图标,可通过清除旧通知来避免用户看到不一致的图标:
// 清除所有已展示的通知 [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];
注意:此方法会清除所有通知,可能影响用户体验,仅作为临时补充方案。
注意事项
- 确保
appIconName的值与Assets.xcassets中定义的替代图标名称完全一致,大小写敏感 - 若应用支持多种替代图标,需在更换图标后记录当前使用的图标名称,发送通知时动态设置对应的
appIconName
内容的提问来源于stack exchange,提问作者Sarthak Tamrakar
相关产品推荐
相关产品推荐

