Acceso rápido a VPN en iOS usando App Intents / Sudo Null IT News

¡Hola! Mi nombre es Anton Dolganov, soy desarrollador de iOS en Kontur. Estoy trabajando en módulos de infraestructura y manteniendo nuestra aplicación al mismo tiempo. Contorno.Conectarque se utiliza para conectarse a la VPN interna y da acceso a los servicios corporativos.

Recientemente lanzamos una actualización de Connect, agregando soporte para Atajos. Ahora puedes activar y desactivar la VPN sin siquiera acceder a la aplicación. En este artículo explicaré cómo implementé esto y por qué es útil.

¿Qué son los comandos rápidos y por qué son necesarios?

Comandos rápidos es una función de iOS que le permite automatizar acciones rutinarias en diferentes aplicaciones. Por ejemplo, puedes crear un comando que, con un clic, mostrará el pronóstico del tiempo, obtendrá indicaciones para llegar a la playa más cercana e iniciará tu lista de reproducción favorita. Puede configurar estos comandos para que se ejecuten automáticamente según la hora del día, la ubicación u otras condiciones.

Los comandos se pueden ejecutar no sólo a través de la aplicación Comandos, sino también desde la pantalla de inicio, los widgets, Siri o incluso en el Apple Watch. Y esto no sólo es cómodo: puedes compartir tus comandos con otros usuarios, haciéndoles la vida más fácil. Por ejemplo, en este artículo Se describen 35 comandos para trabajar en el iPhone: desde configurar convenientemente alarmas a intervalos de 5 minutos hasta buscar rápidamente un enlace a una canción en otra plataforma de transmisión.

El principal beneficio de los comandos rápidos es el ahorro de tiempo y la comodidad. En el caso de nuestra aplicación, ahora los usuarios no necesitan ingresar a la aplicación cada vez y presionar varios botones para conectarse a la VPN. Puedes hacer esto literalmente con un comando o incluso configurar una conexión automática. Esta solución es especialmente útil para quienes utilizan VPN con frecuencia y desean automatizar el proceso.

Para agregar soporte para comandos rápidos a nuestro Connect, recurrimos a un nuevo marco Intenciones de la aplicación.

¿Qué son las intenciones de la aplicación?

App Intents es un marco introducido en iOS 16 que permite a los desarrolladores crear comandos para sus aplicaciones a través de Siri, Spotlight y la aplicación Commands. Reemplaza el SiriKit Intents heredado y ofrece una alternativa más simple y poderosa.

Estas son las principales ventajas de App Intents:

  1. Fácil integración. La implementación del comando requiere una configuración mínima.

  2. Mayor productividad. Estructura de marco simplificada y soporte para tareas asincrónicas.

  3. Flexibilidad de la interfaz de usuario. Posibilidad de personalizar los diálogos y la interacción del usuario.

  4. Integración de focos. Los comandos pueden aparecer en los resultados de búsqueda de Spotlight, haciéndolos más accesibles para el usuario.

Ejemplo de implementación de un comando para administrar VPN

Ahora veamos el proceso paso a paso de cómo se creó el equipo de administración de VPN. Como primer paso, creemos un comando simple que, como de costumbre, mostrará un cuadro de diálogo con el texto “¡Hola, mundo!” Esto nos permitirá comprender los principios básicos de App Intents.

Paso 1: crea un comando simple

En primer lugar, creamos una estructura que hereda de AppIntent. Para nuestro comando, basta con especificar el título e implementar el método. perform()que mostrará el mensaje “¡Hola, mundo!” en forma de cuadro de diálogo.

Código de muestra:

import AppIntents

struct VPNIntent: AppIntent {
  static let title: LocalizedStringResource = "Hello, world!"

  func perform() async throws -> some ProvidesDialog {
    return .result(dialog: .init("Hello, world!"))
  }
}

Si su proyecto admite versiones de iOS inferiores a 16, deberá agregar la anotación @available, ya que esta funcionalidad solo se ejecutará en iOS 16 y superior.

@available(iOS 16, *)
struct VPNIntent: AppIntent {
// Остальной код команды
}

Debe compilar el proyecto para que este intent esté disponible en la aplicación Teams.

Paso 2: configurar un equipo en la aplicación Teams

Ahora veamos cómo encontrar y ejecutar el comando creado:

  1. Abra la aplicación “Teams” en el dispositivo.

  1. Haga clic en el botón “+” en la esquina superior derecha para crear un nuevo equipo.

  1. Nos desplazamos por la cortina con diversas acciones y encontramos nuestra aplicación.

  1. Seleccione el equipo que creamos anteriormente.

  1. Confirmamos la creación del equipo. Aparecerá automáticamente en la aplicación Teams.

  1. El comando ya está listo para usarse.

  1. Para iniciarlo, simplemente haga clic en la placa creada y verá el resultado: un diálogo con el texto “¡Hola, mundo!”.

Veremos otras formas de ejecutar un comando un poco más adelante.

Paso 3. Agregue la capacidad de activar y desactivar VPN

No entraremos en detalles sobre la implementación de habilitar y deshabilitar VPN, pero nos centraremos en el comando actual. en método perform() Llamemos a una función que gestionará el estado de la VPN.

A primera vista, podrías crear dos comandos separados: uno para habilitar la VPN y otro para deshabilitarla. Sin embargo, este enfoque es inconveniente: el desarrollador tendrá que duplicar la lógica y los usuarios tendrán que cambiar entre dos comandos, lo que reduce la usabilidad.

La mejor solución es crear un comando que habilite y deshabilite la VPN según su estado actual.

El principio de funcionamiento será el siguiente: cuando ejecutas el comando por primera vez, se conecta a la VPN, y cuando lo ejecutas nuevamente, se desconecta. De esta manera, el comando se adapta automáticamente al estado actual de la VPN.

Para hacer esto, cambie el método de ejecución:

func perform() async throws -> some ProvidesDialog {
    VPNManager.toggleVpnConnection()
    return .result(dialog: .init("Команда выполнена"))
}

Ahora, cuando ejecuta un comando, la VPN se activará o desactivará y el usuario también verá un cuadro de diálogo con el mensaje “Comando completado”.

Sin embargo, aquí hay una advertencia: el proceso de conexión a una VPN puede llevar algún tiempo y, en la implementación actual, se abre un cuadro de diálogo con el resultado sin esperar a que se complete el proceso. Como resultado, aparecerá el cuadro de diálogo “Comando completado” antes de que se complete la VPN.

Esto es fácil de solucionar con programación asincrónica usando async/await, que es compatible con el método de ejecución:

func perform() async throws -> some ProvidesDialog {
    await VPNManager.toggleVpnConnection()
    return .result(dialog: .init("Команда выполнена"))
}

Para que esto funcione correctamente, debes cambiar el método. toggleVpnConnection()agregando soporte para async/await.

El cuadro de diálogo “Comando completado” ahora solo aparecerá después de que se complete la conexión o se desconecte la VPN, lo que brindará comentarios más precisos al usuario.

Paso 4. Agregar una pantalla de estado del equipo

Por el momento, el comando muestra el resultado en forma de un cuadro de diálogo con el texto “Comando completado”, pero esta solución no es lo suficientemente informativa. Sería mejor mostrar información diferente dependiendo de si la VPN está habilitada o deshabilitada. También es útil proporcionar un mensaje de error, por ejemplo, si no hay conexión a Internet.

El marco AppIntents le permite crear vistas personalizadas para una visualización más flexible de los resultados de los comandos. Aprovechemos esta oportunidad.

Primero, preparemos una enumeración que describa los posibles estados de VPN: activo, inactivo y estado de error. También configuraremos el mensaje, icono y color correspondiente a cada estado.

import SwiftUI

enum VPNIntentState {
  case inactive
  case active
  case error(VPNConfigurationError)
  var message: String {
    switch self {
    case .inactive:
      "Не подключено"
    case .active:
       "Подключено"
    case .error(let error):
      error.message
    }
  }
  var icon: String {
    switch self {
    case .inactive:
      "xmark.shield"
    case .active:
      "checkmark.shield"
    case .error:
      "exclamationmark.triangle"
    }
  }
  var color: Color {
    switch self {
    case .inactive:
      .gray
    case .active:
      .green
    case .error:
      .red
    }
  }
}

Ahora creemos una Vista personalizada usando SwiftUI para mostrar el estado de la VPN:

import SwiftUI

struct VPNStatusView: View {
  let state: VPNIntentState

  var body: some View {
    VStack(spacing: 16) {
      Image(systemName: state.icon)
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 68, height: 68)
        .foregroundColor(state.color)
      Text(state.message)
        .foregroundColor(.primary)
        .multilineTextAlignment(.center)
    }
    .padding()
  }
}

Sólo queda perfeccionar el método. perform()para que regrese ShowsSnippetView. Cambiemos también el método. toggleVpnConnectionque ahora devolverá el estado actual de VPN:

func perform() async throws -> some ShowsSnippetView {
    let result = await VPNManager.toggleVpnConnection()
    return .result(view: VPNStatusView(state: result))
}

Como resultado, después de ejecutar el comando, se mostrará en la pantalla información más detallada sobre el estado actual de la VPN.

VPN conectada correctamente

VPN deshabilitada exitosamente

Error de conexión VPN

Los mensajes sobre conexión, desconexión o error aumentarán significativamente el contenido de la información y la usabilidad del comando.

Paso 5: restringir el acceso al comando para los usuarios

Nuestra tarea es asegurarnos de que solo los usuarios autorizados de la aplicación puedan utilizar el comando. Desafortunadamente, actualmente no existe ningún mecanismo integrado para ocultar o mostrar un comando según diversas condiciones. Por lo tanto, la verificación deberá implementarse dentro del propio comando y se mostrará un mensaje de error.

Agregaremos una condición que verifique si el usuario actual es elegible para usar la VPN. Si se deniega el acceso, el comando devolverá un estado de error.

Implementación de ejemplo:

func perform() async throws -> some ShowsSnippetView {
    guard VPNManager.isVPNAllowed
    else {
      return .result(
        view: VPNStatusView(
          state: VPNIntentState.error(.configurationIsNotAvailable)
        )
      )
    }
    let result = await appDelegate.toggleVpnConnection()
    return .result(view: VPNStatusView(state: result))
}

Si al usuario no se le permite usar VPN, el comando devolverá un mensaje de error. De lo contrario, la VPN se conectará o desconectará.

Paso 6. Mejorar la descripción del comando

En la etapa final, prepararemos una descripción del comando para los usuarios. Esta descripción se mostrará en la interfaz de la aplicación.

Prepararemos el título y descripción de nuestro equipo. Estas cadenas se pueden colocar en el archivo Localizable.strings para una localización conveniente de la aplicación.

"vpn_intent_title" = "Коннект VPN";
"vpn_intent_description" = "Команда предназначена для удобного включения и выключения VPN на вашем устройстве.";

Ahora actualicemos la descripción del comando en el código:

struct VPNIntent: AppIntent {
  static let title: LocalizedStringResource = "vpn_intent_title"
  static var description: IntentDescription? { "vpn_intent_description" }
  // Остальной код команды
}

De esta manera, el comando tendrá una descripción clara e informativa que los usuarios verán al configurar y utilizar el comando. Esto ayudará a que la interfaz sea más comprensible y cómoda.

Formas de ejecutar un comando

Además, debajo de catas hay instrucciones ocultas para ejecutar el comando de varias maneras. Los escribimos para presentar una nueva característica a nuestros usuarios. Si tiene otros escenarios de automatización interesantes, compártalos en los comentarios.

Centro de control

iOS 18 trae una actualización importante al Centro de control. Con las nuevas funciones, los usuarios ahora pueden agregar nuevos controles, incluido un comando de control de VPN.

Para hacer esto:

  1. Vaya al modo de edición y haga clic en “Agregar control”.

  1. Busque un acceso directo en la lista.

  1. Seleccione el equipo que creamos anteriormente.

  1. Listo. Ahora puede ejecutar el comando directamente desde el Panel de control.

Logotipo en el escritorio

Después de crear un comando, también puedes agregarlo a la pantalla de inicio de tu dispositivo para acceder rápidamente.

Para hacer esto:

1. Haga clic en los tres puntos en la esquina del comando.

2. Luego expanda el menú y seleccione “Ir a la pantalla de inicio”.

3. Si lo deseas, puedes personalizar el logo como quieras: puedes seleccionar un ícono, establecer el color de fondo y el nombre del equipo. Luego haga clic en “Agregar”.

4. Ahora puedes activar o desactivar VPN con solo un clic directamente desde tu escritorio.

Widget en la pantalla de bloqueo

A veces puede resultar difícil navegar por el escritorio debido a la multitud de aplicaciones. Para facilitar este proceso, puede colocar un comando en la pantalla de bloqueo mediante widgets.

Para hacer esto:

1. Vaya al modo de edición de pantalla de bloqueo manteniéndolo presionado. Haga clic en “Personalizar”.

2. Seleccione Agregar widgets y busque la aplicación Teams.

3. Seleccione el comando VPN Connect que creó anteriormente.

4. Haga clic en “Listo” para guardar los cambios. Ahora puedes ejecutar el comando en la pantalla de bloqueo.

Botón de acción

Si eres el orgulloso propietario de un iPhone 15 Pro, 15 Pro Max u otro modelo actual, tienes la oportunidad de asignar un comando al botón de acción.

Para hacer esto:

1. Vaya a Configuración en su dispositivo y seleccione Botón de acción.

2. Seleccione la opción Acceso directo y asigne una acción para administrar la VPN.

Ahora, cuando presionas el “Botón de Acción”, puedes controlar la VPN desde cualquier pantalla.

reloj de manzana

Los usuarios de Apple Watch también tienen la opción de controlar la VPN desde su muñeca.

Para hacer esto:

1. Vaya a la configuración del equipo y haga clic en el signo ⓘ.

2. Active Pantalla en Apple Watch y toque Listo.

3. Para que el comando aparezca en su Apple Watch, debe asegurarse de tener las aplicaciones Teams y Watch sincronizadas en iCloud.

4. Ahora puedes encontrar la aplicación Teams en tu Apple Watch.

5. Y administre VPN directamente desde el reloj.

Automatización

La automatización le permite configurar la VPN para que se encienda automáticamente, por ejemplo, durante el horario comercial o cuando abre un navegador. Veamos cómo automatizar el proceso para que la VPN se encienda cuando inicias el navegador y se apague cuando lo cierras.

Para hacer esto, siga estos pasos:

1. Abra la aplicación Teams y vaya a la pestaña Automatización.

2. Haga clic en Nueva automatización.

3. Seleccione “Aplicación” de la lista.

4. Especifique la aplicación deseada, por ejemplo, su navegador principal. A continuación, configure las opciones de automatización: marque “abrir” para iniciar la VPN cuando abra la aplicación y “cerrar” para desactivarla cuando la cierre. Y para una acción instantánea, marque la casilla junto a “Ejecutar inmediatamente” y luego haga clic en “Siguiente”.

5. Seleccione un comando que se ejecutará según las condiciones especificadas.

6. ¡Listo! Ahora el proceso de activar y desactivar VPN está automatizado.

Al final

La función de atajos de iOS abre un montón de posibilidades de automatización. Y con la ayuda de App Intents, hicimos que el proceso de conexión a una VPN en Kontur.Connect fuera más rápido y sencillo. Este es un pequeño pero importante detalle que puede mejorar significativamente la experiencia del usuario.

Entonces, si eres desarrollador de aplicaciones y aún no has usado App Intents, ¡pruébalo! Aquí hay una lista de recursos que me ayudaron mucho al agregar nuevas funciones a la aplicación:

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *