Устранена проблема с неверным идентификатором продукта при покупках из приложения? - PullRequest
18 голосов
/ 27 октября 2011

Это следующий вопрос к " При сбое покупки приложений с помощью MKStoreKit:« Проблема в конфигурации iTunes connect для продукта: xxx"

У меня похожая проблема, и я пытался сделать как с MKStoreKit, так и без него и получить похожее сообщение.

Контрольный список

С благодаря: http://troybrant.net/blog/2010/01/invalid-product-ids/

Включили ли вы внутриигровые покупки для своего идентификатора приложения?

YES

Вы проверили разрешение на продажу для вашего продукта?

YES

Вы подали (и при желании отклонили) двоичный файл вашего приложения?

YES

Идентификатор пакета .plist вашего проекта совпадает с идентификатором вашего приложения?

YES

Вы создали и установили новый профиль обеспечения для нового идентификатора приложения?

YES

Вы сконфигурировали свой проект для кодовой подписи с использованием этого нового профиля обеспечения?

YES

Вы строите для iPhone OS 3.0 или выше?

YES. iOS4.2 и выше.

Используете ли вы полный идентификатор продукта при оформлении запроса SKProductRequest?

YES. Также только сам идентификатор продукта без обратного домена

Вы ожидали несколько часов с момента добавления продукта в iTunes Connect?

YES. В нем написано «В ожидании обзора» и сделал за последние 4-5 дней

Активны ли ваши банковские реквизиты в iTunes Connect?

NO. Это клиентский проект, и я только проверяю, работает ли он. Нужны ли банковские реквизиты для проверки?

РЕДАКТИРОВАТЬ: Я изменил это сейчас. Но я не понимаю, почему мне нужно это делать только для проверки песочницы.

Вы пытались удалить приложение с вашего устройства и переустановить?

* * ДА тысяча семьдесят-девять

Является ли ваше устройство взломанным?

NO


Обозначение приложения правильное

Некоторые примеры, которые я видел, используют эту запись: com.domain.APP_ID.PRODUCT_TO_BUY

Но другие используют com.domain.PRODUCT_TO_BUY

Что правильно?

В своем коде я попытался использовать полную нотацию и только сам идентификатор продукта, но все еще получаю ту же проблему «Неверный идентификатор продукта».

Разработчик отклонен

Пакет приложений (релиз) находится в iTunes Connect, и я "разработчик отклонил" пакет.

Изображение: App developer rejected

В ожидании обзора?

В моих покупках из приложения у меня есть 1 продукт, автоматически обновляемая подписка. Очищено для продажи; однако он «ожидает рассмотрения» и не горит зеленым светом.

Фото:

waiting for review

Я создал это почти 4-5 дней назад, и он все еще помечен как "Ожидание обзора" ??

Мне интересно, было ли мое приложение "отклонено разработчиком", влияет ли это на "Ожидание проверки" в автоматически обновляемой подписке?

Я ничего не изменил в этом предмете.

Согласно различным статьям, мне нужно подождать 24-48 часов, прежде чем я смогу его использовать?

Но нужно ли ждать, пока это будет принято или подсвечено зеленым, прежде чем я смогу использовать его в своем тестировании?

Банковские реквизиты

Я не заполнил банковские реквизиты, потому что это приложение для клиента. Нужно ли мне заполнять банковские реквизиты, прежде чем я смогу продолжить их тестирование?

Согласно этим документам: http://developer.apple.com/library/ios/#technotes/tn2259/_index.html требуются банковские реквизиты?

Нужно ли входить в iTunes на моем устройстве под тестовой учетной записью перед запуском приложения?

Мне интересно, может ли кто-нибудь прояснить эти вопросы? Может быть, это так же просто, как ждать, пока покупка в приложении станет «зеленой», или, может быть, я пропустил шаг?

Примечание. Это происходит независимо от того, использую ли я MKStoreKit или следующий код.

Спасибо.

Мой код (это не версия MKStoreKit)

#define kMySubscriptionFeature @"uk.co.samplewebsite.myappproject.sub1"

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.title = @"Manage Subscriptions";


    if ([SKPaymentQueue canMakePayments])
    {
        // Display a store to the user.

        //[MKStoreManager sharedManager];
        //NSLog(@"purhcasable = %@", [[MKStoreManager sharedManager] purchasableObjectsDescription] );
        [self requestProUpgradeProductData];

    }
    else
    {
        // Warn the user that purchases are disabled.
        NSString *message = @"In-app purchases are disabled. Please review your settings";
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    } // end if
}


#pragma mark - StoreKit Delegate

- (void) requestProductData
{
    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMySubscriptionFeature]];
    request.delegate = self;
    [request start];
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSArray *myProduct = [[NSArray alloc] initWithArray:response.products];

    for(SKProduct *item in myProduct)
    {

        NSLog(@"Product title: %@" , item.localizedTitle);
        NSLog(@"Product description: %@" , item.localizedDescription);
        NSLog(@"Product price: %@" , item.price);
        NSLog(@"Product id: %@" , item.productIdentifier);
    }


    for (NSString *invalidProductId in response.invalidProductIdentifiers)
    {
        NSLog(@"Problem in iTunes connect configuration for product: %@" , invalidProductId);
    }


    [myProduct release];

    // populate UI
    [request autorelease];
}

Edit:

Как отказоустойчивый, я добавил банковские реквизиты на всякий случай, но я не понимаю, почему это может вызвать проблемы.

Я также удостоверился, что загрузил и отклонил пакет выпуска приложения, а не adhoc; хотя я не знаю, имеет ли это какое-то значение.

Ответы [ 5 ]

11 голосов
/ 26 ноября 2012

После 2 дней ожидания, новых идентификаторов приложений, профилей и т. Д. Это исправило это для меня ..

Почему в документах говорится, что используется полный синтаксис com.iap.isrubbish?

Спасибо за вашу помощь

Я заменил:

определение kMySubscriptionFeature @ "uk.co.somesite.someapp.sub1"

с:

define kMySubscriptionFeature @ "sub1"

6 голосов
/ 27 октября 2011

Я думаю, что сделал это сейчас.Я собираюсь провести несколько тестов, просто чтобы убедиться.

Это пока не будет принято;Я провожу некоторые тесты с различными средами storekit.

Мой вывод:

2011-10-27 15:17:49.297 My Simple App[7376:707] productsRequest
2011-10-27 15:17:49.298 My Simple App[7376:707] Product title: Simple subscription
2011-10-27 15:17:49.299 My Simple App[7376:707] Product description: Subscribe and get the latest content to your iPhone or iPod Touch device
2011-10-27 15:17:49.299 My Simple App[7376:707] Product price: 2.99
2011-10-27 15:17:49.300 My Simple App[7376:707] Product id: sub1

Вот что я сделал.

  1. Я добавил свои банковские реквизиты,Я до сих пор не думаю, что это как-то связано с этим.

  2. Примечание.Покупка приложения в приложении все еще "Ожидание обзора", и я получил вышеуказанный вывод.

  3. Я заменил:

    #define kMySubscriptionFeature @"uk.co.somesite.someapp.sub1"

с:

#define kMySubscriptionFeature @"sub1"

Я собираюсь запустить несколько тестов с MKStoreKit и другими фреймворками, чтобы проверить, все ли в порядке.

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

.h файл

//  ManageSubscriptionsVC.h
//  This doesn't have visual output, just NSLog at the moment
//  This doesn't use MKStoreKit yet

#import <UIKit/UIKit.h>
#import "StoreKit/StoreKit.h"

#define kMySubscriptionFeature @"sub1"

/*
 Shared Secret

 A shared secret is a unique code that you should use when you make the 
 call to our servers for your In-App Purchase receipts. 
 Without a shared secret, you will not be able to test auto-renewable 
 In-App Purchase subscriptions in the sandbox mode. 

 Also note that you will not be able to make them available 
 on the App Store.

 Note: Regardless of what app they are associated with, 
 all of your auto-renewable subscriptions will use this 
 same shared secret.
 */
#define sharedSecret @"PUTSHAREDSECRETHERE"


@interface ManageSubscriptionsVC : UIViewController
<SKProductsRequestDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver>
{
    SKProduct *proUpgradeProduct;
    SKProductsRequest *productsRequest;
}

- (void)requestProUpgradeProductData;

@end

.m файл

//
//  ManageSubscriptionsVC.m

#import "ManageSubscriptionsVC.h"

@implementation ManageSubscriptionsVC

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.title = @"Manage Subscriptions";


    if ([SKPaymentQueue canMakePayments])
    {
        // Display a store to the user.

        //[MKStoreManager sharedManager];
        //NSLog(@"purhcasable = %@", [[MKStoreManager sharedManager] purchasableObjectsDescription] );
        [self requestProUpgradeProductData];

    }
    else
    {
        // Warn the user that purchases are disabled.
        NSString *message = @"In-app purchases are disabled. Please review your settings";
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    } // end if
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - StoreKit Delegate

- (void) requestProductData
{
    NSLog(@"requestProductData");
    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMySubscriptionFeature]];
    request.delegate = self;
    [request start];
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSLog(@"productsRequest");

    NSArray *myProduct = [[NSArray alloc] initWithArray:response.products];

    for(SKProduct *item in myProduct)
    {

        NSLog(@"Product title: %@" , item.localizedTitle);
        NSLog(@"Product description: %@" , item.localizedDescription);
        NSLog(@"Product price: %@" , item.price);
        NSLog(@"Product id: %@" , item.productIdentifier);


    }

    /*
    for(NSString *invalidProduct in response.invalidProductIdentifiers)
        NSLog(@"Problem in iTunes connect configuration for product: %@", invalidProduct);
    */

    for (NSString *invalidProductId in response.invalidProductIdentifiers)
    {
        NSLog(@"Problem in iTunes connect configuration for product: %@" , invalidProductId);
    }


    [myProduct release];

    // populate UI
    [request autorelease];
}

#pragma mark - PaymentQueue

-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
}

-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
}

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
}

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
}

#pragma mark - Other


- (void)requestProUpgradeProductData
{
    NSSet *productIdentifiers = [NSSet setWithObject:kMySubscriptionFeature];
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];

    // we will release the request object in the delegate callback
}





@end
1 голос
/ 01 мая 2013

Я тестировал новейшую версию моего существующего, полнофункционального приложения при покупке приложения, чтобы убедиться, что его функциональность все еще работает, как и ожидалось, когда я начал видеть проблемы в сообщении iTunes connect.Моя проблема была (я забыл), что MKStoreKit хранил факт покупки на цепочке для ключей моих различных устройств, поэтому, хотя я использовал новую учетную запись пользователя, моя цепочка для ключей регистрировала устройство как уже купленное.[self removeAllKeychainData] из MKStoreManager устранило проблему.Надеюсь, это спасет кого-то от разочарования.

1 голос
/ 31 января 2013

Я только что узнал, что поменял идентификатор продукта и ссылочное имя при создании покупки в приложении, поэтому в моем случае я использовал неправильную строку, чтобы попытаться найти Продукт ... Трудно определить. *

0 голосов
/ 25 октября 2016

Моя проблема была в том, что я вошел в систему на устройстве, используя реальный идентификатор Apple. Затем вышел (Iphone-> Настройки -> Магазин приложений -> Мой ID-> Выйти) Затем снова развернули, и ура это сработало.

Спасибо всем в сети.

...