iOS 10新的通知机制中如何添加图片

1、新建Target

2、实现UNNotificationServiceExtension

我这里用的是swift

//
//  NotificationService.swift
//  NotificationServiceExtension
//
//  Created by Heyuan Li on 17/2/26.
//  Copyright © 2017年 fenbi. All rights reserved.
//

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 {
            // Modify the notification content here...
            bestAttemptContent.title = "上课啦"

            if let imageURLString = bestAttemptContent.userInfo["image"] as? String,
                let URL = URL(string: imageURLString)
            {
                downloadAndSave(url: URL) { localURL in
                    if let localURL = localURL {
                        do {
                            let attachment = try UNNotificationAttachment(identifier: "image_downloaded", url: localURL, options: nil)
                            bestAttemptContent.attachments = [attachment]
                        } catch {
                            print(error)
                        }
                    }
                    contentHandler(bestAttemptContent)
                }
            }
        }
    }
    
    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)
        }
    }

    private func downloadAndSave(url: URL, handler: @escaping (_ localURL: URL?) -> Void) {
        let task = URLSession.shared.dataTask(with: url, completionHandler: {
            data, res, error in

            var localURL: URL? = nil

            if let data = data {
                let ext = (url.absoluteString as NSString).pathExtension
                let cacheDirs = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
                if cacheDirs.count > 0 {
                    let cacheDir = cacheDirs[cacheDirs.count - 1]
                    /// TODO tutor cache
                    /// TODO md5 extension
                        let url = cacheDir.appendingPathComponent("123").appendingPathExtension(ext)

                        if let _ = try? data.write(to: url) {
                            localURL = url
                        }

            }
            }
            
            handler(localURL)
        })
        
        task.resume()
    }

}

3、发Push的时候,加上"mutable-content": 1

{
  "aps": {
    "alert": "instant message from CRM",
    "sound": "default", 
    "mutable-content": 1
  },
......
  "image":  "https://g0.fbcontent.cn/api/tutor/images/153c6c68411747f.jpg"
}

这个很关键

最后运行,就会自动展示图片啦。

需要说明的是,默认是只能https的,如果想显示http图片,需要自行设定ATS相关配置。

2017.04.06 更新

补充一下,发现ios 10.0.2 无法收到 拓展的push,目前最新的ios 10.3正常,不知道是不是苹果的bug。

Leave a Reply

Your email address will not be published. Required fields are marked *