es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

iOS ShareContext al hacer clic en la propiedad de Intención de Sugerencia de extensionContext es nula.

Tengo una ShareExtension en mi aplicación de iOS. Estoy tratando de usar las Sugerencias. Puedo ‘donar’ con éxito el intento utilizando el siguiente código obtenido del sitio web de desarrolladores de Apple:

let groupName = INSpeakableString(spokenPhrase: "Juan Chavez")
let sendMessageIntent = INSendMessageIntent(recipients: nil,
                                            content: nil,
                                            speakableGroupName: groupName,
                                            conversationIdentifier: "sampleConversationIdentifier",
                                            serviceName: nil,
                                            sender: nil)

// Agregar el avatar del usuario al intento.
let image = INImage(named: "Juan Chavez")
sendMessageIntent.setImage(image, forParameterNamed: \.speakableGroupName)

// Donar el intento.
let interaction = INInteraction(intent: sendMessageIntent, response: nil)
interaction.donate(completion: { error in
    if error != nil {
        // Agregar la gestión de errores aquí.
    } else {
        // Hacer algo, por ejemplo, enviar el contenido a un contacto.
    }
})

Esto funciona bien y puedo ver el ícono de mi aplicación en la fila de sugerencias en la parte superior de cada conversación. Sin embargo, cuando hago clic en la sugerencia, la propiedad “intent” del “extensionContext” es nula:

override func viewDidLoad() {
    super.viewDidLoad()

    // Rellenar la propiedad del destinatario con los metadatos en caso de que el usuario haya seleccionado una sugerencia desde la hoja de compartición.
    let intent = self.extensionContext?.intent as? INSendMessageIntent
    if intent != nil { // esto es nulo a pesar de seleccionar la sugerencia
        let conversationIdentifier = intent!.conversationIdentifier
        self.recipient = recipient(identifier: conversationIdentifier!)
    }
}

Mi archivo de configuración (plist) de ShareExtension es el siguiente:

imagen del archivo de configuración

Un comportamiento extraño adicional es que puedo hacer la donación desde la aplicación principal pero no desde la extensión de la aplicación. En la aplicación principal, la única entrada relevante en el archivo de configuración es la misma entrada de NSUserActivityTypes. No las entradas de NSExtension.

Mi comprensión es que al hacer clic en la sugerencia, el “extensionContext” debería contener el intento.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Hay algunas cosas que podrían estar causando este problema:

    1. Asegúrese de que el archivo plist de ShareExtension tenga NSExtensionActivationSupportsWebPageWithMaxCount establecido en un valor distinto de cero. Esto es necesario para que la función de sugerencia funcione correctamente.
    2. Es posible que la sugerencia no haya sido donada correctamente por la aplicación. Verifique que la interacción se esté completando sin errores y que el intento esté correctamente construido y donado.

    3. Asegúrese de que la clase INSendMessageIntent esté importada tanto en la ShareExtension como en la aplicación principal.

    4. Verifique que la propiedad intent del extensionContext no sea nula antes de intentar acceder a ella en la función viewDidLoad.

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Rellene la propiedad del destinatario con los metadatos en caso de que el usuario haya seleccionado una sugerencia del panel de compartir.
        guard let intent = self.extensionContext?.intent as? INSendMessageIntent else { return }
        let conversationIdentifier = intent.conversationIdentifier
        self.recipient = recipient(identifier: conversationIdentifier!)
    }
    
    1. Si todo lo demás falla, intente limpiar el proyecto y la carpeta de compilación, luego reinstale la aplicación e inténtelo nuevamente.

    Siguiendo estos pasos, debería poder acceder correctamente a la propiedad intent del extensionContext cuando se selecciona una sugerencia.

Comments are closed.