Post

Replies

Boosts

Views

Activity

Reply to CGFloats rounding issues on simulator (x86_64)
Hi eskimo, Yes, 2.0 is the expected result. Here is my detailed configuration: • MacBook Pro 2020, Intel processor • MacOS 11.4 (but reproduced yesterday with 11.3.x) • Xcode 12.5 • Simulators: iPhone 8 (14.5), iPhone 8 (12.4), iPhone 8 Plus (14.5), iPhone 12 Pro Max I always get the following result: (lldb) po (398.0 / 165.0).rounded()e-321 You don't even have to set a breakpoint to get an unexpected result (though different) as the instruction print("Rounded result: \((398.0 / 165.0).rounded())") logs Rounded result: 2.412121212121212 FYI I've filled in a bug report (FB9118612).
Topic: Programming Languages SubTopic: Swift Tags:
May ’21
Reply to Issue with SKPaymentQueue not finishing transactions
I'm having the same issue with consumable products in Sandbox environment (https://developer.apple.com/forums/thread/678105). The first purchase for a given product goes well but any subsequent purchase for this product will end up by the system restoring the first transaction instead of creating a new one. In the end, the purchase fails as our backend refuses to validate the receipt (the transaction identifier being already validated once). I made sure all transactions in purchased or restored states are properly finished (the removedTransactions callback being called each time), although the call to finishTransaction may be asynchronous (after our backend (in)validates the receipt). However, each time the app starts or goes to foreground again, the first successful finished transaction keeps on appearing in the SKPaymentQueue as if it had not been finished. Finishing this transaction right away does not change anything. One sentence worries me in the SKPaymentQueue finishTransaction documentation page : In rare circumstances, this call might fail, and you'll receive updates for that transaction again. It looks like we are experiencing this situation but we have no way to check if the call to finishTransaction failed nor why did it fail. Moreover, there's apparently no way to work around this issue and allow subsequent purchases (for the same product). Also I'm pretty sure I was not experiencing this issue last week (using the same app distributed via Testflight). I don't know if it's an issue with the Sandbox environment or with the Storekit libs and I cannot test the production environment yet. But I'm not confident at all releasing our first support of in-app purchases. Aurélien.
Topic: Programming Languages SubTopic: Swift Tags:
Apr ’21
Reply to interrupted purchase cannot be tested successfully
I experienced the very same issue and figured out that you have to unselect Interrupt Purchases for This Tester on AppStoreConnect right before agreeing the fake general conditions update modal. If you do so, the new transaction is created as described in Apple documentation. I consider it a bug but if it's not, Apple should mention it as an intermediate step between steps 8. and 9. of the Interrupted Purchase test scenario. Hope it helps, Aurélien.
Topic: App & System Services SubTopic: StoreKit Tags:
Feb ’21
Reply to Interrupted in-app purchase (strong customer authentication)
The underlying error of the transaction error allows you to identify this specific use-case. if let error = transaction.error as? NSError, let underlyingError = error.userInfo["NSUnderlyingError"] as? NSError, underlyingError.code == 3038 { // General conditions have changed, don't display an error for the interrupted transaction } I cannot find any documentation regarding the underlying error domain (ASDServerErrorDomain) but I've not found any other way to discriminate this error. Hope it helps, Aurélien.
Topic: App & System Services SubTopic: StoreKit Tags:
Feb ’21
Reply to URLSessionDataTask response from URLCache or not?
First I create the URLRequest object with a cachePolicy (usually .useProtocolCachePolicy).      var urlRequest = URLRequest(url: url, cachePolicy: cachePolicy, timeoutInterval: timeoutInterval) Then I retrieve the cachedResponse from URLCache as follows:      let cachedResponse = URLCache.shared.cachedResponse(for: urlRequest) Here, cachedResponse(for:) always returns a new object (different pointer) if called several times with the same URLRequest. And it's the same for the HTTPURLResponse that I get as follows:      let cachedHTTPURLResponse = cachedResponse?.response Finally I create and resume the URLSessionDataTask, assuming the response will cached in URLCache (if the cache policy allows it).      let dataTask = urlSession.dataTask(with: urlRequest) { ... }      dataTask.resume()
Topic: App & System Services SubTopic: General Tags:
Feb ’21
Reply to URLSessionDataTask response from URLCache or not?
Thanks Matt for your support, this is exactly what I was looking for. Side question: sometimes there are two transactions (the first one hitting the cache, the second one the network). I assume the first transaction finds out that the cached response is stale, hence the second transaction. If I'm correct, is there any property describing the cache transaction result? Thanks again, Aurélien.
Topic: App & System Services SubTopic: General Tags:
Feb ’21
Reply to Embedded frameworks architectures check fail with XCode 12.3
So, as I cannot wait for third party XCFrameworks to be delivered, I went through the path of repacking the legacy frameworks into XCFrameworks and it works fine, as long as the XCFrameworks are there when compiling (which is not necessary with common frameworks). But this is another story. For those interested in how to create these XCFrameworks on the fly, here is how I managed to do so: Create an aggregate target in your project Add a build phase script to this new target to build the XCFrameworks Edit the scheme of the primary target (the one for your app) and add the aggregate target to the top of the targets list (build tab) Uncheck "Parallelize Build" to preserve the targets order
Dec ’20