O StackOverflow ainda tem muitas perguntas sobre a validação das verificações da App Store, por isso decidimos escrever um artigo sobre este tópico em um formato de pergunta e resposta.

O que é um cheque da App Store?
Este é um arquivo criptografado no formato PKCS # 7, que contém informações sobre todas as compras no aplicativo. Ele está localizado no pacote de aplicativos e pode ser obtido facilmente chamando: Bundle.main.appStoreReceiptURL
.
Sempre existe esse arquivo?
Se o aplicativo foi baixado da App Store, sim, sempre. E se ele foi instalado via Xcode ou Testflight, inicialmente o aplicativo não tem verificação de sandbox até a primeira compra ou restauração da verificação.
O que significa "validar um cheque"?
Isso significa descriptografar o arquivo, receber a data JSON e verificar as compras feitas pelo usuário. Você pode fazer isso localmente ou enviando uma solicitação à Apple.
Em que casos um desenvolvedor exige a validação de um cheque?
Para validar uma compra recém-concluída.
Quando muitos tiveram um jailbreak, isso foi relevante: havia utilitários para falsificar um cheque. Agora, esse problema deixou de ser grave, porque o jailbreak se tornou uma raridade.
Ao restaurar compras.
Se um usuário reinstalar seu aplicativo ou iniciar a partir de outro dispositivo, você deverá conceder a ele acesso à funcionalidade pela qual ele já pagou. Após descriptografar a verificação da App Store, você pode descobrir se uma compra no aplicativo foi comprada.
Ao comprar assinaturas renováveis automaticamente.
Para determinar o status atual da assinatura e a data de validade.
Quais compras podem ser restauradas durante a validação?
Existem 4 tipos de compras no aplicativo:
- compras de consumíveis
- compras não consumíveis
- assinaturas não renováveis
- Assinaturas renováveis automaticamente
Você pode restaurar tudo, exceto as compras gastas. Isso inclui, por exemplo, moedas em seu aplicativo - algo que você pode comprar quantas vezes quiser. Você deve salvar o número atual de moedas no usuário em seu servidor.
Quais métodos de validação existem?
Existem três deles:
- validação local usando OpenSSL,
- Validação sob demanda da Apple diretamente de um dispositivo iOS,
- Validação sob demanda da Apple usando seu servidor.
Qual método de validação é melhor?
A validação local é complexa e requer muito tempo e esforço para implementar. Você também precisará adicionar a biblioteca OpenSSL ao seu projeto. Em alguns casos, você precisará atualizar a verificação.
A Apple não recomenda a verificação de cheques no próprio dispositivo iOS. Isso não é seguro: uma solicitação pode ser interceptada com um ataque man-in-the-middle.
É melhor validar verificações no servidor. Além disso, a Apple ocasionalmente adiciona novos campos lá, por exemplo, grace_period_expires_date
e subscription_group_identifier
. Em nosso servidor, podemos fazer alterações rapidamente sem atualizar o aplicativo. E os dois métodos de validação anteriores podem ser facilmente enganados, basta alterar a hora do sistema no dispositivo iOS.
Para que serve o segredo compartilhado?
Essa é uma linha de chave especial necessária para descriptografar cheques com compras renováveis automaticamente. A Apple usa o segredo compartilhado como parâmetro na solicitação HTTPS para a Apple.
Onde obter o segredo compartilhado?
Vá para a App Store Connect, abra o aplicativo, vá para a guia Recursos , na seção Compras internas, você verá a chave Compartilhada do botão do aplicativo . Gere uma nova chave, se ainda não estiver.
Código de amostra para validar uma verificação
func validateReceipt(){ #if DEBUG let urlString = "https://sandbox.itunes.apple.com/verifyReceipt" #else let urlString = "https://buy.itunes.apple.com/verifyReceipt" #endif guard let receiptURL = Bundle.main.appStoreReceiptURL, let receiptString = try? Data(contentsOf: receiptURL).base64EncodedString() , let url = URL(string: urlString) else { return } let requestData : [String : Any] = ["receipt-data" : receiptString, "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : false] let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: []) var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") request.httpBody = httpBody URLSession.shared.dataTask(with: request) { (data, response, error) in
Este é um exemplo de validação de uma verificação no iOS. Lembre-se de substituir o valor de YOUR_SHARED_SECRET
pelo seu segredo compartilhado .
Após receber os data
, converta-os para o Dictionary
:
DispatchQueue.main.async { if let data = data, let jsonData = try? JSONSerialization.jsonObject(with: data, options: .allowFragments){
Exemplo de recibo descriptografado da App Store
Aqui você pode ver um exemplo de cheque com duas transações em um aplicativo com uma assinatura renovável automaticamente.
Quais são as diferenças entre in_app
e latest_receipt_info
?
latest_receipt_info
contém todas as transações, incluindo renovações de compras renováveis automaticamente. Você deve usar apenas essa matriz.
in_app
contém transações de compras não in_app
e assinaturas não renováveis. A primeira transação da sua assinatura renovável automaticamente também é duplicada aqui. As compras de consumíveis também aparecerão na matriz in_app
, mas desaparecerão quando o desenvolvedor concluir a transação.
Conclusão
Na Apphud, implementamos a validação da App Store verifica aplicativos com assinaturas renováveis automaticamente em um SDK de código aberto conveniente. O Apphud também ajuda a rastrear o status da assinatura, analisar as principais métricas, oferecer descontos automaticamente a usuários não inscritos e muito mais. Se sentir dor ao trabalhar com assinaturas, experimente nossa solução gratuitamente.