带媒体附件的iOS丰富推送通知

与旧操作系统版本相比,iOS 10为我们带来了具有新功能的推送通知。 改进包括在通知中立即查看照片,视频或Gif。

通过使用新的Notification Service Extension ,可以将这些媒体附件作为通知的一部分。 您还可以使用新的Notification Content Extension来在通知的媒体附件视图中拥有更丰富的View Controller级别的内容。 我们将在下面浏览一些代码。

确保您具有:

  • Xcode 8.0+
  • OS X El Capitan 10.11
  • UserNotifications.framework导入到您的项目中。

苹果推送通知服务将您的应用程序的远程通知发送到每个用户的设备。 将向APNS服务器发送通知和设备令牌。 依次,他们处理该通知到正确的用户设备的路由。 届时,iOS将接管并确保将通知发送到您的应用程序。 推送通知的最大有效负载大小为4KB,它们支持开发和生产环境。

为了使您可以执行Notification Extension代码,必须对推送通知有效负载进行一些修改(例如,与iOS 9相比)。

{ 
"aps": {
"alert": {
"body": "Push notification body",
"title": "Push notification title"
},
"mutable-content": 1,
category: "rich-apns"
},
"media-url": "
https://i.imgur.com/t4WGJQx.jpg "
}
"
}

media-url密钥包含将在代码中使用的媒体附件的URL。 有效负载还通过包含值1可变内容来告诉iOS哪些通知将导致您的Notification Extension运行。 执行代码的时间是有限的,据我所知,这是几秒钟,这是下载图像的足够时间。

您可以使用自己的后端发送上述有效负载,也可以使用可以在GitHub上找到的名为Pusher的工具。 这是一个Mac应用程序,用于将推送通知直接发送到Apple推送通知服务。 您只需要SSL证书和设备令牌即可直接从Mac开始推送。

**更新**:现在,您可以使用我编写的这个简单的命令行工具轻松地在设备上测试推送通知。 更多信息在这里。

创建一个新目标并将其添加到您的项目中。

简而言之,要在推送通知中显示图片,您必须

  • 下载图片
  • 保存图像
  • 将映像的磁盘路径添加到UNNotificationAttachment

在您的应用中设置推送通知

在到达那里之前,我们首先需要做几件事。 最初,我们必须注册才能在我们的应用程序中接收推送通知。

  let center = UNUserNotificationCenter.current()center.requestAuthorization(options:[.alert,.sound]){(授予,错误)在 
/ *我们是否被授权? * /
}
application.registerForRemoteNotifications()

接下来,我们必须获取设备令牌。

  func application(_ application:UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data){ 
let deviceTokenString = deviceToken.reduce(“”,{$ 0 + String(format:“%02X”,$ 1)})
打印(deviceTokenString)
/ *将设备令牌发送到您的服务器* /
}

发生错误时。

  func应用程序(_应用程序:_UIApplication,didFailToRegisterForRemoteNotificationsWithError错误:错误){打印(“模拟器中我不可用\(错误)”) 
}

并且,如果您想知道已授予了哪些权限,则可以:

  UNUserNotificationCenter.current()。getNotificationSettings(){(设置)在 
开关setttings.soundSetting {
启用大小写:
打印(“启用的声音设置”)

禁用的情况:
打印(“设置已被禁用”)

case .notSupported:
打印(“重要的地方出了问题”)
}
}

以上所有内容都可以在您的应用程序委托中。

在您的通知扩展程序中

在以下代码中,我们将找到key media-url的值。 如果存在,我们将从URL上下载图像,该URL是密钥的值。

URLSession使用FileManager将媒体下载到临时存储中。

另外,这里还执行一些可达性(ReachabilitySwift pod)工作。 如果设备使用wifi,则会下载图像。 如果是在手机上,那不是。 只是把它扔在那里,以防您发送带有大图像的通知的频率很高😀

在您的通知扩展程序中

  • Notification Content Extension使用NotificationViewController,它是UIViewController的子类。
  • 创建内容扩展时,Xcode创建了NotificationViewController.swift文件,MainInterface.storyboard和plist文件。
  • UNNotificationExtensionCategory键值与之前在上述有效负载中设置的类别值相同。 这告诉iOS,您触发的推送通知是通过Content Extension处理的。
  • 在MainInterface.storyboard中,创建将显示推送通知的UI,就像常规的UIViewController一样。
  • 在NotificationViewController.swift中,声明所有IBOutlet并将它们连接到Storyboard文件。