Firebase云消息推送仅在发布时无法工作

4
我已经在我的Flutter应用中实现了Firebase Cloud Messaging,大多数情况下它似乎运作良好。当我使用以下方式之一时,我可以在我的应用程序中收到通知:
  • 使用flutter run
  • 使用flutter run --release
  • 使用Xcode的Product > Run
这些都是针对连接到计算机的我的iPhone。我正在使用flavors(dev、qa、prod),并且它在所有flavors上都可以工作。
当我将其打包为Firebase App Distribution或Testflight时,它不起作用。更容易专注于App Distribution,所以我将解决方法放在这里。
在设置消息传递功能时,我已在XCode中启用了推送通知(最初我遇到了使用开发APNs的问题,但我更改了配置以使用生产服务)。这是我的entitlement文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>aps-environment</key>
    <string>production</string>
    <key>com.apple.developer.applesignin</key>
    <array>
        <string>Default</string>
    </array>
    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>applinks:N/A</string>
    </array>
</dict>
</plist>

同时,在 Info.plist 文件中也启用了后台模式:

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>remote-notification</string>
</array>

我在苹果开发者门户网站上创建了一个必需的密钥: Apple Developer Portal key 我已按照要求将其上传到Firebase: Firebase key configurtion 在部署到App Distribution时,我运行以下命令:
flutter build ios --flavor <env>
cd ios
xcodebuild -workspace Runner.xcworkspace -scheme <env> archive -archivePath Runner.xcarchive
xcodebuild -exportArchive -archivePath Runner.xcarchive -exportOptionsPlist exportOptions.plist -exportPath ../build/ios -allowProvisioningUpdates

其中之一是我提到的口味,而我的exportOptions.plist文件为:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>compileBitcode</key>
    <false/>
    <key>method</key>
    <string>ad-hoc</string>
</dict>
</plist>

我很高兴为您提供更多线索、配置和解释,但现在我不知道缺少什么或者什么原因导致了这种情况。因此问题是,当通过存档部署时,为什么推送通知无法工作?


我应该注意到,是的,我正在使用firebase_messaging 7.0.3。我知道有一个开发版本是相当大的改进,但由于我要在昨天投入生产,我不能将非生产构建放入生产环境中。 - frisbeetarian
1个回答

3

TLDR: 我在我的AppDelegate.swift文件中缺少了application.registerForRemoteNotifications()

看起来我的AppDelegate.swift文件可能会有所帮助:

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }
    let controller : FlutterViewController = window.rootViewController as! FlutterViewController
    let flavorChannel = FlutterMethodChannel(name: "flavor", binaryMessenger: controller.binaryMessenger)
    flavorChannel.setMethodCallHandler({ (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
        result(Bundle.main.infoDictionary?["Flavor"])
    })
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

我们按照firebase_messaging项目的README中的指示进行了实现(https://pub.dev/packages/firebase_messaging)。这需要添加if #available行。是的,这仅用于执行方法交换,并且我们没有在Info.plist文件中添加FirebaseAppDelegateProxyEnabled,但我偶然发现Flutter FCM on iOS 14(它们正在实现交换),并注意到它们的文件中有一行额外的代码:application.registerForRemoteNotifications()。一旦我添加了这行代码(在return之前的那一行),推送通知就开始工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接