簡體   English   中英

傳入的豐富推送通知將不會顯示圖像。 斯威夫特4

[英]Incoming rich push notifications won't show the image. Swift 4

我正在嘗試實現豐富的推送通知,但是我沒有在傳遞的網址上顯示圖片。 當我打開通知時,我只能看到標題,副標題和正文。 我在https://www.pluralsight.com/guides/creating-ios-rich-push-notifications上跟隨該教程,因為我在其他帖子中發現了該建議,但是我一直堅持顯示圖像。 我還讀了一篇文章,我不應該運行該應用程序,但要運行NotificationExtension但是當我收到通知時,該應用程序崩潰

來自調試器的消息:由於信號9而終止程序以退出代碼0結束

信息。

這是運行應用程序時userInfo的打印內容:

[AnyHashable(“ attachment-url”): https ://firebasestorage.googleapis.com/v0/b/fix-it-b4b00.appspot.com/o/Prodotti%2FPrato.jpeg?alt=media&token=5d0fde09-2b86- 45b0-a383-a11e7e8e241c ,AnyHashable(“ gcm.message_id”):1560360808567562,AnyHashable(“ productId”):9290CEBE-393C-4285-BE7B-B9E2968A1AA0,AnyHashable(“ aps”):{alert = {主體=“ Nuova per articolo:Prato”; 副標題=“ Negozio:Vincenzo calia”; 標題=“ Promozione negozio”; }; “內容可用” = 1; “可變內容” = 1; 聲音= true; },AnyHashable(“ price”):10.00,AnyHashable(“ gcm.notification.priority”):高,AnyHashable(“ google.cae”):1]

我檢查了網址是否正確。 問題可能是網址不是字符串格式嗎? 我放了一個打印來檢查它,但是在'didReceive'方法開始時我什至沒有得到打印。 您知道哪里可能出問題了嗎? 一如既往非常感謝您的關注和投入。

這些是NotificationService.swift中的函數:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {

        print("NotificationService: dide receive called")
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        func failEarly() {
            contentHandler(request.content)
        }

        guard let content = (request.content.mutableCopy() as? UNMutableNotificationContent) else {
            return failEarly()
        }

        guard let apnsData = content.userInfo["data"] as? [String: Any] else {
            return failEarly()
        }

        guard let attachmentURL = apnsData["attachment-url"] as? String else {
            print("url is not in string form")
            return failEarly()
        }

        guard let imageData = NSData(contentsOf:NSURL(string: attachmentURL)! as URL) else { return failEarly() }
        guard let attachment = UNNotificationAttachment.create(imageFileIdentifier: "image.gif", data: imageData, options: nil) else { return failEarly() }

        content.attachments = [attachment]
        contentHandler(content.copy() as! UNNotificationContent)
    }

    override func 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.
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }


extension UNNotificationAttachment {
    static func create(imageFileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? {

        let fileManager = FileManager.default
        let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString
        let fileURLPath      = NSURL(fileURLWithPath: NSTemporaryDirectory())
        let tmpSubFolderURL  = fileURLPath.appendingPathComponent(tmpSubFolderName, isDirectory: true)

        do {
            try fileManager.createDirectory(at: tmpSubFolderURL!, withIntermediateDirectories: true, attributes: nil)
            let fileURL = tmpSubFolderURL?.appendingPathComponent(imageFileIdentifier)
            try data.write(to: fileURL!, options: [])
            let imageAttachment = try UNNotificationAttachment.init(identifier: imageFileIdentifier, url: fileURL!, options: options)
            return imageAttachment
        } catch let error {
            print("error \(error)")
        }

        return nil
    }
}

這是發送推送通知的函數:

static func sendTopicPushNotification(to topic: String, title: String, subtitle: String, body: String, dataUrl: String, productId: String, price: String) {
        let serverKey = firebaseServerKey // AAAA8c3j2...
        //            let topic = "/topics/<your topic here>"  // replace it with partnerToken if you want to send a topic
        let url = NSURL(string: "https://fcm.googleapis.com/fcm/send")

        let postParams: [String : Any] = [
            "to": topic,
//            "priority": "high",
//            "content_available": true,
//            "mutable_content": true,
            "notification": [
                //                    "badge" : 1, sendig the badge number, will cause aglitch
                "body": body,
                "title": title,
                "subtitle": subtitle,
                "text": "some text",
                "sound" : true, // or specify audio name to play
                "priority": "high",
                "content_available": true,
                "mutable_content": true
//                 "category" : "pushNotificationCategory" // "topicPushNotification"
//                    "click_action" : "🚀", // action when user click notification (categoryIdentifier)
            ],
            "data" : [
                "attachment-url": dataUrl,
                "productId": productId,
                "price": price
            ]
        ]


        let request = NSMutableURLRequest(url: url! as URL)
       request.httpMethod = "POST"
        request.setValue("key=\(serverKey)", forHTTPHeaderField: "Authorization")
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

        do {
            //                request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: JSONSerialization.WritingOptions())
            request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: [.prettyPrinted]) // working
            print("sendTopicPushNotification : My paramaters: \(postParams)")
        } catch {
            print("sendTopicPushNotification : Caught an error: \(error)")
        }

        let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
            if let realResponse = response as? HTTPURLResponse {
                if realResponse.statusCode != 200 {
                    print("sendTopicPushNotification : Not a 200 response : \(realResponse)")
                }
                print("sendTopicPushNotification : response : \(realResponse)")
            }

            if let postString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as String? {
                print("sendTopicPushNotification : POST: \(postString)")
            }
        }

        task.resume()
    }

我終於可以顯示帶有通知的圖片。 它可能有一個事實,即我在下面的教程是SWIFT 5做,我就迅速4.我改變了didReceive代碼,並省略extension UNNotificationAttachment代碼,它現在是正確顯示它。 下一步是根據有效負載中接收到的類別添加操作,但是我仍然必須弄清楚是否有可能在不實現Notification Content Extension的情況下實現這一點,據我了解,Notification Content Extension僅應具有一個自定義視圖來顯示通知。 任何提示將不勝感激。 我希望這會對其他人有所幫助,因為我發現的有關該主題的教程有時會造成混亂和誤導。 也非常感謝對這個問題的投票。

NotificationServiceExtension didReceive現在為:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {

        print("NotificationService: dide receive called")
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            if let urlString = bestAttemptContent.userInfo["attachment-url"] as? String,
                let data = NSData(contentsOf: URL(string:urlString)!) as Data? {
                let path = NSTemporaryDirectory() + "attachment"
                _ = FileManager.default.createFile(atPath: path, contents: data, attributes: nil)

                do {
                    let file = URL(fileURLWithPath: path)
                    let attachment = try UNNotificationAttachment(identifier: "attachment", url: file,options:[UNNotificationAttachmentOptionsTypeHintKey : "public.jpeg"])
                    bestAttemptContent.attachments = [attachment]

                } catch {
                    print(error)

                }
            }

            contentHandler(bestAttemptContent)
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM