Pergunta

É possível forçar o usuário a atualizar uma vez que há uma nova versão do meu aplicativo disponível na iTunes Store?

No momento, estou trabalhando em um aplicativo. No entanto, eu quero forçar a atualização sempre que eu carregar uma versão mais recente, porque a atualização terá mais recursos e quero descartar a versão anterior. Isso é possível por padrão com o iPhone ou tenho de escrever a minha própria implementação para verificar a versão atual e compará-lo para a loja?

Foi útil?

Solução

A única maneira identificadores de sistema atualizações de sua aplicação está alertando usuário que atualização está disponível na aplicação AppStore padrão.
Além disso, aplicação autônoma não tem conhecimento de atualizações disponíveis para que você vai precisar para implementar o seu serviço web onde a aplicação pode verificar se a versão atual é válido.
E eu não estou certo se este está em conformidade com as regras da Apple sobre aplicações, como (não pode encontrar a prova-link embora) você não pode carregar versões de teste para um aplicativo.

* EDIT * Essa resposta não é mais verdade. Veja outras respostas upvoted da verdade atual.

Outras dicas

Eu fiz este recurso, obtendo versão do iTunes webservice e comparando com a versão atual .. A seguir é o meu 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];
        }

E colocar o ID de aplicativo na iTunes ligar ver o código abaixo ..

- (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: Você precisa JSONKit quadro de trabalho e quadro de trabalho ASIHttp para fazer as chamadas webservice ..

Você pode detectar se o aplicativo precisa de uma atualização em seguida, tomar alguma ação personalizada como alerta o usuário está disponível uma actualização. Aqui está um fragmento de código que detecta que uma atualização está disponível.

-(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;
}

Se você absolutamente necessário, você pode lançar a App Store para que os usuários podem obter a versão mais recente de lá. Eu recomendaria fazer esse opcional, ou pelo menos apresentar um diálogo em primeiro 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 questão foi originalmente publicado há 7 anos, e enquanto algumas das respostas continuam a ser relevantes, aqui é uma abordagem mais up-to-date.

Eu recomendo https://github.com/ArtSabintsev/Siren que é Swift 3 compatíveis e podem ser instalado com CocoaPods ou Cartago.

CocoaPods, Swift 3 suporte:

pod 'Siren'

Cartago:

github "ArtSabintsev/Siren"

Um sistema para atualizações forçadas deve ser parte de cada aplicativo que tem uma dependência em algo externo a essa aplicação. Ambos reivindicação Apple e Google que, se um aplicativo usa algo externo, então, que API externa deve viver para sempre, nunca mais a mudança, etc., etc., mas isso é simplesmente irreal. E se esse for o caso, se os serviços que o aplicativo depende pode mudar, então não deve ser um caminho para o aplicativo para verificar e ver se ele deve restringir a funcionalidade e alerta o usuário para obter a versão mais recente ou as coisas vão simplesmente falhar misteriosamente.

Isto pode e deve ser algo que a Apple e Google oferecem, mas eles não fazê-lo todos fora aplicativo de algumas necessidades jogos para construir este, então ...

Eu comecei um open-source rails base (Apache 2.0) projeto para criar uma solução para este problema. É chamado Aplicativo- [Ctrl], e é muito mais um trabalho em andamento, mas você está convidado a usá-lo e congratulo-me com contribuições de qualquer espécie. Se eu conseguir esta instalado e funcionando no meu tempo livre eu vou dar isso para todos os desenvolvedores de aplicativos com algum nível muito razoável de serviço gratuito e, claro, cada empresa será sempre capaz de girar até a sua própria implementação.

É aqui no GitHub: https://github.com/SlalomDigital/ApplicationCtrl

Contribute e me ajudar a resolver este problema para o bom!

Não há nenhuma maneira automatizada de fazê-lo, você teria que escrever algo manualmente.

Seu plano de negócios / design nunca deve conter a frase "forçar o usuário". As pessoas ficam com raiva quando você fazê-los fazer algo. Imagine um usuário em uma pressa que abre seu bacana pequeno aplicativo uma manhã apenas para descobrir que você está forçando-o a atualizar antes que ele pode usar o aplicativo para que ele precisa. Imagine que ele está fora preso nos confins ter que usar Borda para download. Ele não vai ser feliz.

Se você seguir este plano de tempo suficiente, uma de suas atualizações, inevitavelmente, introduzir um bug perceptível. Se você forçar os usuários a utilizar uma versão de buggy que vai se rebelar.

I foram condicionados pela experiência se encolher sempre que vejo "mais recursos" usados ??para descrever uma nova versão do software, porque isso inevitavelmente significa recurso bloat. Designers tendem a manter o enxerto mais e mais recursos para aplicações até que um aplicativo faz tudo. Isto é particularmente perigoso em uma plataforma como o iPhone, onde fazer um app fazer para muitas coisas domina rapidamente a interface ea capacidade de resposta do aplicativo.

Edit01: Meu comentário aqui como atualizar um aplicativo após os usuários pagam para atualização também podem ser relevantes para os seus planos. Se o seu projeto de atualização corta a Apple fora do circuito das receitas, é um non-starter.

Update:

Só para esclarecer com base em um comentário abaixo: Sim, às vezes você tem que exigir que os usuários atualizar. No entanto, isso é muito diferente de projetar o aplicativo desde o início para forçar os usuários a atualizar cada vez que o desenvolvedor lança uma nova versão.

O projeto Tal visa tornar a vida do desenvolvedor fácil e não o usuário do. Cada vez que um usuário tem que gastar tempo atualizando para um benefício que não pediu e talvez não queira, você tomou tempo e recursos do cliente. Projetar que o tempo de descarregamento e esforço do desenvolvedor para o usuário são projetos ruins porque as pessoas em última análise, comprar software para seu próprio benefício. Quando você diminuir esse benefício, você diminuir os softwares rentabilidade final.

Assim, nenhum designer deve projetar um software que obriga os usuários a fazer algo que o usuário não deseja menos que seja uma necessidade técnica absoluta. Este é, naturalmente, uma regra de ouro, mas é muito bom.

Meu atualização do aplicativo para a loja App foi apenas rejeitado exatamente por este motivo. Nós adicionamos um recurso para verificar a versão instalada contra o lançamento atual e se não é uma versão suportada, que forçá-los a atualizar.

Apple rejeitou esta.

Então, de volta à placa design!

As outras respostas indicam que um tem que implementar a funcionalidade de atualização forçada a si mesmo. É uma pena realmente, eu gostaria que não fosse assim. Minha primeira atualização para um aplicativo iOS é para ser lançado amanhã, e, felizmente, não será problema, como temos feito somente alterações no aplicativo. No entanto, quando acabará por alterar a estrutura dos nossos webservices, seria realmente útil ser capaz de forçar atualizações, para que o nosso servidor não tem de suportar todos e cada versão do aplicativo.

Há uma alternativa para atualizações forçadas no entanto, o que parece ser não mencionados neste segmento. Você poderia ter cada chamada webservice que produz dados anexar um esquema para os dados, que informa o aplicativo como esses dados devem ser deserialised em seu aplicativo. Isso permite que você alterar a estrutura dos dados produzidos por Get-solicitações sem quebrar deserialisation no aplicativo. Claro que isso pressupõe que o intérprete que você escreve, não é em si vai mudar, mas isso é uma suposição pouco razoável fazer quando ele amadureceu.

solicitações post poderia ser "schema-ficados" através da interação. Com isto quero dizer que antes de cada pós-pedido que você faz, você perguntar para obter instruções sobre como chamar o até à data webservice. Você processar as instruções usando um esquema em anexo para que, em seguida, fazer a chamada real para o webservice. Essencialmente, isso significa que cada solicitação post requer 2 pedidos, mas que podem ser aprovado.

No entanto, não importa se você implementar forçados a actualização ou esquema interpretação a funcionalidade tem de estar presente no app do dia 1, quando ela atinge a App Store. Caso contrário, você está na mesma bagunça. Toda essa complexidade seria desnecessário se a Apple implementou a atualização forçada para nós desenvolvedores. interpretação esquema ainda seria uma melhoria usabilidade se a atualização forçada existia embora. Mas me incomoda um pouco que a Apple não ter forçado a actualização, porque pelo menos com ele, pode-se introduzir as próprias medidas anti-break a atualização depois que o aplicativo foi lançado.

Olá para qualquer um no futuro eu encontrei este tutorial que deve ajudar ninguém, isso me ajudou.

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

Editar (o seu código será algo semelhante ao que está abaixo):

// 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
    }
}

No entanto, após mais pesquisas eu encontrei este para ser uma grande solução para se você não estiver usando um 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;
}

No:

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

parte do código que você definir o que você quer fazer, se não é igual, isto é onde você envia o usuário para a App Store para baixar a última versão.

Você pode usar abaixo url para obter as informações de qualquer aplicativo Você só sabe o seu Apple ID do seu aplicativo.

Você pode obter esse ID Apple na itunesconnect.com> seu aplicativo> página de informações do aplicativo

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

É claro que não há nenhuma maneira. O usuário deve tomar a decisão se ele quer baixar uma nova versão do seu aplicativo ou não.

O AppStore irá mostrar se há arenew versões, então eu também não acho que a Apple vai permitir isso. Também eu não sei como você faria isso? Você pode verificar isso através de uma ligação à Internet, mas isso não é o caminho a Apple gosta e assim você não terá a chance de fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top