Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
Visual Studio App Center se retiró el 31 de marzo de 2025, excepto las características de análisis y diagnóstico, que seguirán siendo compatibles hasta el 30 de junio de 2026. Más información.
- Androide
- Ios
- unidad
- MAUI/Xamarin
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:
- Si has publicado la aplicación en la App Store, las actualizaciones en la aplicación se deshabilitarán.
- Si estás ejecutando pruebas automatizadas de IU, las actualizaciones dentro de la aplicación habilitadas bloquearán tus pruebas automatizadas de IU, ya que intentarán autenticarse contra el back-end de App Center. Se recomienda no activar App Center Distribute para el objetivo de prueba de la interfaz de usuario.
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.
Añade actualizaciones en 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
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
Ejecute
carthage update
.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 a la sección Marcos y bibliotecas vinculados de XCode.
Arrastre y coloque AppCenterDistributeResources.bundle desde AppCenterDistribute.framework a Project Navigator de XCode.
Aparecerá un cuadro de diálogo, asegúrese de que el destino de la aplicación esté seleccionado. A continuación, haga clic en Finalizar.
Integración a través del Administrador de paquetes Swift
- En el menú Xcode, haga clic en Archivo > Swift Packages > Añadir dependencia de paquete.
- En el cuadro de diálogo que aparece, escriba la dirección URL del repositorio:
https://github.com/microsoft/appcenter-sdk-apple.git
. - En Versión, seleccione Hasta la próxima versión principal y elija la opción predeterminada.
- Elija AppCenterDistribute en la columna Package Product (Paquete de producto ).
Integración mediante la copia de los archivos binarios en el proyecto
Si no desea usar Cocoapods, puede integrar los módulos copiando los archivos binarios en el proyecto. Para hacerlo, siga estos pasos:
Nota:
El SDK de App Center admite el uso de XCframework
. Si desea integrar XCframeworks en su proyecto, descargue el AppCenter-SDK-Apple-XCFramework.zip de la página de lanzamientos y descomprímalo. 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.
Descargue los marcos del SDK de App Center proporcionados como un archivo ZIP.
Descomprima el archivo y verá una carpeta denominada AppCenter-SDK-Apple/iOS que contiene marcos diferentes para cada servicio de App Center. El marco al que se llama
AppCenter
es necesario en el proyecto, ya que contiene código que se comparte entre los distintos módulos.[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.
Abra Finder y copie la carpeta AppCenter-SDK-Apple/iOS descomprimida en la carpeta del proyecto en la ubicación donde quiera.
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. AppCenter.framework es necesario 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, asegúrese de que el destino de la aplicación esté seleccionado. A continuación, 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. Es necesario que llame explícitamente a cada uno de ellos al iniciar el SDK.
2.1 Agregar la importación de App Center Distribute
Abra el archivo AppDelegate.m del proyecto en Objective-C o archivo 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
a su método start:withServices:
para iniciar el servicio App Center Distribute.
Inserte la línea siguiente para iniciar el SDK en la clase AppDelegate.m del proyecto para Objective-C o la clase 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
- 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. - Cambie el tipo de clave a Matriz.
- Agregue una nueva entrada a la matriz (
Item 0
) y cambie el tipo a Dictionary. - En
Item 0
, agregue unaURL Schemes
clave y cambie el tipo a Matriz. - Bajo tu
URL Schemes
tecla, añade una nueva entrada (Item 0
). - En
URL Schemes
>Item 0
, cambie el valor aappcenter-{APP_SECRET}
y reemplace por{APP_SECRET}
el secreto de aplicación de la aplicación.
Sugerencia
Si desea comprobar que modificó 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 de la propiedad updateTrack
.
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 comprobación automática de actualizaciones
De forma predeterminada, el SDK comprueba automáticamente las nuevas versiones:
- Cuando se inicia la aplicación.
- Cuando la aplicación entra en segundo plano y luego vuelve a estar en primer plano.
- Al habilitar el módulo Distribuir, si se ha deshabilitado anteriormente.
Si desea comprobar las nuevas versiones manualmente, puede deshabilitar la comprobación automática de la actualización. Para ello, llame al método siguiente antes de iniciar 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 disponible una nueva versión.
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 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 se repetirá cada vez que tu aplicación pase a primer plano.
3. Ejecutar código si no se encuentra ninguna actualización
En los casos en que el SDK verifica si hay actualizaciones y no encuentra ninguna más reciente que la que se está utilizando actualmente, se invoca un callback del delegado de distributeNoReleaseAvailable:
MSACDistributeDelegate
. 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 lo deshabilita, el SDK no proporcionará ninguna funcionalidad de actualización desde la aplicación, pero todavía puede usar el servicio Distribuir 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 de que Distribute
se haya iniciado.
Compruebe 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 de que Distribute
haya comenzado; antes de empezar, siempre devolverá false
.
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 resultarle perjudicial durante la fase de desarrollo de la aplicación. No se recomienda inicializar Distribute
para tu configuración DEBUG
.
#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;
El método delegado de distributeWillExitApp:
se llamará justo antes de que la aplicación se cierre para instalar 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:
Esta característica SOLO funcionará con compilaciones que se distribuyen mediante el servicio Distribuir de App Center . No funcionará cuando el depurador esté conectado o si la función de Acceso Guiado de iOS está activada.
Una vez que integre el SDK, compile una versión de lanzamiento de su aplicación y cárguela en App Center, los usuarios en ese grupo de distribución serán notificados de la nueva versión a través de un correo electrónico.
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 en la aplicación para las aplicaciones que se han instalado desde otros orígenes (por ejemplo, descargar la aplicación desde un correo electrónico adjunto). Cuando se descarga una aplicación desde el vínculo, el SDK guarda información importante de las cookies para comprobar si hay actualizaciones más adelante; de lo contrario, el SDK no tiene esa información clave.
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 permanezca válida incluso cuando vuelva a la pista pública y vuelva a 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 siguiente paso se produce directamente.
- En iOS 9 y 10, una instancia de
SFSafariViewController
se abrirá dentro de 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 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 vuelvan a acceder a la información de inicio de sesión cuando inicien la aplicación la próxima vez.
- En iOS 9 y 10, una instancia de
Una nueva versión de la aplicación muestra el cuadro de diálogo de actualización en 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 deCFBundleVersion
. - las versiones son las mismas, pero el identificador único de compilación es diferente.
- un valor mayor de
Sugerencia
Si carga la misma ipa una segunda vez, el cuadro de diálogo NO aparecerá ya que los archivos binarios son idénticos. Si carga una nueva compilación con las mismas propiedades de versión, mostrará el cuadro de diálogo de actualización. La razón de esto es que es un binario diferente .
¿Cómo se prueban las actualizaciones desde la aplicación?
Para probar las actualizaciones dentro de 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, aumentando los números de versión en cada ocasión.
- Cree la aplicación en el portal de App Center si aún no lo ha hecho.
- 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 en la aplicación.
- Agréguese (o a todas las personas que quiera incluir en la prueba de la característica de actualización en la aplicación). Use una dirección de correo electrónico nueva o descartable para este propósito, que no se haya utilizado para esa aplicación en App Center. Esto garantiza que su experiencia esté cerca de la experiencia de los evaluadores reales.
- 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.
- Haga clic en el botón Distribuir nueva versión en el portal y cargue la compilación de la aplicación.
- 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.
- Revise la Distribución y distribuya el build a su grupo de pruebas dentro de la aplicación.
- Las personas de ese grupo recibirán 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 instaladas las actualizaciones desde la aplicación, estará listo para probar las actualizaciones desde la aplicación.
- Aumente el nombre de la versión (
CFBundleShortVersionString
) de la aplicación. - Compile la versión de lanzamiento de la aplicación y cargue una nueva compilación de la aplicación como lo hizo en el paso anterior y distribuya esto 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
Vea 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 los 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. Swizzling de métodos es una manera de cambiar la implementación de métodos en tiempo de ejecución. Si por algún motivo no desea utilizar el swizzling (por ejemplo, debido a una directiva específica), puede deshabilitar este reenvío para todos los servicios de App Center siguiendo estos pasos:
- Abra el archivo Info.plist del proyecto.
- Agregue
AppCenterAppDelegateForwarderEnabled
la clave y establezca el valor en0
. Esto desactiva el reenvío de delegados de aplicación para todos los servicios de App Center. - Agregue la
openURL
devolución de llamada en el archivo delAppDelegate
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)
}