Pregunta

¿Es posible obligar al usuario a actualizar una vez que hay una nueva versión de mi aplicación disponible en la tienda iTunes?

Actualmente estoy trabajando en una aplicación. Sin embargo, quiero forzar la actualización cada vez que subo una versión más reciente, debido a que la actualización tendrá más características y quiero descartar la versión anterior. ¿Es esto posible por defecto con iPhone o tengo que escribir mi propia aplicación para comprobar la versión actual y compararlo con la tienda?

¿Fue útil?

Solución

El único sistema de manera maneja las actualizaciones de la aplicación está pidiendo al usuario que la actualización está disponible en AppStore aplicación estándar.
Además, aplicación independiente que no está al tanto de las actualizaciones disponibles por lo que necesita para implementar su servicio web en la aplicación puede comprobar si la versión actual es válida.
Y no estoy seguro de si esto es conforme con las reglas de Apple en aplicaciones, como (no se puede encontrar la prueba de enlace de embargo) no puede cargar versiones de prueba para una aplicación.

* EDITAR * Esta respuesta ya no es cierto. Ver otras respuestas upvoted de la verdad actual.

Otros consejos

He hecho esta característica por conseguir la versión de iTunes servicio web y la comparación con la versión actual .. Lo que sigue es mi código

        NSString *version = @"";
        NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/lookup?id=<Your app ID>"];
        versionRequest = [ASIFormDataRequest requestWithURL:url];
        [versionRequest setRequestMethod:@"GET"];
        [versionRequest setDelegate:self];
        [versionRequest setTimeOutSeconds:150];
        [versionRequest addRequestHeader:@"Content-Type" value:@"application/json"]; 
        [versionRequest startSynchronous];

        //Response string of our REST call
        NSString* jsonResponseString = [versionRequest responseString];

        NSDictionary *loginAuthenticationResponse = [jsonResponseString objectFromJSONString];

        NSArray *configData = [loginAuthenticationResponse valueForKey:@"results"];

        for (id config in configData) 
        {
            version = [config valueForKey:@"version"];
        }
   //Check your version with the version in app store
        if (![version isEqualToString:[itsUserDefaults objectForKey:@"version"]]) 
        {
            ProAlertView *createUserResponseAlert = [[ProAlertView alloc] initWithTitle:@"New Version!!" message: @"A new version of app is available to download" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: @"Download", nil];
        [createUserResponseAlert show]; 
        [createUserResponseAlert release];
        }

Y poner el ID de aplicación en el enlace de iTunes ver el código de abajo ..

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the OK/Cancel buttons
    if (buttonIndex == 1)
    {
        NSString *iTunesLink = @"itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=<appid>&mt=8";
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];
    }
}

Nota: Es necesario JSONKit marco de trabajo y el trabajo ASIHttp marco para hacer las llamadas de servicio web ..

Puede detectar si la aplicación necesita una actualización luego tomar alguna acción personalizada al igual que alerta al usuario una actualización disponible. Aquí es un fragmento de código que detecta que hay una actualización disponible.

-(BOOL) needsUpdate{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1){
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion]){
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

Si es absolutamente necesario, puede iniciar la App Store para que sus usuarios puedan obtener la última versión de allí. Recomendaría hacer esto opcional, o al menos presentar un diálogo en primer lugar.

// iTunesLink should be your applications link
NSString *iTunesLink = @"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284417350&mt=8";


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];

Esta pregunta fue originalmente publicado hace 7 años, y si bien algunas de las respuestas siguen siendo pertinentes, aquí es un enfoque más arriba-a-fecha.

https://github.com/ArtSabintsev/Siren Swift que es compatible y puede 3 instalarse con Cocoapods o Cartago.

CocoaPods, Swift 3 de soporte:

pod 'Siren'

Cartago:

github "ArtSabintsev/Siren"

Un sistema para actualizaciones obligatorias debe ser parte de cada aplicación que tiene una dependencia de algo externo a esa aplicación. Tanto Apple y Google afirman que si una aplicación utiliza algo externo a continuación, que la API externa debe vivir para siempre, nunca cambian, etc., etc., pero eso es simplemente poco realista. Y si ese es el caso, si se los servicios que la aplicación depende pueden cambiar luego debe ser un camino para la aplicación para comprobar y ver si se debe restringir la funcionalidad y solicitar al usuario a conseguir la última versión o simplemente cosas misteriosamente fallar.

Esto puede y debe ser algo que Apple y Google proporcionan, pero no lo hacen por lo que cada aplicación fuera de unos pocos juegos necesita construir esto, así que ...

He empezado un código abierto rieles basado en proyectos (Apache 2.0) para crear una solución a este problema. Se llama Aplicación- [Ctrl], y es en gran medida un trabajo en progreso, pero que pueden hacer uso de ella y deseo agradecer las contribuciones de ningún tipo. Si puedo conseguir esto en marcha y funcionando en mi tiempo libre voy a dar esto a todos los desarrolladores de aplicaciones con un nivel muy razonable de servicio gratuito y por supuesto todas las empresas siempre será capaz de girar su propia implementación.

Es aquí en GitHub: https://github.com/SlalomDigital/ApplicationCtrl

contribuir y ayudar a resolver este problema para siempre!

No hay manera automatizada para hacerlo, tendría que escribir algo de forma manual.

Su plan de negocios / diseño nunca debe contener la frase "obligar al usuario". La gente se enoja cuando usted hace que ellos hagan algo. Imagine un usuario apurado que abre su pequeña ingeniosa aplicación de una mañana sólo para descubrir que le están obligando a actualizar antes de que pueda utilizar la aplicación para lo que necesita. Imagínese que está pegado a cabo en las tierras remotas que tienen que utilizar Edge para descargar. Él no será feliz.

Si usted sigue este plan lo suficientemente largo, una de sus actualizaciones introducirá inevitablemente un error apreciable. Si se obliga a los usuarios a utilizar una versión con errores se rebelarán.

He estado condicionado por la experiencia a temblar cada vez que veo "más características" que se utiliza para describir una nueva versión del software, ya que esto significa, inevitablemente, la hinchazón característica. Los diseñadores tienden a mantener el injerto más y más características en aplicaciones hasta que una aplicación hace todo. Esto es particularmente peligroso en una plataforma como el iPhone, donde hacer una aplicación a hacer muchas cosas rápidamente abruma la interfaz y la capacidad de respuesta de la aplicación.

Edit01: Mi comentario aquí Cómo actualizar una aplicación después de actualización de los usuarios pagan por también podría ser relevante para sus planes. Si el diseño de actualización de Apple corta fuera del circuito de los ingresos, es un non-starter.

Actualización:

Solo para aclarar basado en un comentario a continuación: Sí, a veces usted tiene que exigir a los usuarios a actualizar. Sin embargo, es muy diferente de el diseño la aplicación desde el principio para obligar a los usuarios a actualizar cada vez que el desarrollador lanza una nueva versión.

Tal diseño tiene la intención de hacer la vida del desarrollador fácil y no el usuario de. Cada vez que una usuario tiene que gastar tiempo de actualización para un beneficio que no pidieron y quizás no quieren, que ha tomado tiempo y recursos por parte del cliente. Diseño que la descarga de tiempo y esfuerzo por parte del desarrollador para el usuario son malos diseños en última instancia, porque la gente compra software para su propio beneficio. Al disminuir ese beneficio, también disminuyen los softwares rentabilidad final.

Por lo tanto, ningún diseñador debe diseñar software que obliga a los usuarios a hacer algo que el usuario no desea a menos que sea una necesidad técnica absoluta. Esto es por supuesto una regla de oro, pero es una muy buena.

Mi actualización de la aplicación a la App Store se acaba de rechazar precisamente por esta razón. Hemos añadido una función para comprobar la versión instalada en contra de la versión actual y si no es una versión compatible, que les obligan a actualizar.

Apple rechazó esto.

Así que de vuelta a la mesa de diseño!

Las demás respuestas indican que uno tiene que implementar la funcionalidad de actualización forzada de uno mismo. Es una pena realmente, me gustaría que no fuera así. Mi primera actualización de una aplicación iOS va a ser liberado mañana, y afortunadamente que no será un problema, ya que sólo hemos realizado cambios en la aplicación. Sin embargo, cuando vamos a cambiar con el tiempo la estructura de nuestros servicios web, que sería muy útil para ser capaz de forzar cambios, por lo que nuestro servidor no tiene que soportar todos y cada versión de la aplicación.

Hay una alternativa a las actualizaciones forzadas sin embargo, lo que parece ser no mencionada en este hilo. Usted podría tener todas las llamadas de servicio web que produce datos de adjuntar un esquema para los datos, que cuenta la aplicación de la forma en que los datos se debe deserialised en su aplicación. Esto le permite cambiar la estructura de los datos producidos por los encuentros solicitudes sin romper deserialización en la aplicación. Por supuesto, esto supone que el intérprete que se escribe, no cambiar por sí misma, sino que es una suposición razonable para hacer algo cuando ha madurado.

Publicar solicitudes podrían ser "esquema-ficado" a través de la interacción. Con esto quiero decir que antes de cada post-petición que realice, de pedir instrucciones sobre cómo llamar al servicio web al día. Procesar las instrucciones usando un esquema adjunto para eso, y luego hacer la llamada real para el servicio web. Básicamente, esto significa que cada petición posterior requiere 2 solicitudes, pero eso puede estar bien.

Sin embargo, no importa si se implementa la interpretación actualización o esquema forzado la funcionalidad tiene que estar presente en la aplicación desde el día 1 cuando llega a la App Store. De lo contrario estás en el mismo lío. Toda esta complejidad sería innecesaria si Apple implementó obligado actualización para nosotros los desarrolladores. interpretación esquema seguiría siendo una mejora usabilidad si existía actualización forzada sin embargo. Pero me molesta un poco que Apple no han obligado a la actualización, ya que al menos con ella, se podría introducir las propias medidas contra la ruptura de actualización después de la aplicación fue puesto en libertad.

Hola para cualquier persona en el futuro me encontré con este tutorial que debería ayudar a nadie, me ayudó.

http: / /codewithchris.com/tutorial-how-to-implement-in-app-update-functionality-in-your-iphoneipad-app/

Editar (el código se verá algo similar a lo que está más abajo):

// Try to get version 
NSString *versionNumber = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

NSURL *updateUrl = [NSURL URLWithString:@"http://yourdomain.com/yourupdatefile.xml"];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:updateUrl
                                            cachePolicy:NSURLCacheStorageNotAllowed
                                        timeoutInterval:20.0];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest
                                     returningResponse:&response
                                                 error:&error];
// Check no error, then parse data
if (error == nil)
{
    // Parse response into a dictionary
    NSPropertyListFormat format;
    NSString *errorStr = nil;
    NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData:data
                                                                mutabilityOption:NSPropertyListImmutable
                                                                          format:&format
                                                                errorDescription:&errorStr];        
    if (errorStr == nil)
    {
        @try {

            // Try to see if the current app version exists in the update xml
            NSString *itunesUrl = [dictionary objectForKey:versionNumber];

            if (itunesUrl)
            {
                // Show dialog to ask user to update!
            }
            else {
                // Version not in XML
            }
        } @catch (NSException *e) {
            // Error with retrieving the key
        }
    }
    else {
        // Error with parsing data into dictionary
    }
}

Sin embargo, tras una posterior investigación he encontrado que esto es una gran solución para si no está utilizando un servidor.

-(BOOL) needsUpdate{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1){
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion]){
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

En la:

if (![appStoreVersion isEqualToString:currentVersion]){
                NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
                return YES;
            }

parte del código se establece lo que quiere hacer si no es igual, aquí es donde se envía al usuario a la tienda de aplicaciones para descargar la última versión.

Puede utilizar debajo de la URL para obtener la información de cualquier aplicación Que acaba de saber su ID de Apple de su aplicación.

Usted puede obtener este ID de Apple en el itunesconnect.com> aplicación> aplicación página de información

GET: http://itunes.apple.com/lookup?id=

Por supuesto, no hay manera. El usuario debe tomar la decisión si quiere descargar una nueva versión de su aplicación o no.

La AppStore mostrará si hay arenew versiones, así que tampoco creo que Apple va a permitir esto. También no sé cómo podría hacer esto? Se puede comprobar que a través de una conexión a Internet, pero esa no es la manera de Apple le gusta y lo que no tendrá la oportunidad de hacerlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top