Skip to content

Commit

Permalink
fix AppleStoreInAppPurchaseService
Browse files Browse the repository at this point in the history
  • Loading branch information
irov committed May 20, 2024
1 parent a555013 commit c5ee861
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ namespace Mengine
{
public:
virtual AppleStoreInAppPurchaseProductInterfacePtr makeProduct( SKProduct * _skProduct ) = 0;
virtual AppleStoreInAppPurchasePaymentTransactionInterfacePtr makePaymentTransaction( SKPaymentTransaction * _transaction ) = 0;

virtual AppleStoreInAppPurchasePaymentTransactionInterfacePtr makePaymentTransaction( SKPaymentTransaction * _skPaymentTransaction, SKPaymentQueue * _skPaymentQueue ) = 0;
};
//////////////////////////////////////////////////////////////////////////
typedef IntrusivePtr<AppleStoreInAppPurchaseFactoryInterface> AppleStoreInAppPurchaseFactoryInterfacePtr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ - (BOOL)paymentQueue:(SKPaymentQueue *)paymentQueue shouldContinueTransaction:(S

Mengine::AppleStoreInAppPurchasePaymentQueueProviderInterfacePtr copy_provider = m_service->getPaymentQueueProvider();

Mengine::AppleStoreInAppPurchasePaymentTransactionInterfacePtr paymentTransaction = m_factory->makePaymentTransaction( transaction );
Mengine::AppleStoreInAppPurchasePaymentTransactionInterfacePtr paymentTransaction = m_factory->makePaymentTransaction( transaction, paymentQueue );

Mengine::Helper::dispatchMainThreadEvent([copy_provider, paymentTransaction]() {
copy_provider->onPaymentQueueShouldContinueTransaction( paymentTransaction );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ namespace Mengine
void setSKPaymentTransaction( SKPaymentTransaction * _skPaymentTransaction );
SKPaymentTransaction * getSKPaymentTransaction() const;

void setSKPaymentQueue( SKPaymentQueue * _skPaymentQueue );
SKPaymentQueue * getSKPaymentQueue() const;

public:
const ConstString & getProductIdentifier() const override;

Expand All @@ -36,6 +39,7 @@ namespace Mengine

protected:
SKPaymentTransaction * m_skPaymentTransaction;
SKPaymentQueue * m_skPaymentQueue;

ConstString m_productIdentifier;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
//////////////////////////////////////////////////////////////////////////
AppleStoreInAppPurchasePaymentTransaction::AppleStoreInAppPurchasePaymentTransaction()
: m_skPaymentTransaction( nil )
, m_skPaymentQueue( nil )
{
}
//////////////////////////////////////////////////////////////////////////
AppleStoreInAppPurchasePaymentTransaction::~AppleStoreInAppPurchasePaymentTransaction()
{
m_skPaymentTransaction = nil;
m_skPaymentQueue = nil;
}
//////////////////////////////////////////////////////////////////////////
void AppleStoreInAppPurchasePaymentTransaction::setSKPaymentTransaction( SKPaymentTransaction * _skPaymentTransaction )
Expand All @@ -32,6 +34,16 @@
return m_skPaymentTransaction;
}
/////////////////////////////////////////////////////////////////////////////
void AppleStoreInAppPurchasePaymentTransaction::setSKPaymentQueue( SKPaymentQueue * _skPaymentQueue )
{
m_skPaymentQueue = _skPaymentQueue;
}
/////////////////////////////////////////////////////////////////////////////
SKPaymentQueue * AppleStoreInAppPurchasePaymentTransaction::getSKPaymentQueue() const
{
return m_skPaymentQueue;
}
/////////////////////////////////////////////////////////////////////////////
const ConstString & AppleStoreInAppPurchasePaymentTransaction::getProductIdentifier() const
{
return m_productIdentifier;
Expand All @@ -43,7 +55,7 @@
, m_productIdentifier.c_str()
);

[[SKPaymentQueue defaultQueue] finishTransaction:m_skPaymentTransaction];
[m_skPaymentQueue finishTransaction:m_skPaymentTransaction];
}
/////////////////////////////////////////////////////////////////////////////
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@property (assign) Mengine::AppleStoreInAppPurchaseFactoryInterface * _Nullable m_factory;
@property (assign) Mengine::AppleStoreInAppPurchaseServiceInterface * _Nullable m_service;

@property (strong) NSMutableArray<SKPaymentTransaction *> * _Nonnull m_cacheSKPaymentTransactions;
@property (strong) NSMutableArray<NSDictionary *> * _Nonnull m_cacheSKPaymentTransactions;

+ (instancetype _Nonnull) sharedInstance;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,33 @@ - (instancetype _Nonnull)init {
- (void)setupWithFactory: (Mengine::AppleStoreInAppPurchaseFactoryInterface * _Nonnull)_factory service: (Mengine::AppleStoreInAppPurchaseServiceInterface * _Nonnull)_service {
m_factory = _factory;
m_service = _service;

for (NSDictionary * value in self.m_cacheSKPaymentTransactions) {
SKPaymentQueue * queue = value[@"queue"];
NSArray<SKPaymentTransaction *> * transactions = value[@"transactions"];

[self paymentQueue:queue updatedTransactions:transactions];
}
}

#pragma mark - SKPaymentTransactionObserver

// Sent when the transaction array has changed (additions or state changes). Client should check state of transactions and finish as appropriate.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
LOGGER_MESSAGE( "SKPaymentTransactionObserver paymentQueue updatedTransactions" );

if (m_service == nil) {
[self.m_cacheSKPaymentTransactions addObjectsFromArray:transactions];
NSDictionary * value = @{@"queue": queue, @"transactions": transactions};
[self.m_cacheSKPaymentTransactions addObject:value];

return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver paymentQueue updatedTransactions" );

Mengine::AppleStoreInAppPurchasePaymentTransactionProviderInterfacePtr copy_provider = m_service->getPaymentTransactionProvider();

for (SKPaymentTransaction * skPaymentTransaction in transactions)
{
Mengine::AppleStoreInAppPurchasePaymentTransactionInterfacePtr paymentTransaction = m_factory->makePaymentTransaction( skPaymentTransaction );
Mengine::AppleStoreInAppPurchasePaymentTransactionInterfacePtr paymentTransaction = m_factory->makePaymentTransaction( skPaymentTransaction, queue );

SKPaymentTransactionState state = skPaymentTransaction.transactionState;

Expand Down Expand Up @@ -94,13 +102,21 @@ - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaym

// Sent when transactions are removed from the queue (via finishTransaction:).
- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
if (m_service == nil) {
return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver paymentQueue removedTransactions" );

//ToDo
}

// Sent when an error is encountered while adding transactions from the user's purchase history back to the queue.
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
if (m_service == nil) {
return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver paymentQueue restoreCompletedTransactionsFailedWithError: %s"
, Mengine::Helper::AppleGetMessageFromNSError( error ).c_str()
);
Expand All @@ -110,13 +126,21 @@ - (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedW

// Sent when all transactions from the user's purchase history have successfully been added back to the queue.
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
if (m_service == nil) {
return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver paymentQueueRestoreCompletedTransactionsFinished" );

//ToDo
}

// Sent when a user initiates an IAP buy from the App Store
- (BOOL)paymentQueue:(SKPaymentQueue *)queue shouldAddStorePayment:(SKPayment *)payment forProduct:(SKProduct *)product {
if (m_service == nil) {
return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver shouldAddStorePayment" );

//ToDo
Expand All @@ -125,13 +149,21 @@ - (BOOL)paymentQueue:(SKPaymentQueue *)queue shouldAddStorePayment:(SKPayment *)
}

- (void)paymentQueueDidChangeStorefront:(SKPaymentQueue *)queue {
if (m_service == nil) {
return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver paymentQueueDidChangeStorefront" );

//ToDo
}

// Sent when entitlements for a user have changed and access to the specified IAPs has been revoked.
- (void)paymentQueue:(SKPaymentQueue *)queue didRevokeEntitlementsForProductIdentifiers:(NSArray<NSString *> *)productIdentifiers {
if (m_service == nil) {
return;
}

LOGGER_MESSAGE( "SKPaymentTransactionObserver didRevokeEntitlementsForProductIdentifiers: %s"
, Mengine::Helper::NSIdToString( productIdentifiers ).c_str()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ namespace Mengine

public:
AppleStoreInAppPurchaseProductInterfacePtr makeProduct( SKProduct * _skProduct ) override;
AppleStoreInAppPurchasePaymentTransactionInterfacePtr makePaymentTransaction( SKPaymentTransaction * _skPaymentTransaction ) override;
AppleStoreInAppPurchasePaymentTransactionInterfacePtr makePaymentTransaction( SKPaymentTransaction * _skPaymentTransaction, SKPaymentQueue * _skPaymentQueue ) override;

protected:
AppleStoreInAppPurchasePaymentQueueProviderInterfacePtr m_paymentQueueProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,12 @@
return product;
}
//////////////////////////////////////////////////////////////////////////
AppleStoreInAppPurchasePaymentTransactionInterfacePtr AppleStoreInAppPurchaseService::makePaymentTransaction( SKPaymentTransaction * _skPaymentTransaction )
AppleStoreInAppPurchasePaymentTransactionInterfacePtr AppleStoreInAppPurchaseService::makePaymentTransaction( SKPaymentTransaction * _skPaymentTransaction, SKPaymentQueue * _skPaymentQueue )
{
AppleStoreInAppPurchasePaymentTransactionPtr transaction = m_factoryPaymentTransaction->createObject( MENGINE_DOCUMENT_FACTORABLE );

transaction->setSKPaymentTransaction( _skPaymentTransaction );
transaction->setSKPaymentQueue( _skPaymentQueue );

return transaction;
}
Expand Down

0 comments on commit c5ee861

Please sign in to comment.