IOS:应用内通知+通知服务+内容扩展

Posted

技术标签:

【中文标题】IOS:应用内通知+通知服务+内容扩展【英文标题】:IOS: Inapp notification + Notification Service + Content extensions 【发布时间】:2017-09-27 13:36:44 【问题描述】:

问题是通知服务扩展本身没有用,除了在应用程序被杀死时可以显示的一件事。因此,通过应用内通知和内容扩展,我可以显示自定义通知,但只有在应用未被杀死/强制关闭时才会显示该通知。 问题:如果有内容和服务通知扩展,如何管理应用内通知,以及如何强制通知服务扩展调用/唤醒通知内容扩展。

【问题讨论】:

【参考方案1】:

似乎我需要清理项目并删除应用程序并重新安装。这是 FCM 实现这种情况的完整步骤,可能有些步骤是多余的,但我不想在它工作的时候碰它:

应用程序被杀死/关闭:通知出现在自定义内容视图中 应用程序在后台:通知出现在自定义内容视图中 应用程序在前台:通知以静默方式到达

    从服务器端,通知应如下所示

    “通知”://强制 “数据”:, "body":""//似乎也是必须的,无论如何你可以在服务扩展中更改它 "content_available":true,//强制 "mutable_content":true,//强制 "to":""//必填项

    创建通知服务扩展目标。

    在 NSExtension 下的 info.plist 中,将 UNNotificationExtensionCategory 添加为 Array 并添加一个任意名称的类别,但在任何地方都使用相同的名称。 在通知服务扩展目标中,确保所有内容都与主目标中的相同(swift 版本、构建版本、部署目标、设备)。 在功能中添加应用组(应与主要目标中相同)。

    在 NotificationService 中的 didReceive 中获取可变内容

    bestAttemptContent = (request.content.mutableCopy() as?UNMutableNotificationContent)

    将您的类别添加到内容中

    bestAttemptContent.categoryIdentifier = "yourCategory"

    调用contentHandler(bestAttemptContent) 后会出现标准通知。

    创建通知内容扩展目标。

    在 NSExtension 下的 info.plist 中,将 UNNotificationExtensionCategory 添加为数组,并添加一个与您已经为服务创建的名称相同的类别。 根据您的设计更改 MainInterface.storyboard 中的设计。 在 NotificationViewController 中,自定义数据将位于 notification.request.content.userInfo["gcm.notification.data"] 中。所以在 NotificationViewController 中用数据填充视图。不要忘记preferredContentSize。 在功能中添加应用组(应与主要目标中相同)。 在主目标 AppDelegate 中实现 UNUserNotificationCenterDelegate

    didFinishLaunchingWithOptions添加

    UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) (granted, error) in application.registerForRemoteNotifications()

    在 AppDelegate 中添加

    func application(_application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken 设备令牌:数据) Messaging.messaging().apnsToken = deviceToken

    在 userNotificationCenter willPresent 检查您的应用程序是否未运行。我是这样弄的:

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent 通知: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 如果 self.window?.rootViewController == nil 完成处理程序([.badge,.alert,.sound]) UIApplication.shared.applicationIconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1

    在此处处理静默通知:

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

      点击此处的通知:

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

这里你可以用同样的方式response.notification.request.content.userInfo["gcm.notification.data"]获取自定义数据

    如果您有异步网络调用来加载数据/图像,请不要忘记实现func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void)

似乎仅此而已:)。啊,扩展程序从 ios 10 开始工作。如果缺少某些内容或某些内容是多余的,请纠正我。

【讨论】:

以上是关于IOS:应用内通知+通知服务+内容扩展的主要内容,如果未能解决你的问题,请参考以下文章

通知服务应用程序扩展必须在远程通知中显示媒体?

Apple iOS 应用内购买服务器到服务器通知的“取消”通知案例?

无法使用 ios 10 中的通知服务扩展在远程通知中附加媒体

iOS 10 通知服务扩展

未调用 iOS 推送通知服务扩展 (didReceive)

无法在 ios 10 通知中调试通知内容扩展