如何为 Firebase 添加通知服务扩展?

Posted

技术标签:

【中文标题】如何为 Firebase 添加通知服务扩展?【英文标题】:How to add Notification Service Extension for Firebase? 【发布时间】:2019-08-11 00:59:47 【问题描述】:

我正在尝试按照此处的指南进行操作:https://firebase.google.com/docs/cloud-messaging/ios/send-image

我去了New > Target > Notification Service Extension(把这个新的target嵌入到原来的target中)并粘贴在NotificationService.m

@interface NotificationService ()

@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler 
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    // Modify the notification content here...
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];

    // Call FIRMessaging extension helper API.
    [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent
                                             withContentHandler:contentHandler];

    self.contentHandler(self.bestAttemptContent);


- (void)serviceExtensionTimeWillExpire 
    // Called just before the extension will be terminated by the system.
    // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
    self.contentHandler(self.bestAttemptContent);


@end

我现在收到Use of undeclared identifier 'FIRMessaging' in NotificationService.m

NotificationService.m 中,我尝试导入类似于我的原始目标的AppDelegate.m,其中FIRMessaging 可用并且没有问题:

#import "NotificationService.h"
#import <Firebase.h>
#import "RNFirebaseNotifications.h"
#import "RNFirebaseMessaging.h"
...

然后我得到'Firebase.h' file not found。我很困惑,因为它似乎在原始目标中工作,并且此通知服务扩展嵌入在该目标中。我试过弄乱Header Search PathsFramework Search Paths,但运气不佳。我做错了什么?

【问题讨论】:

您是否在 podfile 中为“服务扩展”添加了 Firebase? 哦,我不知道我的 Podfile 中还需要另一个目标!这很有效,让我克服了导入错误。现在我用FirMessagingRemoteNotificationsProxy.msharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based solutions where appropriate instead." 酷。您在哪一行收到此错误? NSObject&lt;UIApplicationDelegate&gt; *appDelegate = [[UIApplication sharedApplication] delegate]; 我读过 Firebase 将其升级为不使用 sharedApplication: github.com/firebase/firebase-ios-sdk/pull/1503,但我被困在旧版本 5.4.0 上。 :C 不,您不能从“服务扩展”访问 AppDelegate。我也尝试用它来更新推送通知的批量计数,但没有用。 【参考方案1】:

您只需在现有的 podfile 中添加以下文本。

target 'NotificationImage' do
   pod 'Firebase/Messaging'
end

只有您才能看到要包含在项目中的文件。

【讨论】:

不生成 NotificationService.m 文件?我该怎么办?手动创建此文件或其他内容。请帮忙。【参考方案2】:

放入你的 podfile

target 'yourNotificationServiceTarget' do
   pod 'Firebase/Messaging'
end

之后,放入你的 NotificationService.m

@import Firebase;

【讨论】:

【参考方案3】:

(1) 在您的 podfile 中添加 'Firebase/Messaging'。不要在您的应用扩展目标中添加不必要的 pod,因为 Apple 在应用扩展中不允许使用某些 API,例如UIApplication.shared。否则你可能会遇到很多错误。

target 'NotificationServiceExtension' do
   pod 'Firebase/Messaging'
end

(2) 关闭项目并运行pod install

查看this 教程,了解如何将 pod 添加到多个目标。

【讨论】:

【参考方案4】:

您必须先安装 'Firebase/Messaging' pod。然后将以下内容添加到 pod 文件的底部。

target 'NotificationImage' do
  inherit! :search_paths
end

如果不行,请按以下方式写:

#Uncomment the following line if you want to add a global app version
#platform :ios, '10.0'

def shared_pods
  # your pods here
end

target 'YourProjectName' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!
  shared_pods

  target 'YourNotificationExtensionName' do
    inherit! :search_paths
  end
end

【讨论】:

以上是关于如何为 Firebase 添加通知服务扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何为特定令牌设置静默通知?

如何为应用程序在后台显示的通知设置自定义布局?

如何为firebase字段添加价值

如何为通知中心全宽制作 iOS 应用扩展?

Firebase Cloud Messaging to Android 工作,但 iOS 失败。如何为 iOS 构建有效负载?

如何为分析添加 Firebase 自定义事件?