Skip to content

Instantly share code, notes, and snippets.

@Dexwell
Last active April 2, 2024 07:44
Show Gist options
  • Save Dexwell/dedef7389eae26c5b9db927dc5588905 to your computer and use it in GitHub Desktop.
Save Dexwell/dedef7389eae26c5b9db927dc5588905 to your computer and use it in GitHub Desktop.
iOS 15 Local Communication Notification
var content = UNMutableNotificationContent()
content.title = "Title"
content.subtitle = "Subtitle"
content.body = "Text"
content.sound = nil
content.categoryIdentifier = "categoryName"
var personNameComponents = PersonNameComponents()
personNameComponents.nickname = "Sender Name"
let avatar = INImage(imageData: UIImage(named: "Avatar")!.pngData()!)
let senderPerson = INPerson(
personHandle: INPersonHandle(value: "1233211234", type: .unknown),
nameComponents: personNameComponents,
displayName: "Sender Name",
image: avatar,
contactIdentifier: nil,
customIdentifier: nil,
isMe: false,
suggestionType: .none
)
let mePerson = INPerson(
personHandle: INPersonHandle(value: "1233211234", type: .unknown),
nameComponents: nil,
displayName: nil,
image: nil,
contactIdentifier: nil,
customIdentifier: nil,
isMe: true,
suggestionType: .none
)
let intent = INSendMessageIntent(
recipients: [mePerson],
outgoingMessageType: .outgoingMessageText,
content: "Test",
speakableGroupName: INSpeakableString(spokenPhrase: "Sender Name"),
conversationIdentifier: "sampleConversationIdentifier",
serviceName: nil,
sender: senderPerson,
attachments: nil
)
intent.setImage(avatar, forParameterNamed: \.sender)
let interaction = INInteraction(intent: intent, response: nil)
interaction.direction = .incoming
interaction.donate(completion: nil)
do {
content = try content.updating(from: intent) as! UNMutableNotificationContent
} catch {
// Handle error
}
// Show 3 seconds from now
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
// Choose a random identifier
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
// Add notification request
UNUserNotificationCenter.current().add(request)
@kartikk221
Copy link

Hi, I followed your gist above and it works perfectly for local communication notifications. The problem is when I try to do the above through a Notification Service Extension to intercept and display a communication notification from my backend, the above does not work. Through debugging, I don't see any additional errors/logs that may point to a problem and documentation seems to be extremely vague for Communication Notifications. Have you been able to make Communication Notifications work through a Notification Service Extension? Thanks!

@thejeraldo
Copy link

Has anyone been able to implement multiple images for Communication Notifications like in a channel/group chat in Slack?

@lazyvar
Copy link

lazyvar commented Jul 28, 2022

@kartikk221
Make sure "mutable-content" : 1 is set in your notification payload.

@thejeraldo

Important note: An assumption I was making was that the system would create the group image for me. I thought that it would use each recipients image and make a cool looking bubble (like the one in iMessage). This is NOT true. It will simply render whatever image you give it when calling setImage. That does not mean you can't do the cool bubble thing, you just have to make it yourself.

You can do group images, but you must make the image yourself. The image being a group of images. Easiest way would be to make a custom GroupImageView: UIView and then transform that view to an image.

@thejeraldo
Copy link

@lazyvar Thanks. I thought it was a built in feature for Communication Notifications and I might've missed a configuration.
Right now I am loading the INImage with a url. And because our BE doesn't generate a thumbnail version of the user images 🙄, the images takes 1-2 seconds to show in the notification.

@phamnguyenphu
Copy link

I'm a newbie IOS
Can you help me: Where is the above code located?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment