当UNNotificationExtensionUserInteractionEnabled为true时如何从UNNotificationContentExtension触发didReceiveRemoteNotification

时间:2019-05-14 10:58:42

标签: ios swift apple-push-notifications

背景

我已经实现了UNNotificationContentExtension,以便可以格式化接收到的APNS数据并按我的需要进行呈现,如下所示

enter image description here

我希望用户点击星号并进行评分,因此我已在UNNotificationContentExtension上启用了与用户的互动,

<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>UNNotificationExtensionCategory</key>
        <string>test</string>
        <key>UNNotificationExtensionDefaultContentHidden</key>
        <true/>
        <key>UNNotificationExtensionInitialContentSizeRatio</key>
        <real>1</real>
        <key>UNNotificationExtensionOverridesDefaultTitle</key>
        <false/>
        <key>UNNotificationExtensionUserInteractionEnabled</key>
        <true/>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.usernotifications.content-extension</string>
</dict>

出了什么问题?

现在,用户可以点按星标并对其进行评分,但是由于无论用户在通知视图上的何处,都启用了用户交互,因此通知不会关闭,也不会将数据移交给父应用程序。因此,无论用户点击自定义UI多少次,都不会调用didReceiveRemoteNotification

我想实现什么?

当用户点击任意星号或点击自定义UI的任意位置时,我希望普通的iOS通知流能够启动并将通知有效负载移交给iOS父应用。如果用户点击“星际疾病”,则传播等级,否则将传递0。

didReceiveRemoteNotification为真时,用户单击自定义UI时,如何关闭通知并触发父应用didFinishLaunchingWithOptionsUNNotificationExtensionUserInteractionEnabled

1 个答案:

答案 0 :(得分:1)

弄清楚了:)苹果从iOS 12开始引入了performNotificationDefaultAction()

根据文档

    // Opens the corresponding applicaton and delivers it the default notification action response
    @available(iOS 12.0, *)
    open func performNotificationDefaultAction()

所以我要做的就是,一旦用户点击了任何一颗星星,我都必须以编程方式调用performNotificationDefaultAction

@IBAction func ratingTapped(_ sender: UIButton) {
        debugPrint("\(sender.tag)")
        if #available(iOSApplicationExtension 12.0, *) {
            self.extensionContext?.performNotificationDefaultAction()
        } else {
            // Fallback on earlier versions
        }
    }

如果您想在用户在自定义UI中点击任意位置(而不是仅在星星上)时将通知移交给父应用,则可以覆盖hitTestpointInside并运行相同的语句:D

self.extensionContext?.performNotificationDefaultAction()

希望它可以帮助以后偶然遇到类似问题的人:)