这是“In app purchases with MKStoreKit failing: “Problem in iTunes connect configuration for product: xxx”
的后续问题我遇到了类似的问题,并尝试使用和不使用MKStoreKit进行操作并获得类似的信息。
检查列表
感谢:http://troybrant.net/blog/2010/01/invalid-product-ids/
您是否为应用ID启用了应用内购买?
YES
您是否已检查过产品的已售出商品?
YES
您是否已提交(并可选择拒绝)您的应用程序二进制文件?
YES
您项目的.plist捆绑ID是否与您的应用ID相匹配?
YES
您是否为新的App ID生成并安装了新的配置文件?
YES
您是否已使用此新配置文件将项目配置为代码签名?
YES
您是否正在为iPhone OS 3.0或更高版本构建?
YES。 iOS4.2及更高版本。
您在制作SKProductRequest时是否使用完整的产品ID?
YES。也只是没有反向域的产品ID本身
您将产品添加到iTunes Connect后等了几个小时?
YES。它说“等待审查”并且已经完成了过去的4-5天
您的银行详细信息是否在iTunes Connect上有效?
NO。这是一个客户端项目,我只是在测试它是否正常工作。我是否需要银行详细信息进行测试?
编辑:我现在改变了。但我不明白为什么我只是为了测试沙盒而需要这样做。您是否尝试从设备中删除该应用并重新安装?
YES
您的设备是否已越狱?
NO
应用表示法正确
我见过的一些例子使用了这种表示法: com.domain.APP_ID.PRODUCT_TO_BUY
但其他人使用 com.domain.PRODUCT_TO_BUY
哪个是对的?
在我的代码中,我尝试使用完整的表示法和产品ID本身,但仍然遇到“无效的产品ID”的相同问题。
开发者被拒绝
App Bundle(发布)在iTunes Connect上,我让“开发者拒绝”该捆绑包。
照片:
等待审核?
在我的应用内购买中,我有1个产品,可自动续订。它被清除出售;然而,它是“等待审查”并且不是绿灯。
照片:
我差不多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];
}
编辑:
作为一个故障保险,我已添加银行详细信息以防万一,但我不明白为什么这会导致问题。
我还确保上传并拒绝了应用发布包,而不是adhoc;虽然我不知道这是否有所不同。
答案 0 :(得分:11)
经过2天的等待,新的应用程序ID,个人资料等已经为我修好了..
为什么文档会说使用完整的com.iap.isrubbish语法?
感谢您的帮助
我换了:
定义kMySubscriptionFeature @“uk.co.somesite.someapp.sub1”
使用:
定义kMySubscriptionFeature @“sub1”
答案 1 :(得分:6)
我想我现在已经完成了。我要做一些测试只是为了确保。
这还不会被接受;我正在使用不同的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
这就是我的所作所为。
我添加了银行详细信息。我仍然不认为这与它有任何关系。
请注意。该应用程序的应用内购买仍然是“等待审核”,我得到了上述输出。
我换了:
#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
答案 2 :(得分:1)
我刚刚发现我在创建应用内购买时交换了产品ID和引用名称,所以在我的情况下,我使用了错误的字符串来尝试找到产品......难以发现。
答案 3 :(得分:1)
我在app-purchase中测试了我现有的功能完备的应用程序的最新版本,以确保功能仍然按预期工作,当我开始看到iTunes连接消息中的问题时。我的问题是(我忘了)MKStoreKit在我的各种设备的钥匙串上存储了购买的事实,所以即使我使用的是新用户帐户,我的钥匙串也在注册已购买的设备。 [self removeAllKeychainData]从MKStoreManager中修复了麻烦。 希望这可以让某些人感到沮丧。
答案 4 :(得分:0)
我的问题是,我使用真正的苹果ID登录了设备。然后退出(Iphone-&gt;设置 - &gt; App Store - &gt;我的ID-&gt;退出) 然后再次部署,并继续工作。
感谢大家在网上。