swift 为什么通知服务扩展在iOS 14上没有启动?

biswetbf  于 2023-08-02  发布在  Swift
关注(0)|答案(3)|浏览(134)

我已经集成了UNNotificationServiceExtension,它允许我在向用户呈现推送通知之前更改标题。
我已经遵循了apple developer documentation中提到的指导方针,也浏览了SO上的相关问题,但似乎没有任何效果。

按照指示,我已经遵循了这些指导原则

  • 包含“可变内容”:1在您的推送通知有效负载中
  • 扩展的部署目标应正确设置(应与主应用目标匹配)
  • 有效负载必须包括带有标题、副标题或正文信息的警报字典
  • 推送通知的有效负载中的“aps”字典必须包括具有字符串值的键“category”。

问题

我的通知服务扩展有时不会在收到推送通知时触发,主要是在我删除并安装新的应用程序副本时。在这种情况下也不会触发断点。系统似乎忘记触发服务扩展。我选择了正确的扩展方案,而不是主要的应用程序目标。我的通知标题没有按照我的逻辑更新。

注意:此操作发生在iOS 14上。在iOS 12上,它工作得很好。这是iOSbug吗?

这已经在这些线程中讨论过了。
https://developer.apple.com/forums/thread/67202https://developer.apple.com/forums/thread/125987
如果你能帮忙的话,我将不胜感激。谢了,谢了

示例代码

我做了一个示例项目来演示这个问题。您可以从Github Repo下载

WWDC相关视频

Best Practices and What’s New in User Notifications

pdtvr36n

pdtvr36n1#

您必须修改UNNotificationRequest内容部分。下面是我用于通知扩展的代码片段。

import UserNotifications

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        if let bestAttemptContent = bestAttemptContent {
            var urlString:String? = nil
            if let urlImageString = request.content.userInfo["urlImageString"] as? String {
                urlString = urlImageString
            }
            // You can set what ever title you want to set
            bestAttemptContent.title = "Your custom tile goes here"
            if urlString != nil, let fileUrl = URL(string: urlString!) {
                print("fileUrl: \(fileUrl)")
                
                guard let imageData = NSData(contentsOf: fileUrl) else {
                    contentHandler(bestAttemptContent)
                    return
                }
                guard let attachment = UNNotificationAttachment.saveImageToDisk(fileIdentifier: "image.jpg", data: imageData, options: nil) else {
                    print("error in UNNotificationAttachment.saveImageToDisk()")
                    contentHandler(bestAttemptContent)
                    return
                }
                
                bestAttemptContent.attachments = [ attachment ]
            }
            
            contentHandler(bestAttemptContent)
        }
    }
    
    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }

}

@available(iOSApplicationExtension 10.0, *)
extension UNNotificationAttachment {
    
    static func saveImageToDisk(fileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? {
        let fileManager = FileManager.default
        let folderName = ProcessInfo.processInfo.globallyUniqueString
        let folderURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(folderName, isDirectory: true)
        
        do {
            try fileManager.createDirectory(at: folderURL!, withIntermediateDirectories: true, attributes: nil)
            let fileURL = folderURL?.appendingPathComponent(fileIdentifier)
            try data.write(to: fileURL!, options: [])
            let attachment = try UNNotificationAttachment(identifier: fileIdentifier, url: fileURL!, options: options)
            return attachment
        } catch let error {
            print("error \(error)")
        }
        
        return nil
    }
}

字符串
我使用的JSON payload

{
  "aps": {
    "alert": {
      "title": "title",
      "body": "Your message Here"
    },
    "mutable-content": 1
  },
  "urlImageString": "https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885__340.jpg"
}


使用您的代码库,我得到的输出为

如果要调试NotificationService扩展,则必须从下拉列表中选择NotificationServiceExtension方案,然后断点才能正常工作

tf7tbtn2

tf7tbtn22#

更新

我已经为这个问题提交了Techinical support Incident。我对通知服务扩展进行了广泛的研发。根据苹果文档在一个香草项目中实现了它。我们的配置和一切似乎都是正确的。所以我就这个问题请求苹果的技术支持,并得到了这个答复。
我们已确定您看到此问题是由于iOS中的错误。请使用Feedback Assistant(https://feedbackassistant.apple.com)提交关于此问题的完整错误报告。有关反馈助手的更多信息,请访问https://developer.apple.com/bug-reporting/
请在bug报告中再次包含您提供给我的所有信息(您可以直接将日志附加到bug报告中)。请确保按照https://developer.apple.com/bug-reporting/profiles-and-logs/上的说明和APNS(Apple推送通知服务)的说明在设备上安装日志记录配置文件,并确保在重现问题之前已安装日志记录配置文件。

重要:在反馈助手中,当在macOS、iOS、watchOS或tvOS上提交有关API/SDK的错误报告时,请选择相应的API/SDK区域(在“其他不在此列表中的内容”之后)。

所以,我将提交一份bug报告给苹果。我会更新这个答案一旦得到了错误报告的回复。

a0zr77ik

a0zr77ik3#

唯一对我有效的解决方案(2023年7月21日)是:
1.取消选中“安装时复制”。
1.从“框架”中删除通知服务扩展,然后重新添加(重新启动iPhone)。

相关问题