web-dev-qa-db-fra.com

Modifier l'application payante en gratuite, mais savoir si l'utilisateur l'a déjà achetée

J'envisage de modifier gratuitement mon application iOS payée afin de la rendre ad based et de disposer d'une option in-app purchase pour supprimer les annonces.

Cela semble être une bonne idée si je venais de lancer l'application, mais nous avons plus de 30 000 téléchargements payants, et je ne veux pas que ces utilisateurs voient les annonces lorsqu'ils mettent à jour leur nouvelle version, qui est gratuite.

Ai-je des options ici?

31
Nic Hubbard

Depuis iOS 7, cela peut être fait en utilisant une validation de réception appropriée. Sous iOS 7, vous pouvez obtenir un reçu pour l'application achetée. Une partie des données du reçu comprend des informations sur la version d'achat originale de l'application par l'utilisateur. Vous pouvez consulter cette version et, si celle-ci date d'avant la publication de votre mise à jour gratuitement avec IAP, vous pouvez choisir de donner à l'utilisateur toutes les fonctionnalités sans que l'utilisateur ait besoin de racheter la mise à niveau.

Bien sûr, si vous souhaitez que votre application mise à jour fonctionne sous iOS 6, ce n'est pas une option.

Reportez-vous au Guide de programmation de la validation du reçu pour plus de détails sur la validation du reçu.

65
rmaddy

Si votre application actuelle contient des données dans les valeurs par défaut de l'utilisateur ou dans le trousseau, cela peut être l'indicateur. Lorsque l'application est ouverte pour la première fois (dans votre nouvelle version), exécutez un morceau de code qui:

  1. Vérifie les données dans les valeurs par défaut/le trousseau
  2. Si trouvé, activer le contenu payant/désactiver les annonces
  3. Migrez ces données vers une nouvelle clé (pour ne pas mettre à jour/donner des trucs gratuits)
1
Wain

essayez de récupérer tous les reçus et de les analyser en utilisant les données suivantes:

"expires_date" = "2017-09-24 11:25:19 Etc/GMT";
"original_purchase_date" = "2017-09-24 11:20:21 Etc/GMT";
"product_id" = "com.yourapp.service";

1. Obtenez tous les reçus de l'utilisateur sur l'App Store

+ (NSArray*)all_receipts{
    // Load the receipt from the app bundle.
    NSURL *receiptURL = [[NSBundle mainBundle]appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
    if(!receipt){
        //no receipts yet...
        return nil;     
    }

    NSError *error;
    NSDictionary *requestContents = @{@"receipt-data": [receipt base64EncodedStringWithOptions:0],
                                      @"password":YOUR_SECRED_SHARED};
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                          options:0
                                                            error:&error];
    if (!requestData) {
        return [NSArray array];
    }

    // Create a POST request with the receipt data.
    //get current qa / production url
    BOOL sandbox = [[receiptURL lastPathComponent]isEqualToString:@"sandboxReceipt"];
    NSURL *storeURL = [NSURL URLWithString:@"https://buy.iTunes.Apple.com/verifyReceipt"];
    if (sandbox) {
        storeURL = [NSURL URLWithString:@"https://sandbox.iTunes.Apple.com/verifyReceipt"];
    }
    NSDictionary *jsonResponse = [LTServer postUrl:storeURL.absoluteString attach:requestContents];
    NSLog(@"jsonResponse %@",jsonResponse);
    if(!jsonResponse){
        return [NSArray array];
    }
    NSArray *receipts_data = jsonResponse[@"latest_receipt_info"];
    return [receipts_data mutableCopy];
}

2. Chaque reçu contiendra un dictionnaire:

    "expires_date" = "2017-09-24 11:25:19 Etc/GMT";
    "expires_date_ms" = 1506252319000;
    "expires_date_pst" = "2017-09-24 04:25:19 America/Los_Angeles";
    "is_trial_period" = true;
    "original_purchase_date" = "2017-09-24 11:20:21 Etc/GMT";
    "original_purchase_date_ms" = 1506252021000;
    "original_purchase_date_pst" = "2017-09-24 04:20:21 America/Los_Angeles";
    "original_transaction_id" = 1000000339209266;
    "product_id" = "com.yourapp.service";
    "purchase_date" = "2017-09-24 11:20:19 Etc/GMT";
    "purchase_date_ms" = 1506252419000;
    "purchase_date_pst" = "2016-11-27 04:20:19 America/Los_Angeles";
    quantity = 1;
    "transaction_id" = 1000000337203266;
    "web_order_line_item_id" = 1000000030161297;
0
Ofir Malachi