Did you manually set the clock on the device? This kind of issue can happen if you move devices clock back or forward in time too much (for example for testing purposes)
Also I would check if a VPN is enabled and try again after disabling it (Settings -> General -> VPN & Device Management).
Post
Replies
Boosts
Views
Activity
To get closer to the root cause of the issue, I recommend trying the following things:
Try replacing your Manager and presentation code with StoreKit's view. This will tell if the issue is in the code or in the environment/apstore connect.
Replace you content view with this super minimal example:
import SwiftUI
import StoreKit
struct ContentView: View {
var body: some View {
SubscriptionStoreView(productIDs: ["v1"])
}
}
If the issue still exists, then add a StoreKit configuration file to you project and when creating it tick "Sync this file with an app in App Store Connect". Verify the app and team are auto filled. After creation, the file should sync with Appstore connect automatically. Do you see the product in the list?
Finally try to run with this store kit configuration.
Additional thing, you wrote "Registered the app with the same bundle identifier." which makes me think that you did not distribute your app even once (product -> archive -> organizer -> distribute app). I don't know if this is a must in your case but I do recommend to do it. It can also reveal a typo in bundle identifier if you accidentally made one.
Personally, I never create an app in AppStore Connect "manually" but always start by distributing it. It will create a stub if this app does not exist.
For the benefit of those who search for a solution for a similar problem and find this post through search.
As I understand, Image takes all available space, however in this case the image is wider than the screen and has .resizable and scaleToFill modifiers which will make it to take more space than offered by the container. The container will resize accordingly, extending beyond the boundaries of the visible screen, and then offer more space to the other children including the text.
To solve this, use .background modifier instead of a ZStack. I think adding .containerRelativeFrame([.vertical, .horizontal]) to the image will also work, though I suspect not as well if you want the background image to ignore safe areas.
Is the issue that there is no transaction for this product in the entitlements, or is the issue that the originalPurchaseDate is not what you expect?
To understand this, you need to get telemetry from your app (by either writing to a log and asking the user to export and send bit to you or by sending events to a server)
I would recommend sending the current date, originalPurchaseDate and just in case also the purchaseDate (to see if there is any difference).
However, my first suspect would be the time difference calculation. Maybe you took into account timezone differences where it is not required? The user who had an issue might be on a different time zone. Ask someone to review the code.
Regarding your overall strategy, you should consider two things (which might not be real issues, depending on the popularity of your app and the motivation to "hack" it):
Using the system time (eg Date.now) allows users to change the devices clock to a previous date. If they do it each time before launching your app they could get a "free trial" indefinitely.
I believe originalPurchaseDate and purchaseDate do not take refunds into account. So a user might request a refund and re-purchase the IAP. This new transaction will have a later originalPurchaseDate and the old one will not appear in currentEntitlements anymore.
I had the same issue, and what resolved it was removing the quotation marks in the command.
I see in your example, the quotation marks are not really quotation marks but a different unicode character.
Notice the difference:
correct: "
incorrect: ”
I think this happened because you copied the command from a website where they had them around placeholder arguments, and you wrote your AppleID etc in side those "quotation" marks.
To resolve the issue, simply remove all quotation marks (or replace them with the correct version)
From the documentation:
Call finish() to complete a transaction after you deliver the purchased content or enable the purchased service.
Assuming you do not unlock the content for failed transactions, you should not finish them.
I believe failed transactions can resolve eventually, so that's why they persist.
I recommend to start by trying to run Apple's food truck example. Does it work when you run it?
https://developer.apple.com/documentation/swiftui/food_truck_building_a_swiftui_multiplatform_app
Although the example does not use beginRefundRequest, but instead use refundRequestSheet, if it does not work as well you can deduce the issue is with your environment and not with the code you wrote.
Long shot and probably too late, but did you call finish() on these transactions?
Here is my non expert take on this.
Deciding what to do with an unverified transaction is a business decision. You can ignore verification and unlock the content, although I have no idea why would someone decide to do this. In StoreKit 1, the equivalent of verifying a transaction required sending a receipt to your server. App developers who did not want to maintain a server and were willing to take the risk of hacking, simply handled all transactions.
You should call finish() only after you unlocked the content. If you do not plan unlocking the content for unverified transactions, do not call finished(). Apple's example you provided is supporting this theory.
I would cautiously speculate that the app should almost never encounter an unverified transaction unless the user is trying to do something funny with the device or a bug on Apple's side.
Also notice that in a rare case transaction can change from unverified to verified. See this: https://developer.apple.com/documentation/storekit/verificationresult/verificationerror/revokedcertificate
It's June 2024, 2.5 years after this issue was reported and this issue still exists in Xcode 15.4! I know it is the same issue because closing the tabs like it was recommenced here solved it for me.
This is a big disgrace for Apple that a bug in the most basic functionality of their editor which affects productivity of all of the developers does not get the priority it deserves. Xcode is already a can of bugs but this is a new level of pissing on its users.
It looks like what I need was added in iOS 16 beta https://developer.apple.com/documentation/coregraphics/cgpath/3994964-intersection?changes=latest_minor&language=_5
So I guess I was right and currently it is not available.
However for my particular case, I did not need the intersection path itself, only to stroke it so a colleague suggested to clip one path by the other and stroke the result and then switch roles and stroke the other part. Together the intersection path is approximately stroked (with some visual artifacts at intersection points)
I experience the same error message with iPhone 11 Pro and other selected few models. It happens with extremely short assets encoded with MPEG-4 Part 2, using ffmpeg's -c:v mpeg4 option.
I found a workaround, not sure if this is the correct way. The following will return the format which mainMixerNode will accept.
[self.engine.mainMixerNode inputFormatForBus:0]
In the first paragraph, I meant to write [AVSpeechSynthesizer writeUtterance:toBufferCallback:].
I found a workaround for this. I converted the SVG files to PDFs. It seems that the code which does the PDF rendering consumes less memory.