IOS в покупке приложения - нет продуктов

Я пытаюсь добавить покупку приложения в свое приложение, следуя описанным здесь методам:

Введение в покупки приложений в учебнике iOS 6

Я добавил продукт через itunes connect, у которого есть идентификатор, подобный этому:

com.mycompany.myapp.myproduct1

Идентификатор пакета (указанный в p-списке, а также в хранилище приложений) настраивается следующим образом:

 com.mycompany.myapp

Я использую вспомогательный класс из учебника IAHelper для обработки функциональности покупки (соответствующий код, показанный ниже). Он также имеет подкласс, который по существу используется для добавления идентификатора продукта (ов) в приложении в массив IAHelper идентификаторов продуктов.

Чтобы проверить код, я создал кнопку с надписью "show products", которая вызывает этот метод:

- (IBAction) showProducts {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productsLoaded:) name:kProductsLoadedNotification object:nil];

    Reachability *reach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [reach currentReachabilityStatus];    
    if (netStatus == NotReachable) {        
        NSLog(@"No internet connection!");        
    } else {        
        if ([InAppMyAppAPHelper sharedHelper].products == nil) {


            // here where it calls the helper class method to request the products
            [[InAppMyAppAPHelper sharedHelper] requestProducts];

            self.hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
            _hud.labelText = @"Loading vocabulary...";
            [self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];

        }        
    }

}

Это метод запроса продуктов iTunesConnect, вызывается выше:

- (void)requestProducts {

    self.request = [[[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers] autorelease];
    _request.delegate = self;
    [_request start];

}

(Обратите внимание, что переменные, которым предшествует "_", относятся к действительным переменным с тем же именем, что и подчеркивание для нескольких выражений синтезатора)

Наконец, это метод (в IAHelper), который получает уведомление при получении ответа:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

    NSLog(@"IAHelper, received products results...");   

    self.products = response.products;
    self.request = nil;    

    // Here the loop to list the products received
    for (id product in _products){
        NSLog(@"IAHelper, received product is: %@", product); 
    }


    [[NSNotificationCenter defaultCenter] postNotificationName:kProductsLoadedNotification object:_products];    
}

В приведенном выше примере операторы журнала показывают, что метод вызывается, но цикл для печати полученных продуктов не содержит ничего.

Итак, похоже, что он не находит продукт в iTunes connect. Тем не менее, я создал там продукт, и идентификатор продукта совпадает с идентификатором пакета, а также идентификатором продукта, т.е.

bundle id:  com.mycompany.myapp
product id: com.mycompany.myapp.product1

Я проверил это несколько раз.

Я заметил, что iTunes перечисляет статус рекламного продукта как "готового к отправке". Есть ли еще один шаг, который я должен сделать, чтобы сделать его доступным?

В целом, что я делаю неправильно?

Ответ 1

Я столкнулся с такой же проблемой. Вот несколько шагов, которые нужно переслать/проверить после прочтения этой технической заметки от Apple:

  • Создайте уникальный идентификатор приложения
  • Включить покупку приложения для этого идентификатора приложения
  • Создайте и установите новый профиль обеспечения на вашем устройстве
  • Обновите идентификатор пакета и код подписи в Xcode
  • Убедитесь, что ваши проекты .plist Bundle ID соответствуют вашему идентификатору приложения.
  • Заполните свою договорную, налоговую и банковскую информацию. Вам нужен договор VALID.

Как уже упоминалось официальным документом, существует НЕТ, чтобы отправлять двоичные файлы и не отправлять скриншот покупки в приложении. Я видел много информации о пропущенных событиях в разных блогах.

После проверки, что вы адресовали каждую точку в этом списке, удалите приложение и переустановите его.

В основном я отсутствовал на моей стороне: правильно настроить мой контракт на ios Paid app, и я не устанавливал новый профиль подготовки на своем устройстве. Может быть, это была ваша проблема?

Ответ 2

Получение недействительных продуктов, возвращаемых в productsRequest: didReceiveResponse - хорошо известная проблема. Есть много причин, некоторые из которых приведены в TN2259, особенно в FAQ # 6. Обычно проблема заключается в том, что приложение не направляет себя в песочницу. Часто это происходит потому, что разработчик не выполнил эти 3 вещи: 1) удалить старые сборки приложения (удалить, а не перезаписать) 2) выйти из магазина приложений на устройстве, используя приложение настроек 3) запустите приложение из Xcode на устройстве (а не в симуляторе) и войдите в магазин, используя тестового пользователя, только когда его спросит магазин приложений.

Ответ 3

У меня такая же проблема, пока я тестирую приложение на симуляторе. Попробуйте его в Device и его работе для меня.

Ответ 5

У меня была аналогичная проблема. Я использовал код, который работал в другом приложении для IAP, поэтому он должен был работать, но я получал ошибку идентификатора недопустимого продукта и никаких результатов не получал. Оказалось, что это вопрос времени. Я пытался обработать возвращенные продукты до того, как они были возвращены в приложение, поэтому ошибка прекратила приложение до того, как у продуктов было время для загрузки! Моя логика программы:

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

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

Ответ 6

Ответ для проектов Swift с одинаковой ошибкой:

Моя ошибка была здесь:

//identifiers: [String]
let productIDs = Set(arrayLiteral: identifiers) as Set<NSObject>!
let request = SKProductsRequest(productIdentifiers: productIDs)

Но этот код приведет к ошибке с кодом = 0 сообщение Не удается подключиться к iTunes Store. Посмотрите на тип входных аргументов SKProductsRequest:

SKProductsRequest(productIdentifiers: Set<NSObject>!)

Итак, код выше выглядит законным. Но это не так! Swift Set - проблема, учитывая, что во входном аргументе мы видим Swift Set!

Нашел ответ, итерации некоторых уроков IAP. Вот рабочий код:

let productIDs = NSSet(array: identifiers)
let request = SKProductsRequest(productIdentifiers: productIDs as! Set<NSObject>)

Теперь вы должны использовать NSSet, хотя Swift Set уже доступен и устанавливается как тип входных аргументов! Похож на ошибку для меня, я убью ошибку.

Ответ 7

Мы застряли с той же проблемой, пытаясь запустить ее на симуляторе.

После того, как вы попробуете его на реальном устройстве Apple TV (подключенном через USB), мы начали получать действительные идентификаторы продуктов.

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

Ответ 8

Думаю, что я нашел ответ здесь.

Эта формулировка с веб-страницы покупки в приложении привела меня к этому:

The first In-App Purchase for an app must be submitted for review at the same time that you submit an app version. You must do this on the Version Details page. Once your binary has been uploaded and your first In-App Purchase has been submitted for review, additional In-App Purchases can be submitted using the table below.

Что вы можете сделать, чтобы обойти catch-22, не желая отправлять приложение для просмотра, когда вы не протестировали код покупки в приложении, это отправить его на проверку, а затем немедленно отклонить его самостоятельно, Это дает ему статус "отвергнутого разработчика".

Чем вы можете добавить свой продукт, согласно блогу,

After saving the product, just choose the "Submit with app binary" option. This will tie the product to the app binary, so when you finally submit the 100% complete app binary, the product will be submitted as well.