Implementación de notificaciones de comunicación de iOS

fondo

Insertar descripción de la imagen aquí
Vi a algunos estudiantes en el grupo preguntando cómo personalizar el ícono en el lado izquierdo de las notificaciones automáticas. Desde que iOS 10 lanzó extensiones de notificación, todos saben que puede agregar recursos multimedia a las notificaciones, como imágenes, audio y video, Notification Extensionetc. Pero también sabemos que las imágenes agregadas a través de la extensión de notificación se muestran en el lado derecho, como se muestra a continuación:
Insertar descripción de la imagen aquí
Entonces, ¿cómo modificar el ícono en el lado izquierdo para lograr el efecto de SMS de Apple? Miramos hacia abajo con dudas.

plan

Notificaciones de comunicación

Al buscar en los documentos oficiales de Apple y en la WWDC 2021 , se encontró que después de iOS 15, Apple lanzó una 通讯通知función llamada. Puedes consultar la definición oficial de Apple.

Apple ha agregado la capacidad de distinguir las notificaciones de su aplicación como notificaciones de comunicación. Estas notificaciones ahora incluirán la imagen o avatar del contacto desde el que fueron enviadas y pueden integrarse con SiriKit para que Siri pueda proporcionar de forma inteligente atajos y sugerencias para acciones de comunicación basadas en contactos comunes. Por ejemplo, cuando los usuarios configuran contactos permitidos para un modo de enfoque o realizan una llamada desde su aplicación. Siri sugerirá contactos de forma inteligente en función de los datos de intención donados por su aplicación.

Apple ha agregado la capacidad de diferenciar las notificaciones de una aplicación en notificaciones de comunicación. Estas notificaciones ahora incluirán una imagen o avatar del contacto que las envió y se pueden integrar con SiriKit para que Siri pueda proporcionar de manera inteligente atajos y sugerencias para acciones de comunicación basadas en contactos utilizados con frecuencia. Por ejemplo, cuando un usuario configura los contactos permitidos para el modo de enfoque o realiza una llamada desde su aplicación. Siri sugerirá contactos de forma inteligente basándose en los datos de intención proporcionados por su aplicación.

Es decir, Apple proporciona la función de distinguir notificaciones push en notificaciones de comunicación, y las notificaciones de comunicación pueden mostrar el avatar del usuario y otro contenido.
Leyenda:
Insertar descripción de la imagen aquí
Después de leer la definición y los efectos, descubrimos que esta es exactamente la función que necesitamos, entonces, ¿cómo implementarla?

Implementación específica de Notificaciones de Comunicación

Para usar notificaciones de comunicación, las aplicaciones deberán agregar la capacidad de Notificaciones de comunicación a su aplicación en Xcode y actualizar el contenido de su notificación en la Extensión del servicio de notificaciones de la aplicación con un objeto de intención que implemente el nuevo protocolo UNNotificationContentProviding.

Para utilizar notificaciones de comunicación, la aplicación debe agregar la función de notificación de comunicación a su aplicación en Xcode e implementar el protocolo UNNotificationContentProviding en la extensión del servicio de notificación de la aplicación .

1. Primero agregue los siguientes valores clave al archivo APP Info.plist
<key>NSUserActivityTypes</key>
   <array>
   	<string>INStartCallIntent</string>
   	<string>INSendMessageIntent</string>
   </array>

Insertar descripción de la imagen aquí

2. Agregar función en Xcode-Signing & CapabilitiesCommunication Notifications

Insertar descripción de la imagen aquí

Notificaciones locales: implementar notificaciones de comunicación
1. Primero importe los siguientes archivos de encabezado
#import <Intents/Intents.h>
#import <UserNotifications/UserNotifications.h>
2. Cree información de conversación utilizando INPerson e INSendMessageIntent y agréguela al mensaje de notificación push de la APLICACIÓN.
//创建一个名字
NSPersonNameComponents *nameComponents = [[NSPersonNameComponents alloc] init];
nameComponents.nickname = message.fromUsername;// 用户名
//创建参与SiriKit交互的用户消息发送者   
INPerson *messageSender = [[INPerson alloc]initWithPersonHandle:[[INPersonHandle alloc]initWithValue:nil type:INPersonHandleTypeUnknown] nameComponents:nameComponents displayName:message.fromName image:avatarImage contactIdentifier:nil customIdentifier:message.fromUsername isMe:NO suggestionType:(INPersonSuggestionTypeNone)];
//创建发送消息请求    
INSendMessageIntent *intent = [[INSendMessageIntent alloc] initWithRecipients:@[messageSender] outgoingMessageType:(INOutgoingMessageTypeOutgoingMessageText) content:contentAttribut.string speakableGroupName:[[INSpeakableString alloc]initWithSpokenPhrase:@""] conversationIdentifier:message.msgId serviceName:nil sender:messageSender attachments:nil];
    
[intent setImage:avatarImage forParameterNamed:@"speakableGroupName"];

//创建SiriKit 交互对象    
INInteraction *interaction = [[INInteraction alloc]initWithIntent:intent response:nil];
interaction.direction = INInteractionDirectionIncoming;
[interaction donateInteractionWithCompletion:nil];

El código de implementación completo es el siguiente:

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
        content.title = message.fromName;
        content.body = contentAttribut.string;
        content.sound = [UNNotificationSound defaultSound];
        content.badge = @([UIApplication sharedApplication].applicationIconBadgeNumber + 1);
        content.userInfo = @{
    
    
            @"url":@"xxxxxxx",
        };
        if (@available(iOS 15.0, *)) {
    
    
            //实现私信消息内容展示
            if (message.fromUsername && message.fromAvatar && message.fromName && message.msgId)
            {
    
    
                //需要先将图片下载下来,我们这里使用的SDWebImageDownloader下载图片
                NSURL *imageURL = [NSURL URLWithString:message.fromAvatar];
                __block INImage *avatarImage = nil;
                
                [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
    
    
                    if (image) {
    
    
                        avatarImage = [INImage imageWithImageData:data];
                    }
                    // 消息发送方
                    NSPersonNameComponents *nameComponents = [[NSPersonNameComponents alloc] init];
                    nameComponents.nickname = message.fromUsername;// 用户名

                    INPerson *messageSender = [[INPerson alloc]initWithPersonHandle:[[INPersonHandle alloc]initWithValue:nil type:INPersonHandleTypeUnknown] nameComponents:nameComponents displayName:message.fromName image:avatarImage contactIdentifier:nil customIdentifier:message.fromUsername isMe:NO suggestionType:(INPersonSuggestionTypeNone)];

                    INSendMessageIntent *intent = [[INSendMessageIntent alloc] initWithRecipients:@[messageSender] outgoingMessageType:(INOutgoingMessageTypeOutgoingMessageText) content:contentAttribut.string speakableGroupName:[[INSpeakableString alloc]initWithSpokenPhrase:@""] conversationIdentifier:message.msgId serviceName:nil sender:messageSender attachments:nil];
                    [intent setImage:avatarImage forParameterNamed:@"speakableGroupName"];

                    INInteraction *interaction = [[INInteraction alloc]initWithIntent:intent response:nil];
                    interaction.direction = INInteractionDirectionIncoming;
                    [interaction donateInteractionWithCompletion:nil];

                    
                    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:message.msgId content:[content contentByUpdatingWithProvider:intent error:nil] trigger:nil];
                    
                    [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
    
    
                        NSLog(@"成功添加推送");
                    }];
                }];
            }else{
    
    
                UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:message.msgId content:content trigger:nil];
                [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
    
    
                    NSLog(@"成功添加推送");
                }];
            }
        }else{
    
    
            UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:message.msgId content:content trigger:nil];
            [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
    
    
                NSLog(@"成功添加推送");
            }];
        }
Notificación remota: realización de notificación de comunicación
1. Primero agregue la extensión de notificación ( Notification Service Extension)

Las notificaciones posteriores a iOS10 tienen funciones extendidas que pueden hacer algo cuando el sistema recibe notificaciones y las muestra.
Insertar descripción de la imagen aquí

2. Agregue los siguientes pares clave-valor a la extensión de notificación.
<key>NSUserActivityTypes</key>
   <array>
   	<string>INStartCallIntent</string>
   	<string>INSendMessageIntent</string>
   </array>

Insertar descripción de la imagen aquí

3. En NotificationServiceel siguiente método en la extensión de notificación, se implementa la notificación de comunicación. El método de implementación específico es similar al push local.
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    
    
}

El código central es el siguiente:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    
    
    
    self.bestAttemptContent = [request.content mutableCopy];
    
    if (@available(iOS 15.0, *)) {
    
    
        //实现消息内容展示
        // 发送者名称
        NSString *fromUsername = self.bestAttemptContent.userInfo[@"xxx"];
        // 发送者头像url地址
        NSString *fromAvatar = self.bestAttemptContent.userInfo[@"xxx"];
        // 发送者昵称
        NSString *fromNickName = self.bestAttemptContent.userInfo[@"xxx"];
        // 消息 id
        NSString *messageId = self.bestAttemptContent.userInfo[@"xxx"];
        if (fromUsername && fromAvatar && fromNickName && messageId)
        {
    
    
            //需要先下载图片
            NSURL *imageURL = [NSURL URLWithString:fromAvatar];
            __block INImage *avatarImage = nil;
            
            [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageURL completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
    
    
                if (image) {
    
    
                    avatarImage = [INImage imageWithImageData:data];
                }
                // 消息发送方
                NSPersonNameComponents *nameComponents = [[NSPersonNameComponents alloc] init];
                nameComponents.nickname = fromUsername;// 用户名
                
                INPerson *messageSender = [[INPerson alloc]initWithPersonHandle:[[INPersonHandle alloc]initWithValue:nil type:INPersonHandleTypeUnknown] nameComponents:nameComponents displayName:fromNickName image:avatarImage contactIdentifier:nil customIdentifier:fromUsername isMe:NO suggestionType:(INPersonSuggestionTypeNone)];
                
                INSendMessageIntent *intent = [[INSendMessageIntent alloc] initWithRecipients:@[messageSender] outgoingMessageType:(INOutgoingMessageTypeOutgoingMessageText) content:self.bestAttemptContent.body speakableGroupName:[[INSpeakableString alloc]initWithSpokenPhrase:@""] conversationIdentifier:messageId serviceName:nil sender:messageSender attachments:nil];
                [intent setImage:avatarImage forParameterNamed:@"speakableGroupName"];
                
                INInteraction *interaction = [[INInteraction alloc]initWithIntent:intent response:nil];
                interaction.direction = INInteractionDirectionIncoming;
                [interaction donateInteractionWithCompletion:nil];
                
                self.bestAttemptContent =  [[request.content contentByUpdatingWithProvider:intent error:nil] mutableCopy];
            }];
            
        }else{
    
    
            contentHandler(self.bestAttemptContent);
        }
    }else{
    
    
        contentHandler(self.bestAttemptContent);
    }
}
Efecto

En este punto, la función de notificación de comunicación se completa y se puede probar. El efecto después de nuestra implementación es el siguiente:
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_36162680/article/details/126973540
Recomendado
Clasificación