EXC_BAD_ACCESS во время теста покупки приложения - PullRequest
22 голосов
/ 22 августа 2011

Выполнение теста для моей покупки в приложении (первый раз, когда я делаю покупки в приложении).Я получаю EXC_BAD_ACCESS в третьей строке этого кода:

    SKPayment *payment = [SKPayment paymentWithProduct:electronicProd];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

Находится под IBAction для кнопки.электронный пакет объявлен в шапке как SKProduct.Бросил несколько NSLogs в productsRequest didReceiveResponse, и когда продукт был запрошен (в viewDidLoad), и они показали, что он правильно выбирает продукт и хранит его в electronicPack.Определяет электронный пакет как [[request.products] objectAtIndex: 0] на странице didReceiveResponse.Так что да.Вот где я, не знаю, что делать.Любая помощь приветствуется.

ОБНОВЛЕНИЕ: ИСПРАВЛЕНО случайно оставлено в коде, который добавляет дополнительного наблюдателя транзакции lol

Ответы [ 7 ]

40 голосов
/ 10 октября 2012

У меня была такая же проблема, мое решение было позвонить

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

при выходе из In-App Store в моем приложении.Может быть, это поможет кому-то в будущем.

26 голосов
/ 14 декабря 2013

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

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

Надеюсь, это поможет!

12 голосов
/ 15 марта 2015

Mr.T ответ - лучшее решение!

В быстром я называю здесь removeTransactionObserver:

deinit {
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
10 голосов
/ 22 августа 2011

Вам нужно сохранить объект, который вы создаете

- (void)viewDidLoad {
   //... stuff
   SKProduct* electronicProduct = //...
   [electronicProduct retain];
   //... otherstuff
}

viewDidLoad упакован системой в пул автоматического выпуска, paymentWithProduct: возвращает объект автоматического выпуска. Когда viewDidLoad завершен, все объекты автоматического освобождения освобождаются, поэтому вы получаете плохой доступ к памяти при попытке доступа к нему позже.

2 голосов
/ 14 марта 2015

У меня была та же ошибка, довольно просто решить.В моем заголовочном файле у меня было объявлено SKProduct:

@property SKProduct *product;

Я просто изменил его на:

@property (retain) SKProduct *product;

, и все работает отлично.Надеюсь, это кому-нибудь поможет.

1 голос
/ 06 апреля 2017

Если вы создаете выделенный класс для 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
    }

    // ...
}
0 голосов
/ 29 августа 2016

У меня такая же проблема, мое решение было позвонить [[SKPaymentQueue defaultQueue] removeTransactionObserver: self];

при завершении транзакции обозревателя магазина / неудачных / завершенных обратных вызовов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...