Compartir a través de


Distribución de App Center: actualizaciones desde la aplicación de iOS

Importante

Visual Studio App Center está programado para retirarse el 31 de marzo de 2025. Aunque puede seguir usando Visual Studio App Center hasta que se retire por completo, hay varias alternativas recomendadas a las que puede considerar la posibilidad de migrar.

Obtenga más información sobre las escalas de tiempo y las alternativas de soporte técnico.

App Center Distribute permitirá a los usuarios instalar una nueva versión de la aplicación al distribuirla a través de App Center. Con una nueva versión de la aplicación disponible, el SDK presentará un cuadro de diálogo de actualización a los usuarios para descargar o posponer la nueva versión. Una vez que decidan actualizar, el SDK comenzará a actualizar la aplicación.

Nota

Hay algunas cosas que se deben tener en cuenta al usar actualizaciones desde la aplicación:

  1. Si has publicado la aplicación en el App Store, se deshabilitarán las actualizaciones desde la aplicación.
  2. Si ejecuta pruebas automatizadas de IU, las actualizaciones habilitadas en la aplicación bloquearán las pruebas automatizadas de IU, ya que intentarán autenticarse en el back-end de App Center. Se recomienda no habilitar App Center Distribute para el destino de prueba de IU.

Nota

En la 4.0.0 versión de App Center se introdujeron cambios importantes. Siga la sección Migrar a App Center SDK 4.0.0 y versiones posteriores para migrar App Center desde versiones anteriores.

Importante

El SDK de App Center no admite varias aplicaciones de ventana que se introdujeron en iOS 13.

Agregar actualizaciones de la aplicación a la aplicación

Siga la sección Introducción si no ha configurado el SDK en la aplicación.

1. Agregar el módulo Distribuir de App Center

El SDK de App Center está diseñado con un enfoque modular: solo tiene que integrar los módulos de los servicios que le interesan.

Integración a través de Cocoapods

Si va a integrar App Center en la aplicación a través de Cocoapods, agregue la siguiente dependencia al podfile y ejecute pod install.

pod 'AppCenter/Distribute'

Integración a través de Carthage

  1. Agregue la siguiente dependencia a Cartfile para incluir App Center Distribute.

    # Use the following line to get the latest version of App Center
    github "microsoft/appcenter-sdk-apple"
    
    # Use the following line to get the specific version of App Center
    github "microsoft/appcenter-sdk-apple" ~> X.X.X
    
  2. Ejecute carthage update.

  3. Abra la pestaña Configuración general del destino de la aplicación. Arrastre y coloque el archivo AppCenterDistribute.framework desde la carpeta Carthage/Build/iOS hasta la sección Linked Frameworks and Libraries (Marcos vinculados y bibliotecas ) de XCode.

  4. Arrastre y coloque AppCenterDistributeResources.bundle desde AppCenterDistribute.framework en project Navigator de XCode.

  5. Aparecerá un cuadro de diálogo y asegúrese de que el destino de la aplicación esté activado. Haga clic en Finalizar.

Integración a través del Administrador de paquetes swift

  1. En el menú Xcode, haga clic en File Swift Packages > Add Package Dependency (Agregar dependencia de paquetes swift de archivo>).
  2. En el cuadro de diálogo que aparece, escriba la dirección URL del repositorio: https://github.com/microsoft/appcenter-sdk-apple.git.
  3. En Versión, seleccione Hasta siguiente principal y tome la opción predeterminada.
  4. Elija AppCenterDistribute en la columna Package Product (Paquete de producto ).

Integración mediante la copia de los binarios en su proyecto

Si no desea usar Cocoapods, puede integrar los módulos copiando los archivos binarios en el proyecto. Siga estos pasos:

Nota

El SDK de App Center admite el uso de XCframework. Si desea integrar XCframeworks en el proyecto, descargue la AppCenter-SDK-Apple-XCFramework.zip de la página de versiones y descomprimala . El contenido de la carpeta resultante no es específico de la plataforma, sino que contiene XCframeworks para cada módulo. Se pueden integrar de la misma manera que los marcos habituales, como se describe a continuación.

  1. Descargue los marcos del SDK de App Center proporcionados como un archivo ZIP.

  2. Descomprima el archivo y verá una carpeta denominada AppCenter-SDK-Apple/iOS que contiene marcos diferentes para cada servicio de App Center. El marco llamado AppCenter es necesario en el proyecto, ya que contiene código que se comparte entre los distintos módulos.

  3. [Opcional] Cree un subdirectorio para bibliotecas de terceros.

    • Como procedimiento recomendado, las bibliotecas de terceros suelen estar dentro de un subdirectorio, a menudo denominada Proveedor. Si el proyecto no está organizado con un subdirectorio para bibliotecas, cree un subdirectorio Vendor ahora.
    • Cree un grupo denominado Vendor dentro del proyecto de Xcode para imitar la estructura de archivos en el disco.
  4. Abra Finder y copie la carpeta AppCenter-SDK-Apple/iOS descomprimida en la carpeta del proyecto en la ubicación donde quiera.

  5. Agregue el marco del SDK al proyecto en Xcode:

    • Asegúrese de que project Navigator esté visible (⌘+1).
    • Ahora, arrastre y coloque AppCenter.framework, AppCenterDistribute.framework y AppCenterDistributeResources.bundle desde el Finder (los que están dentro de la carpeta Vendor ) en project Navigator de Xcode. Se requiere AppCenter.framework para iniciar el SDK. Asegúrese de que se agrega al proyecto; de lo contrario, los demás módulos no funcionarán y el proyecto no se compilará correctamente.
    • Aparecerá un cuadro de diálogo y asegúrese de que el destino de la aplicación esté activado. Haga clic en Finalizar.

2. Iniciar la distribución de App Center

App Center solo usa los módulos específicos que se invocan en la aplicación. Debe llamar explícitamente a cada uno de ellos al iniciar el SDK.

2.1 Adición de la importación para App Center Distribute

Abra el archivo AppDelegate.m del proyecto en el archivo Objective-C o AppDelegate.swift en Swift y agregue las siguientes instrucciones de importación:

@import AppCenter;
@import AppCenterDistribute;
import AppCenter
import AppCenterDistribute

2.2 Agregar el start:withServices: método

Agregue Distribute al start:withServices: método para iniciar el servicio App Center Distribute.

Inserte la línea siguiente para iniciar el SDK en la clase AppDelegate.m del proyecto para la clase Objective-C o AppDelegate.swift para Swift en el didFinishLaunchingWithOptions método .

[MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACDistribute class]]];
AppCenter.start(withAppSecret: "{Your App Secret}", services: [Distribute.self])

Asegúrese de que ha reemplazado {Your App Secret} en el ejemplo de código anterior por el secreto de aplicación. Consulte también la sección Introducción si no ha configurado el SDK en la aplicación.

2.3 Modificar info.plist del proyecto

  1. En el archivo Info.plist del proyecto, agregue una nueva clave para URL types haciendo clic en el botón '+' situado junto a "Lista de propiedades de información" en la parte superior. Si Xcode muestra info.plist como código fuente, consulte la sugerencia siguiente.
  2. Cambie el tipo de clave a Matriz.
  3. Agregue una nueva entrada a la matriz (Item 0) y cambie el tipo a Dictionary.
  4. En Item 0, agregue una URL Schemes clave y cambie el tipo a Matriz.
  5. En la URL Schemes clave, agregue una nueva entrada (Item 0).
  6. En URL Schemes>Item 0, cambie el valor a appcenter-{APP_SECRET} y reemplace por {APP_SECRET} el secreto de aplicación de la aplicación.

Sugerencia

Si desea comprobar que ha modificado Info.plist correctamente, ábralo como código fuente. Debe contener la siguiente entrada con el secreto de aplicación en lugar de {APP_SECRET}:

<key>CFBundleURLTypes</key>
<array>
  <dict>
  	<key>CFBundleURLSchemes</key>
  	<array>
  		<string>appcenter-{APP_SECRET}</string>
  	</array>
  </dict>
</array>

Uso del grupo de distribución privado

De forma predeterminada, Distribute usa un grupo de distribución público. Si desea usar un grupo de distribución privado, deberá establecerlo explícitamente a través updateTrack de la propiedad .

MSACDistribute.updateTrack = MSACUpdateTrackPrivate;
Distribute.updateTrack = .private

Nota

El valor predeterminado es UpdateTrack.public. Esta propiedad solo se puede actualizar antes de la llamada al AppCenter.start método . Los cambios en la pista de actualización no se conservan cuando se reinicia el proceso de aplicación, por lo que si la propiedad no siempre se actualiza antes de la AppCenter.start llamada, será pública de forma predeterminada.

Después de esta llamada, se abrirá una ventana del explorador para autenticar al usuario. Todas las comprobaciones de actualización posteriores obtendrán la versión más reciente en la pista privada.

Si un usuario está en la pista privada, significa que después de la autenticación correcta, obtendrá la versión más reciente de cualquier grupo de distribución privado del que sea miembro. Si un usuario está en la pista pública, significa que obtendrá la versión más reciente de cualquier grupo de distribución público.

Deshabilitar la comprobación automática de la actualización

De forma predeterminada, el SDK comprueba automáticamente si hay nuevas versiones:

  • Cuando se inicia la aplicación.
  • Cuando la aplicación entra en segundo plano, vuelva a estar en primer plano.
  • Al habilitar el módulo Distribute si se ha deshabilitado anteriormente.

Si desea buscar nuevas versiones manualmente, puede deshabilitar la comprobación automática de la actualización. Para ello, llame al método siguiente antes de que se inicie el SDK:

[MSACDistribute disableAutomaticCheckForUpdate];
Distribute.disableAutomaticCheckForUpdate()

Nota

Se debe llamar a este método antes de la llamada al AppCenter.start método .

A continuación, puede usar la checkForUpdate API que se describe en la sección siguiente.

Comprobar manualmente la actualización

[MSACDistribute checkForUpdate];
Distribute.checkForUpdate()

Esto envía una solicitud a App Center y muestra un cuadro de diálogo de actualización en caso de que haya una nueva versión disponible.

Nota

Una comprobación manual de la llamada de actualización funciona incluso cuando se habilitan las actualizaciones automáticas. Se omite una comprobación manual de la actualización si ya se está realizando otra comprobación. La comprobación manual de la actualización no se procesará si el usuario ha pospuesto actualizaciones (a menos que la versión más reciente sea una actualización obligatoria).

Personalización o localización del cuadro de diálogo de actualización en la aplicación

1. Personalizar o localizar texto

Puede proporcionar fácilmente sus propias cadenas de recursos si desea localizar el texto que se muestra en el cuadro de diálogo de actualización. Examine este archivo de cadenas. Use el mismo nombre o clave de cadena y especifique el valor localizado que se reflejará en el cuadro de diálogo en sus propios archivos de cadenas de aplicación.

2. Personalizar el cuadro de diálogo de actualización

Puede personalizar la apariencia del cuadro de diálogo de actualización predeterminado mediante la implementación del DistributeDelegate protocolo. Debe registrar el delegado antes de iniciar el SDK, como se muestra en el ejemplo siguiente:

[MSACDistribute setDelegate:self];
Distribute.delegate = self;

Este es un ejemplo de la implementación del delegado que reemplaza el cuadro de diálogo del SDK por uno personalizado:

- (BOOL)distribute:(MSACDistribute *)distribute releaseAvailableWithDetails:(MSACReleaseDetails *)details {

  // Your code to present your UI to the user, e.g. an UIAlertController.
  UIAlertController *alertController = [UIAlertController
      alertControllerWithTitle:@"Update available."
                       message:@"Do you want to update?"
                preferredStyle:UIAlertControllerStyleAlert];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Update"
                                         style:UIAlertActionStyleCancel
                                       handler:^(UIAlertAction *action) {
                                         [MSACDistribute notifyUpdateAction:MSACUpdateActionUpdate];
                                       }]];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Postpone"
                                         style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction *action) {
                                         [MSACDistribute notifyUpdateAction:MSACUpdateActionPostpone];
                                       }]];

  // Show the alert controller.
  [self.window.rootViewController presentViewController:alertController animated:YES completion:nil];
  return YES;
}
func distribute(_ distribute: Distribute, releaseAvailableWith details: ReleaseDetails) -> Bool {

  // Your code to present your UI to the user, e.g. an UIAlertController.
  let alertController = UIAlertController(title: "Update available.",
                                        message: "Do you want to update?",
                                 preferredStyle:.alert)

  alertController.addAction(UIAlertAction(title: "Update", style: .cancel) {_ in
    Distribute.notify(.update)
  })

  alertController.addAction(UIAlertAction(title: "Postpone", style: .default) {_ in
    Distribute.notify(.postpone)
  })

  // Show the alert controller.
  self.window?.rootViewController?.present(alertController, animated: true)
  return true;
}

En caso de que se devuelva YES/true en el método anterior, la aplicación debe obtener la elección del usuario y enviar un mensaje al SDK con el resultado mediante la SIGUIENTE API.

// Depending on the user's choice, call notifyUpdateAction: with the right value.
[MSACDistribute notifyUpdateAction:MSACUpdateActionUpdate];
[MSACDistribute notifyUpdateAction:MSACUpdateActionPostpone];
// Depending on the user's choice, call notify() with the right value.
Distribute.notify(.update);
Distribute.notify(.postpone);

Si no llamas al método anterior, el releaseAvailableWithDetails:método -method se repetirá siempre que la aplicación entre en primer plano.

3. Ejecutar código si no se encuentra ninguna actualización

En los casos en los que el SDK comprueba si hay actualizaciones y no encuentra ninguna actualización disponible más reciente que la usada actualmente, se invoca una distributeNoReleaseAvailable: devolución de llamada de MSACDistributeDelegate delegado. Esto le permite ejecutar código personalizado en estos escenarios.

Estos son ejemplos que muestran cómo mostrar la interfaz de usuario de alerta cuando no se encuentran actualizaciones:

- (void)distributeNoReleaseAvailable:(MSACDistribute *)distribute {
  UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
                                                                 message:NSLocalizedString(@"No updates available", nil)
                                                          preferredStyle:UIAlertControllerStyleAlert];
  [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:nil]];
  [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
}
  func distributeNoReleaseAvailable(_ distribute: Distribute) {
    let alert = UIAlertController(title: nil, message: "No updates available", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    self.window?.rootViewController?.present(alert, animated: true)
  }

Habilitación o deshabilitación de App Center Distribute en tiempo de ejecución

Puede habilitar y deshabilitar App Center Distribute en tiempo de ejecución. Si la deshabilita, el SDK no proporcionará ninguna funcionalidad de actualización desde la aplicación, pero todavía puede usar El servicio Distribute en el portal de App Center.

[MSACDistribute setEnabled:NO];
Distribute.enabled = false

Para habilitar App Center Distribute de nuevo, use la misma API, pero pase YES/true como parámetro.

[MSACDistribute setEnabled:YES];
Distribute.enabled = true

El estado se conserva en el almacenamiento del dispositivo en los inicios de la aplicación.

Nota

Este método solo se debe usar después Distribute de haberse iniciado.

Comprobación de si App Center Distribute está habilitado

También puede comprobar si App Center Distribute está habilitado o no:

BOOL enabled = [MSACDistribute isEnabled];
var enabled = Distribute.enabled

Nota

Este método solo se debe usar después Distribute de que se haya iniciado, siempre devolverá false antes del inicio.

No inicialice App Center Distribute durante el desarrollo

Si está en modo privado, App Center Distribute abrirá su interfaz de usuario o explorador al iniciar la aplicación. Aunque se trata de un comportamiento esperado para los usuarios finales, podría ser perjudicial durante la fase de desarrollo de la aplicación. No se recomienda inicializar Distribute la DEBUG configuración.

#if DEBUG
    [MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACAnalytics class], [MSACCrashes class]]];
#else
    [MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACAnalytics class], [MSACCrashes class], [MSACDistribute class]]];
#endif
#if DEBUG
    AppCenter.start(withAppSecret: "{Your App Secret}", services: [Analytics.self, Crashes.self])
#else
    AppCenter.start(withAppSecret: "{Your App Secret}", services: [Analytics.self, Crashes.self, Distribute.self])
#endif

Realice la limpieza justo antes de que se cierre la aplicación para la actualización.

Implemente el DistributeDelegate protocolo y registre el delegado como se muestra en el ejemplo siguiente:

[MSACDistribute setDelegate:self];
Distribute.delegate = self;

Se distributeWillExitApp: llamará al método delegado justo antes de que finalice la aplicación para la instalación de la actualización:

- (void)distributeWillExitApp:(MSACDistribute *)distribute {
  // Perform the required clean up here.
}
func distributeWillExitApp(_ distribute: Distribute) {
  // Perform the required clean up here.
}

¿Cómo funcionan las actualizaciones desde la aplicación?

Nota

Para que las actualizaciones desde la aplicación funcionen, se debe descargar una compilación de aplicación desde el vínculo. No funcionará si se instala desde un IDE o manualmente.

La característica de actualizaciones desde la aplicación funciona de la siguiente manera:

  1. Esta característica SOLO funcionará con compilaciones que se distribuyen mediante el servicio App Center Distribute . No funcionará cuando se adjunte el depurador o si la característica de acceso guiado de iOS está activada.

  2. Una vez que integre el SDK, compile una versión de lanzamiento de la aplicación y cárguelo en App Center, se notificará a los usuarios de ese grupo de distribución para la nueva versión a través de un correo electrónico.

  3. Cuando cada usuario abra el vínculo en su correo electrónico, la aplicación se instalará en su dispositivo. Es importante que usen el vínculo de correo electrónico para instalar la aplicación: App Center Distribute no admite actualizaciones desde la aplicación para las aplicaciones que se han instalado desde otros orígenes (por ejemplo, descargar la aplicación desde un archivo adjunto de correo electrónico). Cuando se descarga una aplicación desde el vínculo, el SDK guarda información importante de las cookies para buscar actualizaciones más adelante; de lo contrario, el SDK no tiene esa información clave.

  4. Si la aplicación establece la pista en privada, se abrirá un explorador para autenticar al usuario y habilitar las actualizaciones desde la aplicación. El explorador no se volverá a abrir siempre y cuando la información de autenticación siga siendo válida incluso cuando vuelva a la pista pública y vuelva a ser privada más tarde. Si la autenticación del explorador se realiza correctamente, el usuario se redirige automáticamente a la aplicación. Si la pista es pública (que es el valor predeterminado), el paso siguiente se produce directamente.

    • En iOS 9 y 10, se abrirá una instancia de dentro de SFSafariViewController la aplicación para autenticar al usuario. Se cerrará automáticamente después de que la autenticación se haya realizado correctamente.
    • En iOS 11, la experiencia del usuario es similar a iOS 9 y 10, pero iOS 11 le pedirá al usuario su permiso para acceder a la información de inicio de sesión. Se trata de un cuadro de diálogo de nivel de sistema y no se puede personalizar. Si el usuario cancela el cuadro de diálogo, puede seguir usando la versión que está probando, pero no obtendrá actualizaciones en la aplicación. Se les pedirá que accedan de nuevo a la información de inicio de sesión cuando inicien la aplicación la próxima vez.
  5. Una nueva versión de la aplicación muestra el cuadro de diálogo de actualización desde la aplicación que pide a los usuarios que actualicen la aplicación si es:

    • un valor mayor de CFBundleShortVersionString o
    • un valor igual de CFBundleShortVersionString pero un valor mayor de CFBundleVersion.
    • las versiones son las mismas, pero el identificador único de compilación es diferente.

Sugerencia

Si carga la misma ipa por segunda vez, el cuadro de diálogo NO aparecerá como los archivos binarios idénticos. Si carga una nueva compilación con las mismas propiedades de versión, se mostrará el cuadro de diálogo de actualización. La razón de esto es que es un binario diferente .

Cómo probar las actualizaciones desde la aplicación?

Debe cargar compilaciones de versión (que usan el módulo Distribuir del SDK de App Center) en el portal de App Center para probar las actualizaciones desde la aplicación, lo que aumenta los números de versión cada vez.

  1. Cree la aplicación en el portal de App Center si aún no lo ha hecho.
  2. Cree un nuevo grupo de distribución y asígnele el nombre para que pueda reconocer que está diseñado para probar la característica de actualización desde la aplicación.
  3. Agréguese (o todas las personas que quiera incluir en la prueba de la característica de actualización desde la aplicación). Usa una dirección de correo electrónico nueva o descartada para esto, que no se usó para esa aplicación en App Center. Esto garantiza que su experiencia esté cerca de la experiencia de los evaluadores reales.
  4. Cree una nueva compilación de la aplicación que incluya App Center Distribute y contenga la lógica de configuración, como se describe a continuación. Si el grupo es privado, no olvide establecer la pista de actualización privada desde la aplicación antes de empezar a usar la propiedad updateTrack.
  5. Haga clic en el botón Distribuir nueva versión en el portal y cargue la compilación de la aplicación.
  6. Una vez finalizada la carga, haga clic en Siguiente y seleccione el grupo Distribución que creó como Destino de esa distribución de la aplicación.
  7. Revise la distribución y distribuya la compilación al grupo de pruebas desde la aplicación.
  8. Personas en ese grupo recibirá una invitación para ser evaluadores de la aplicación. Una vez que acepten la invitación, pueden descargar la aplicación desde el portal de App Center desde su dispositivo móvil. Una vez que tengan instaladas las actualizaciones desde la aplicación, estará listo para probar las actualizaciones desde la aplicación.
  9. Aumente el nombre de la versión (CFBundleShortVersionString) de la aplicación.
  10. Compile la versión de lanzamiento de la aplicación y cargue una nueva compilación de la aplicación como hizo en el paso anterior y distribúyala al grupo de distribución que creó anteriormente. A los miembros del grupo de distribución se les pedirá una nueva versión la próxima vez que se inicie la aplicación.

Sugerencia

Echa un vistazo a la información sobre cómo usar App Center Distribute para obtener información más detallada sobre los grupos de distribución , etc. Aunque es posible usar App Center Distribute para distribuir una nueva versión de la aplicación sin agregar ningún código, agregar App Center Distribute al código de la aplicación dará lugar a una experiencia más fluida para los evaluadores y usuarios a medida que obtienen la experiencia de actualización desde la aplicación.

Deshabilitar el reenvío de las llamadas de métodos del delegado de aplicación a los servicios de App Center

El SDK de App Center usa swizzling para mejorar su integración reenviando a sí mismo algunas de las llamadas a métodos del delegado de aplicación. El giro del método es una manera de cambiar la implementación de métodos en tiempo de ejecución. Si por alguna razón no desea usar swizzling (por ejemplo, debido a una directiva específica), puede deshabilitar este reenvío para todos los servicios de App Center siguiendo los pasos siguientes:

  1. Abra el archivo Info.plist del proyecto.
  2. Agregue AppCenterAppDelegateForwarderEnabled la clave y establezca el valor en 0. Esto deshabilita el reenvío de delegados de aplicación para todos los servicios de App Center.
  3. Agregue la openURL devolución de llamada en el archivo del AppDelegate proyecto.
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

  // Pass the url to MSACDistribute.
  return [MSACDistribute openURL:url];
}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

  // Pass the URL to App Center Distribute.
  return Distribute.open(url)
}