j3k0 / cordova-plugin-purchase

In-App Purchase for Cordova on iOS, Android and Windows
https://purchase.cordova.fovea.cc
1.3k stars 537 forks source link

uncaught exception during purchase #22

Closed ahettlin closed 9 years ago

ahettlin commented 10 years ago

I assume this happens possibly because my app is still very young and I haven't signed my application with my developer license, but it would be nice if this didn't crash my app because of an unhandled exception. Here's the logs with relevant stack trace:

2014-01-08 20:58:25.066 XXX[52022:70b] InAppPurchase[objc]: About to do IAP 2014-01-08 20:58:25.075 XXX[52022:70b] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid product identifier: (null)' * First throw call stack: ( 0 CoreFoundation 0x000f05e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x01e088b6 objc_exception_throw + 44 2 CoreFoundation 0x000f03bb +[NSException raise:format:] + 139 3 StoreKit 0x019ae74f -[SKPaymentQueue addPayment:] + 659 4 XXX 0x00033098 -[InAppPurchase purchase:] + 440

lyleg commented 10 years ago

The load function populates self.list with your in app purchases defined in iTunes connect for your app. You'll need to get this setup or have fake data passed into your callback On Jan 8, 2014 2:30 PM, "ahettlin" notifications@github.com wrote:

I assume this happens possibly because my app is still very young and I haven't signed my application with my developer license, but it would be nice if this didn't crash my app because of an unhandled exception. Here's the logs with relevant stack trace:

2014-01-08 20:58:25.066 XXX[52022:70b] InAppPurchase[objc]: About to do IAP 2014-01-08 20:58:25.075 XXX[52022:70b] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid product identifier: (null)' * First throw call stack: ( 0 CoreFoundation 0x000f05e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x01e088b6 objc_exception_throw + 44 2 CoreFoundation 0x000f03bb +[NSException raise:format:] + 139 3 StoreKit 0x019ae74f -[SKPaymentQueue addPayment:] + 659 4 XXX 0x00033098 -[InAppPurchase purchase:] + 440

— Reply to this email directly or view it on GitHubhttps://github.com/j3k0/PhoneGap-InAppPurchase-iOS/issues/22 .

jameshoward commented 10 years ago

The load needs to complete and asynchronously return a valid set of products or this error occurs. This means that even if you call load you can't just go calling purchase immediately after or the same error occurs.

You can test this on a device by setting it to Airplane Mode then trying to purchase a product. Currently trying to work out the best way around this but probably going to go for setting a ready flag in my code when the products are returned and blocking access to buying until then.

j3k0 commented 10 years ago

@jameshoward the ready flag is the way to go.

In my apps, I hide the "purchase buttons" by default unless the ready flag is set. Additionally, I use an event / notification system to unhide those buttons (dynamically) when the "ready" callback is called.

You can also do the opposite, alert the user "AppStore cannot be contacted, try again later" when he tries to purchase before IAP got ready.

maxmoore14 commented 10 years ago

@jameshoward For what its worth, I currently use a hybrid of what @j3k0 is talking about. I hide the purchase & restore buttons until everything is loaded and ready and I show a loading spinner indicating activity. I also have that set to timeout after a while and show an error message so the user doesn't think the app has hung.

ghost commented 10 years ago

I'm having a similar problem but only with live app. It works fine in test builds. http://stackoverflow.com/q/23290142/235273

Not exactly same. But the exception is kind of similar.

2   CoreFoundation                  0x2f0f6f10 +[NSException raise:format:] + 100
3   StoreKit                        0x318a3f9e -[SKPaymentQueue addPayment:] + 598
j3k0 commented 9 years ago

Issue solved: product hasn't been submitted to Apple.. see stackoverflow.