为我的应用内购买运行测试(第一次在应用内购买)。我在这段代码的第三行得到了EXC_BAD_ACCESS:
SKPayment *payment = [SKPayment paymentWithProduct:electronicProd];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
这是一个按钮的IBAction。 electronicPack在标题中声明为SKProduct。在productsRequest didReceiveResponse中抛出了一些NSLog,当请求产品时(在viewDidLoad中),他们表明它正确地获取产品并将其存储在electronicPack中。在didReceiveResponse页面中将electronicPack定义为[[request.products] objectAtIndex:0]。所以是的。多数民众赞成在哪里,不知道该怎么做。任何帮助表示赞赏。
UPDATE:FIXED意外地留在了添加额外事务观察者的代码中lol
答案 0 :(得分:40)
我遇到了同样的问题,我的解决方案是打电话
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
将应用程序商店留在我的应用程序中。 也许它会在将来帮助某人。
答案 1 :(得分:26)
似乎问题是在删除前一个之前尝试添加事务观察器。将以下内容添加到控制器以解决此问题:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
希望这有帮助!
答案 2 :(得分:12)
Mr.T回答是最好的解决方案!
在swift中,我在这里调用removeTransactionObserver:
deinit {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
答案 3 :(得分:10)
您需要保留您正在创建的对象
- (void)viewDidLoad {
//... stuff
SKProduct* electronicProduct = //...
[electronicProduct retain];
//... otherstuff
}
viewDidLoad由系统在自动释放池中包装,paymentWithProduct:返回一个autorelease对象。完成viewDidLoad后,将释放所有自动释放对象,这就是为什么在以后尝试访问时会出现内存访问不良的原因。
答案 4 :(得分:2)
我有同样的错误,真的很难解决。在我的头文件中,我声明了SKProduct:
@property SKProduct *product;
我刚将其改为:
@property (retain) SKProduct *product;
一切正常。 希望这有助于某人。
答案 5 :(得分:1)
如果您要为SKPaymentTransactionObserver
创建专用课程,请不要忘记必须保留该课程。
我在意识到这一点之前得到了错误,这是AppDelegate
中的一个例子:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var myTransactionObserver: MyTransactionObserver!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// don't
let myTransactionObserver = MyTransactionObserver()
// do
myTransactionObserver = MyTransactionObserver()
SKPaymentQueue.default().add(myTransactionObserver)
return true
}
// ...
}
答案 6 :(得分:0)
我有同样的问题,我的解决方案是打电话 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
关于商店观察员交易完成/失败/完成回调