UNNotificationServiceExtension

UNNotificationServiceExtension

我有一个用Swift编写的UNNotificationServiceExtension。它所做的一切:

  • 设置通知标题
  • 设置通知正文
  • 加载图像并调用contentHandler ()

  • 这是我在做什么的简短版本:
    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        self.bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent
    
        bestAttemptContent!.title = GetNotificationTitle(userInfo)
        bestAttemptContent!.body = GetNotificationBody(userInfo)
    
        if let imageUrl = <get image url> {
            let imageLoaderTask = URLSession.shared.dataTask(with: URL.init(string: imageUrl)!) { (newsImageData, newsImageUrl, newsImageError) -> Void in
                if newsImageError == nil && newsImageData != nil {
                    let documentDirectory = self.GetDocumentDirectory()
                    if documentDirectory != nil {
                        let newsFileURL = documentDirectory?.appendingPathComponent("news_image").appendingPathExtension("png")
                        do {
                            try newsImageData?.write(to: newsFileURL!)
                            let attachment = try UNNotificationAttachment(identifier: "newsImage",
                                                                          url: newsFileURL!,
                                                                          options: nil)
                            self.bestAttemptContent?.attachments = [ attachment, ]
                            self.contentHandler!(self.bestAttemptContent!)
                            return
                        } catch {}
                    }
                }
                self.contentHandler!(self.bestAttemptContent!)
            }
            imageLoaderTask.resume()
        } else {
            self.contentHandler!(self.bestAttemptContent!)
        }
    }
    

    95%的情况下-效果很好。但是,偶尔会到达通知,而不会进行任何更改(即标题,正文保持不变,未附加图片)。

    我知道:
  • 不是超时:serviceExtensionTimeWillExpire不称为
  • 看起来不像UNNotificationServiceExtension崩溃:我添加了很多NSLog()调用来检查设备日志- self.contentHandler!(self.bestAttemptContent!)触发
  • 它在我的iPhone上而不是在iPad上更常见
  • 我没有在设备日志中找到关于
  • 问题的任何线索

    有人遇到这个问题吗?任何解决方法?有什么想法吗?

    最佳答案

    首次宣布该功能时,我构建了一个UNNotificationServiceExtension。两个想法:

  • 由于系统问题,基础URLSession数据任务无法获取远程媒体。进行系统诊断,并在libnetwork.dylib中查找错误。
  • 服务扩展是其自己单独的二进制文件和进程。系统可能没有启动该进程,或者无法打开您的应用程序进程与服务扩展之间的链接。我还要检查sysdaignose是否显示任何表示进程的马赫端口为nil的信息。
  • 10-08 02:38