Как предоставить пользователям бесплатные покупки в приложениях и как узнать, какие пользователи уже загрузили приложение? [Дубликат]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

28
задан rmaddy 15 October 2013 в 23:01
поделиться

7 ответов

Не было бы проще просто предложить бесплатную покупку inapp при запуске в платном приложении. Кнопка с надписью «Обновление». А затем переключите этот бесплатный анапп на оплату следующего обновления?

-1
ответ дан Jason Mirk 24 August 2018 в 06:41
поделиться

В itunes connect вы можете создавать коды продвижения для покупок приложений. Вы можете создать элемент IAP для премиум-функций и предоставить его в качестве поощрения для покупателей вручную. Хотя это не автоматическое решение, это может спасти вас от головной боли.

-2
ответ дан mtozsahin 24 August 2018 в 06:41
поделиться

Единственный вариант - выпустить два обновления. Первый напишет значение NSUserDefaults, идентифицирующее их как покупателя. Второе обновление - это поддерживаемая рекламой версия, которая может прочитать это значение для идентификации покупателя и скрыть рекламу.

-2
ответ дан neilco 24 August 2018 в 06:41
поделиться

попробуйте получить все квитанцию ​​& amp; проанализируйте их следующими данными:

"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. Получите все квитанции пользователя из магазина приложений

+ (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. Каждая квитанция будет содержать словарь:

    "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 24 August 2018 в 06:41
поделиться

Начиная с iOS 7, это можно сделать, используя правильную проверку чека. В iOS 7 вы можете получить квитанцию ​​для купленного приложения. Часть данных в квитанции содержит информацию об исходной версии покупки приложения пользователем. Вы можете посмотреть эту версию, и если она находится до освобождения вашего обновления, чтобы освободить его с помощью IAP, вы можете предоставить пользователю полную функциональность без необходимости повторного приобретения обновления.

Конечно, если вы хотите, чтобы ваше обновленное приложение работало под iOS 6, это не вариант.

Подробнее о проверке получения см. в Руководство по проверке чеков .

62
ответ дан rmaddy 24 August 2018 в 06:41
поделиться

Не совсем, нет. Лучшее, что вы можете сделать, это опубликовать обновление, в то время как оно все еще является платным приложением, которое записывает некоторое значение в NSUserDefaults (или файл в каталоге данных приложения, не имеет значения, какой) указывает, что он был куплен. Подождите неделю или сколько угодно времени, затем опубликуйте обновление, которое удалит этот код, приуроченный к выпуску в тот же день, когда цена будет изменена на бесплатную.

-4
ответ дан RyanR 24 August 2018 в 06:41
поделиться

Если ваше текущее приложение имеет какие-либо данные в настройках пользователя или цепочке ключей, то это может быть индикатором. Когда приложение сначала открывается (в вашей новой версии), запустите немного кода, который:

  1. Проверяет данные по умолчанию / keychain
  2. . Если найдено, включите оплаченный content / disable ads
  3. Перенесите эти данные на новый ключ (чтобы вы не обновлялись снова и не раздавали бесплатные материалы)
1
ответ дан Wain 24 August 2018 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: