iOS模拟器运行Flutter应用报错:未设置iOS通知配置求助
解决方案
1. 修复「iOS settings must be set」错误
在main.dart中初始化FlutterLocalNotificationsPlugin时,必须传入iOS平台的初始化设置,否则会触发该异常。修改初始化代码如下:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 配置iOS初始化参数 const IOSInitializationSettings iosSettings = IOSInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true, ); // 合并多平台初始化设置 const InitializationSettings initializationSettings = InitializationSettings( iOS: iosSettings, // 安卓平台设置按需添加 // android: AndroidInitializationSettings('@mipmap/ic_launcher'), ); // 初始化插件 await flutterLocalNotificationsPlugin.initialize(initializationSettings); runApp(const YourApp()); }
2. 修复「no valid “aps-environment” entitlement string」警告
这个警告和推送权限配置有关,处理步骤如下:
- 用Xcode打开项目的
ios/Runner.xcworkspace - 选中左侧的
Runner目标,切换到Signing & Capabilities标签页 - 点击
+ Capability,搜索并添加Push Notifications能力 - 确保
Signing Team已正确配置(使用有效的开发者账号) - 若仅在模拟器运行,该警告可忽略;若需彻底消除,可在
Info.plist中添加:<key>APS Environment</key> <string>development</string>
3. 修正AppDelegate.swift的通知代理配置
当前代码中UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate存在类型转换问题,需修改AppDelegate使其遵循协议:
import UIKit import Flutter import flutter_downloader import GoogleMaps import flutter_local_notifications @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate, UNUserNotificationCenterDelegate { // 添加协议遵循 override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in GeneratedPluginRegistrant.register(with: registry) } GeneratedPluginRegistrant.register(with: self) if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self // 移除as?类型转换 } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
完成以上修改后,重新运行项目即可解决这两个问题。
内容的提问来源于stack exchange,提问作者coolhack7
相关产品推荐
相关产品推荐

