Gostaria de verificar manualmente se há novas atualizações para meu aplicativo enquanto o usuário está nele e solicitar que ele baixe a nova versão. Posso fazer isso verificando a versão do meu aplicativo na app store - programaticamente?
111
NSNumber
número de versão. Então eu carreguei no meu site. O mesmo site que uso para o suporte do meu aplicativo e páginas da web do aplicativo, em seguidaviewDidLoad
, verifico o número da versão do site e verifico a versão atual no meu aplicativo. Então eu tenho um premadealertView
que solicita automaticamente a atualização do aplicativo. Posso fornecer o código, se desejar.Respostas:
Aqui está um trecho de código simples que permite saber se a versão atual é diferente
Nota: Certifique-se de que, ao inserir a nova versão no iTunes, ela corresponda à versão do aplicativo que você está lançando. Caso contrário, o código acima sempre retornará SIM, independentemente de o usuário atualizar.
fonte
Versão Swift 3:
Acho melhor lançar um erro ao invés de retornar falso, neste caso eu criei um VersionError mas pode ser algum outro que você definir ou NSError
Considere também chamar esta função de outro thread, se a conexão for lenta, ela pode bloquear o thread atual.
Atualizar
Usando URLSession:
Em vez de usar
Data(contentsOf: url)
e bloquear um thread, podemos usarURLSession
:exemplo:
fonte
DispatchQueue.global()
dá uma fila de background, os dados são carregados nessa fila e só voltam para a fila principal quando os dados são carregados.Agradecimentos a Steve Moser por seu link, aqui está meu código:
fonte
/en/
subcaminho. Depois de removê-lo, funcionouComo estava enfrentando o mesmo problema, encontrei a resposta fornecida por Mario Hendricks . Quando tentei aplicar seu código ao meu projeto, o XCode reclamou de problemas de Casting dizendo "MDLMaterialProperty não tem membros subscritos". Seu código estava tentando definir este MDLMaterial ... como o tipo da constante "lookupResult", fazendo com que a conversão para "Int" falhasse todas as vezes. Minha solução foi fornecer uma anotação de tipo para minha variável para NSDictionary para ser claro sobre o tipo de valor que eu precisava. Com isso, pude acessar o valor "versão" de que precisava.
Obs: Para este YOURBUNDLEID , você pode obter em seu projeto Xcode .... " Targets> General> Identity> Bundle Identifier "
Então, aqui está o meu código com algumas simplificações também:
Todas as sugestões para melhoria deste código são bem-vindas!
fonte
Basta usar ATAppUpdater . Tem 1 linha, thread-safe e rápido. Ele também tem métodos de delegação se você quiser rastrear a ação do usuário.
Aqui está um exemplo:
Métodos de delegação opcionais:
fonte
Simplificou uma ótima resposta postada neste tópico. Usando
Swift 4
eAlamofire
.E então para usá-lo:
fonte
{ "resultCount":0, "results": [] }
Atualizado o código do swift 4 de Anup Gupta
Eu fiz algumas alterações neste código . Agora as funções são chamadas de uma fila de segundo plano, já que a conexão pode ser lenta e, portanto, bloquear o thread principal.
Também tornei o CFBundleName opcional, já que a versão apresentada tinha "CFBundleDisplayName" que provavelmente não funcionou na minha versão. Portanto, agora, se não estiver presente, ele não travará, mas apenas não exibirá o nome do aplicativo no alerta.
Faço esta chamada para também adicionar o botão de confirmação:
Ou chame-o para ser chamado assim para ter a opção de forçar atualização em:
fonte
Aqui está minha versão usando Swift 4 e a popular biblioteca Alamofire (eu a uso em meus aplicativos mesmo assim). A solicitação é assíncrona e você pode passar um retorno de chamada para ser notificado quando terminar.
O uso é simples assim:
fonte
Posso sugerir esta pequena biblioteca: https://github.com/nicklockwood/iVersion
Seu objetivo é simplificar o manuseio de plists remotos para acionar notificações.
fonte
fonte
URLSession
.Esta resposta é uma modificação da resposta da datinc https://stackoverflow.com/a/25210143/2735358 .
função de datinc compara versão por comparação de string. Portanto, não vai comparar a versão para maior ou menor que.
Mas, esta função modificada compara a versão por NSNumericSearch (comparação numérica) .
Usar:
fonte
Eu vi muitas maneiras de verificar a atualização do aplicativo. então, com base em muitas respostas, eu as misturo e crio minha solução que está disponível no GitHub. Se alguma atualização for necessária, por favor me avise. Este código para Swift 4
Link do GitHub para este código. https://github.com/anupgupta-arg/iOS-Swift-ArgAppUpdater
Atualizar: https://stackoverflow.com/a/48810541/5855888 E https://github.com/emotality/ATAppUpdater
Happy Coding 👍 😊
fonte
Aqui está um método rápido que faz o que algumas das respostas do Objective-C sugerem. Obviamente, depois de obter as informações do JSON da loja de aplicativos, você pode extrair as notas de lançamento, se quiser.
fonte
Se você não estiver definindo o tipo de conteúdo em NSUrlRequest, com certeza não obterá resposta, então tente o código abaixo, ele funciona bem para mim. Espero que ajude....
fonte
Vindo de um POV de aplicativo híbrido, este é um exemplo de javascript, eu tenho um rodapé de atualização disponível no meu menu principal. Se uma atualização estiver disponível (ou seja, meu número de versão no arquivo de configuração é menor do que a versão recuperada, exiba o rodapé) Isso direcionará o usuário para a loja de aplicativos, onde o usuário pode clicar no botão atualizar.
Eu também pego os novos dados (ou seja, notas de versão) e os exibo em um modal no login se for a primeira vez nesta versão.
O método Update Available pode ser executado com a freqüência que você desejar. O meu é executado sempre que o usuário navega para a tela inicial.
Callback: a Apple tem uma API, muito fácil de obter
fonte
Aviso: a maioria das respostas fornecidas recupera o URL de forma síncrona (usando
-dataWithContentsOfURL:
ou-sendSynchronousRequest:
. Isso é ruim, pois significa que seu aplicativo não responderá por vários minutos se a conexão móvel cair enquanto a solicitação estiver em andamento. Nunca acesse a Internet de forma síncrona no thread principal.A resposta correta é usar API assíncrona:
O tempo limite padrão para conexões de rede é de vários minutos e, mesmo que a solicitação seja concluída, ela pode ser lenta o suficiente em uma conexão EDGE ruim para demorar tanto. Nesse caso, você não quer que seu aplicativo fique inutilizável. Para testar coisas como essa, é útil executar seu código de rede com o Network Link Conditioner da Apple.
fonte
para comparar a string de versão:
https://github.com/eure/AppVersionMonitor
fonte
PARA SWIFT 4 e 3.2:
Primeiro, precisamos obter o id do bundle do dicionário de informações do bundle, definir isUpdaet como false.
Em seguida, precisamos chamar uma chamada urlSession para obter a versão do itunes.
O CÓDIGO COMPLETO SERÁ ASSIM:
Então, podemos chamar a função de qualquer software de que precisarmos.
fonte
Equivalência C # de @datinc, na medida em que se obtém a versão da Apple App Store. Código incluído para obter a versão do pacote ou do arquivo AssemblyInfo.
EDIT :: Observe a região, "/ us /", incluída na urlString. Este código de país precisará ser manipulado / alterado de acordo.
fonte
Tente fazer isso com uma única chamada de função:
Função de alerta para abrir o URL da AppStore:
Como chamar a função acima:
Para obter mais detalhes, tente o link abaixo com o código completo:
AppStoreUpdate.swift
ItunesAppInfoResult.swift
ItunesAppInfoItunes.swift
Espero que isso ajude!
fonte
Esta pergunta foi feita em 2011, eu a encontrei em 2018 enquanto procurava uma maneira não apenas de verificar a nova versão do aplicativo na App Store, mas também de notificar o usuário sobre ela.
Após uma pequena pesquisa, cheguei à conclusão de que a resposta de juanjo (relacionada ao Swift 3) https://stackoverflow.com/a/40939740/1218405 é a solução ideal se você quiser fazer isso em código por conta própria
Além disso, posso sugerir dois grandes projetos no GitHub (mais de 2300 estrelas cada)
Exemplo para Siren (AppDelegate.swift)
fonte
Swift 4
Podemos usar o novo
JSONDecoder
para analisar a resposta de itunes.apple.com/lookup e representá-la com classes ou estruturas decodificáveis:Também podemos adicionar outras propriedades
AppInfo
no caso de precisarmos dareleaseNotes
ou alguma outra propriedade.Agora podemos fazer uma solicitação assíncrona usando
URLSession
:esta função recebe um fechamento de conclusão que será chamado quando a solicitação for concluída e retorna um
URLSessionDataTask
caso seja necessário cancelar a solicitação, e pode ser chamada assim:fonte
LookupResult
eAppInfo
em algum lugar do seu projeto, preferencialmente em um arquivo separado: Elas são usadas quando você decodifica a resposta:JSONDecoder().decode(LookupResult.self, from: data)
e contêm a string de versãoMinha proposta de código. Com base nas respostas de @datinc e @ Mario-Hendricks
Você deve, é claro, substituir
dlog_Error
por sua chamada de função de registro.Esse tipo de estrutura de código deve evitar que seu aplicativo falhe no caso de um erro. Buscar o
appStoreAppVersion
não é obrigatório e não deve levar a erros fatais. E ainda, com este tipo de estrutura de código, você ainda terá seu erro não fatal registrado.fonte
se você deseja verificar a versão atual do seu aplicativo, usado abaixo do código simples:
fonte