基本上,我尝试在测试应用程序中设置应用程序购买,然后再将其应用到我公司正在开发的应用程序中.我已经阅读了商店套件pdf和其他片段大约1000次,但产品仍然是空的.这正是我到目前为止所做的:
设置测试应用程序和In App Purchase测试项目
我在iPhone开发人员中心的公司开发人员门户上为"Test App One"创建了一个新的应用程序ID.我确保前缀是com.mycompany.testappone确保可以配置应用内购买.保持应用ID部分,我通过勾选"启用应用内购买"选项配置应用购买.
我在iTunes Connect中创建了"Test App One",并完成了常规程序,但选择了"稍后上传二进制文件"并且没有提交审核,因为该应用程序什么都不做.当然,我们不必提交应用程序来审查这个工作?!然后,我点击管理应用内购买并创建一个新产品ID为"test1"并批准它以便清除销售.
代码
我在XCode中设置了一个新项目TestAppOne,这里是我现在使用的唯一两个类:
TestAppOneAppDelegate.h:
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface TestAppOneAppDelegate : NSObject <UIApplicationDelegate, SKRequestDelegate, SKProductsRequestDelegate> {
UIWindow *window;
}
Run Code Online (Sandbox Code Playgroud)
TestAppOneDelegate.m:
#import "TestAppOneAppDelegate.h"
static NSString *kMyFeatureIdentifier1 = @"com.mycompany.testappone.test1";
@implementation TestAppOneAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
if([SKPaymentQueue canMakePayments]) {
NSLog(@"IN-APP:can make payments");
}
else {
NSLog(@"IN-APP:can't make payments");
}
[self requestProductData];
[window makeKeyAndVisible];
}
- (void)requestProductData {
NSLog(@"IN-APP:requestProductData");
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMyFeatureIdentifier1]];
request.delegate …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试将IAP添加到现有应用程序中.为此,我添加了一些产品并创建了一些测试用户.这些产品是定期订阅.我正在测试的设备是带有iOS 5.1的iPhone 4S.
我可以成功地在商店中查询我的产品,并成功购买了我的新测试用户.我遇到的问题是,如果我尝试从商店设置应用程序管理我的订阅,它会强制我通过告诉我"此帐户尚未用于在AppStore中购买任何内容来审核我的帐户,请检查您的帐户并继续".如果我查看该帐户,它将不会让我继续提供信用卡信息.
最终结果是我永远无法取消我的测试订阅.我删除了测试用户并创建了新用户,删除了应用程序并重新安装了它,杀死了StoreApp和设置应用程序,重新启动了设备,在购买之前通过电子邮件验证了帐户,在购买之前没有通过电子邮件验证帐户...所有排列似乎失败了.
有时我会两次购买相同的订阅,这会促使StoreKit要求我管理我的订阅设置.有时这会导致之前的"帐户审核"过程,有时会导致"无法连接到iTunes Store"的警报.
我已经完成了如何继续的想法.
编辑 - 这是我创建的任何iTunesConnect测试用户的事件流
初步认购

使用现有ID

测试帐户登录

管理订阅

AppStore登录

无法连接到AppStore

检查您的帐户

然后,审查过程迫使我输入CreditCard Info,即使它的地址为"1 Infinite Loop Cupertino,CA"(即它知道这是一个测试帐户).
我一直在玩应用程序购买几天,一切正常,直到我尝试通过应用程序商店验证收据,因为我经常回到无效状态.
我将收据数据传递给我的PHP服务器,然后从那里转发到应用商店,一旦得到有效的响应,我打算将收据数据添加到我的数据库.
商店套件编程指南和类引用对于这个特定区域来说并不是没用,因为它们并没有真正给你任何类型的例子,我确实找到了一篇有用的文章,它帮了我一点但有些东西仍然是错误的.
基本上我想知道是否有工作收据验证的人愿意分享他们的代码,因为我无处可去.
谢谢
希望标题是不言自明的.我正在尝试做这样的事情:
checkIfUserIsSubscribedToProduct(productID, transactionID: "some-unique-transaction-string", completion: { error, status in
if error == nil {
if status == .Subscribed {
// do something fun
}
}
}
Run Code Online (Sandbox Code Playgroud)
做了类似我提供的假设代码吗?我觉得我正在服用疯狂的药片
编辑
在类似的问题中,我一直看到一个通用的答案"哦,你必须验证收据"但没有解释如何,甚至收据是什么.有人可以向我提供如何"验证收据"吗?我试过这个教程,但似乎没有用.
编辑 - 为赏金
请解决以下情况:用户订阅我的自动续订订阅并因此获得更多数字内容 - 很酷,实施.但是,如何在每次打开应用程序时检查该订阅是否仍然有效(即他们没有取消订阅)?检查这个的最简单的解决方案是什么?有没有像我在问题中提供的假设代码?请引导我完成此操作并提供有关该主题的任何进一步详细信息.
我正在尝试在沙箱环境中测试In App Purchase.
为了测试代码,我做了以下事情:
在iTunes Connect中的"管理用户"下创建了一个应用内购买测试用户帐户
在"管理您的应用内购买"下创建了一些应用内购买产品.我使用了产品ID的数值和字母数字值.
将应用程序加载到iPhone上,转到设置 - >存储并退出常规存储并进入步骤1中创建的测试帐户
在(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
回调中)设置断点
所有提交的产品ID都在response.invalidProductIdentifiers酒店内.提交请求时,我首先尝试了在步骤2中创建的确切产品ID.我还尝试使用Bundle ID为它们添加前缀:
NSString *id2 = @"com.super.duper.8";
NSSet *productList = [NSSet setWithObjects:id2, @"8", nil];
SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:productList];
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗 任何帮助表示赞赏.
阿希姆
关于iOS自动续订订阅,我有以下问题
a)自动续订订阅是否真的在沙箱环境中自动续订?问题似乎是订阅不会自动更新,尽管文档说即使在沙盒环境中它也应该发生6次.
b)我们是否需要调用restoreCompletedTransactions来获取自动扩展订阅的新收据,或者是-paymentQueue:updatedTransactions:iOS自动调用的方法?(我猜它会自动调用'启动'和'旋转出背景'不确定)
c)您如何在多个设备上处理相同的订阅?这可以通过restoreCompletedTransactions来处理,但是调用它会提示用户输入密码,因此每次启动应用程序时调用它都不是很方便.
所以我为我的应用设置了一个可自动更新的订阅,期限为1个月,相当于沙盒中的5分钟左右.在我订阅的客户端应用程序中,将收据发送到我的服务器,它得到验证,我在我的数据库中记录了该用户订阅的记录.
我的问题是如何检查此订阅是否已续订?我已经阅读了文档,无法弄清楚我应该怎么做.
这是我到目前为止的地方:
0,非常好.我也得到了latest_receipt,我用我最早的收据替换了我的数据库.latest_receipt,我获得状态21006(已过期的收据),并且: { receipt:
{ original_purchase_date_pst: '2013-08-06 11:58:04 America/Los_Angeles',
unique_identifier: '------------',
original_transaction_id: '----------',
expires_date: '1376129825000',
transaction_id: '------------',
quantity: '1',
product_id: 'subscription',
item_id: '--------',
bid: 'com.--------',
unique_vendor_identifier: '---------',
web_order_line_item_id: '---------',
bvrs: '2.0',
expires_date_formatted: '2013-08-10 10:17:05 Etc/GMT',
purchase_date: '2013-08-10 10:12:05 Etc/GMT',
purchase_date_ms: '1376129525000',
expires_date_formatted_pst: '2013-08-10 03:17:05 America/Los_Angeles',
purchase_date_pst: '2013-08-10 03:12:05 America/Los_Angeles',
original_purchase_date: '2013-08-06 18:58:04 Etc/GMT',
original_purchase_date_ms: '1375815484000' },
latest_expired_receipt_info:
{ original_purchase_date_pst: '2013-08-06 11:58:04 America/Los_Angeles',
unique_identifier: '-------',
original_transaction_id: '-',
expires_date: '1376129825000',
transaction_id: …Run Code Online (Sandbox Code Playgroud) 我的应用内购买工作得很好,我正在进行服务器验证路线.服务器需要知道我是否在沙盒中,所以现在我只是发送一个"&sandbox = 1"参数.当然,当应用程序的完整版本出来时,我将不会发送此参数.
我宁愿不在我的应用程序中使用这个硬编码,因为这将使测试在将来变得困难,并且在向Apple提交构建之前记住更改是一件大事.
有没有办法我可以问StoreKit我是否在沙盒中,这样我就可以确定是否需要将此参数发送到我的服务器?或者,是否有其他最佳实践来处理服务器验证?
考虑到这一点,我应该首先让服务器先检查实时系统,然后再检查沙箱?如果在实时和沙箱系统之间隔离苹果ID,那么它不会造成任何伤害吗?
谢谢.
我正在iOS 7上实施Apple的"Grand统一收据",允许该应用程序在本地检查应用程序的购买收据,而无需联系Apple的服务器进行验证和验证.如果用户在应用程序中存储了收据,则此方法很有用.如果应用程序缺少收据,最佳做法是请求应用程序刷新收据,如下:
SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init];
[request setDelegate:self];
[request start];
Run Code Online (Sandbox Code Playgroud)
问题是调用此代码将要求用户使用他或她的Apple ID登录.如果这种情况一直发生,或者只有当用户的应用程序商店登录超时时,我并不是100%确定.除非确实有必要,否则我不想向用户显示Apple ID登录屏幕 - 我不希望人们担心他们会被错误地收费.我想显示一个显示屏,告诉用户为什么会要求他们提供Apple ID密码,但前提是他们确实需要输入密码.如果他们不需要输入密码,我希望它是一个无缝且隐藏的过程.什么是最好的方法?我认为最好的方法是检查用户是否需要登录应用程序商店,但我不确定这是否可行.
是否有一种简单的方法可以在swift中为单个产品实施应用内购买?
我想要一个触发应用内购买的按钮,例如[广告删除]或[解锁高级内容]
我无法理解它的全部逻辑.
我正在尝试从[Techotopia] http://www.techotopia.com/index.php/An_iOS_7_In-App_Purchase_Tutorial关注和翻译本教程
但这是我第一次使用StoreKit Framework,还有Swift.
我只是想知道使用Swift StoreKit Framework的应用程序内购买交易的逻辑.
谢谢!