You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt跨平台应用iOS推送通知无显示问题求助

解决Qt iOS跨平台应用通知不显示的问题

我之前也遇到过类似的Qt iOS通知不显示的问题,结合iOS 10+的通知API要求,给你几个关键的排查和修复步骤:

1. 先确认通知权限是否正确申请

iOS 10及以上彻底弃用了旧的UIUserNotificationSettings接口,必须使用UserNotifications框架来请求权限,这是很多示例项目容易忽略的点:

  • 在iOS原生代码文件(比如AppDelegate.mm)中添加权限请求逻辑:
    #import <UserNotifications/UserNotifications.h>
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // 请求通知权限
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)
                              completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                  if (granted) {
                                      NSLog(@"通知权限已获取");
                                  } else {
                                      NSLog(@"通知权限被拒绝,请引导用户在设置中开启");
                                  }
                              }];
        return YES;
    }
    
  • 必须在Info.plist中添加权限描述,否则系统会直接拒绝权限申请:
    添加NSAlertUsageDescription键,值填你的应用需要通知权限的原因(比如"接收应用更新提醒")。

2. 替换旧的通知API为iOS 10+兼容版本

你用的示例项目大概率还在使用已弃用的UILocalNotification,需要替换成UNNotificationRequest相关接口:

  • 把原来的本地通知代码替换成如下逻辑(可以封装成Qt调用的原生方法):
    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.title = @"Qt应用通知";
    content.body = @"这是一条测试通知";
    content.sound = [UNNotificationSound defaultSound];
    
    // 立即触发通知(也可以用日期/位置触发器)
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];
    
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"QtTestNotification" content:content trigger:trigger];
    
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"添加通知失败:%@", error.localizedDescription);
        }
    }];
    

3. 处理前台通知显示

iOS默认不会在应用前台显示通知,需要实现代理方法手动开启:

  • 在AppDelegate.mm中设置通知中心代理并实现对应方法:
    // 在didFinishLaunchingWithOptions中添加
    [center setDelegate:self];
    
    // 实现UNUserNotificationCenterDelegate方法
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
        // 允许前台显示通知(弹窗+声音)
        completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound);
    }
    
  • 记得在AppDelegate.h中声明遵循UNUserNotificationCenterDelegate协议。

4. 检查项目配置细节

  • 确保项目编译目标设置为iOS 10.0及以上(在Xcode的Project -> Build Settings -> Deployment Info中配置)。
  • 如果是远程通知,需要在Capabilities中开启Push Notifications;本地通知不需要,但如果需要后台触发通知,要添加remote-notification到UIBackgroundModes中。
  • 测试时一定要用真机!iOS模拟器的通知机制偶尔会有延迟或不触发的情况。

5. 权限排查

如果以上步骤都做了还是没显示,去iOS设置中确认:

  • 打开设置 -> 找到你的应用 -> 通知 -> 确保允许通知开关是打开的,并且通知中心选项已勾选。

内容的提问来源于stack exchange,提问作者Kiran Prusty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:11:40