{"id":32779,"date":"2021-06-08T15:21:54","date_gmt":"2021-06-08T19:21:54","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=32779"},"modified":"2024-05-07T11:41:06","modified_gmt":"2024-05-07T15:41:06","slug":"storekit-2","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2021\/06\/08\/storekit-2\/","title":{"rendered":"StoreKit 2"},"content":{"rendered":"<p><a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/\">Apple<\/a>:<\/p>\n<blockquote cite=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/\"><p>StoreKit 2 delivers powerful, Swift-native APIs for in-app purchases and auto-renewable subscriptions. Learn how you can easily implement in-app purchases and subscriptions, and discover APIs for retrieving product information, handling transactions, determining product entitlements and customer status, as well as comprehensive testing support in Xcode.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jakemor\/status\/1402047383882637314\">Jake Mor<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jakemor\/status\/1402047383882637314\">\n<p>The <a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/transaction\">Refund API<\/a> doesn&rsquo;t let you programmatically issue a refund to your customers. It merely lets you show a sheet to customers, so they can request a refund from Apple. They hear back within 48 hrs.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/rjonesy\/status\/1402308711960485896\">Ryan Jones<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/rjonesy\/status\/1402308711960485896\">\n<p>This makes it look like Devs control the refund. So we get all the ire, even more. With no control.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/nut_bunnies\/status\/1402309894674522112\">nut_bunnies<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/nut_bunnies\/status\/1402309894674522112\"><p>When Apple really doesn&rsquo;t want to do something but is pressured into offering a &ldquo;sweet solution,&rdquo; you can just feel the contempt they have for the people asking for the full thing<\/p><\/blockquote>\n\n<p>On the plus side, it does look like StoreKit 2 makes lots of things easier.<\/p>\n\n<p><a href=\"https:\/\/twitter.com\/keleftheriou\/status\/1401891372609638400\">Kosta Eleftheriou<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/keleftheriou\/status\/1401891372609638400\">\n<p>Google Play does what?? &#x1F92F;<\/p>\n<p>&ldquo;You may get an automatic refund if you uninstall a paid app shortly after first buying it&rdquo;<\/p>\n<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2021\/05\/06\/whitelisted-developers\/\">Whitelisted Developers<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2019\/10\/16\/receipt-validation-and-airplay-2\/\">Receipt Validation and AirPlay 2<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2017\/12\/28\/apple-support-tells-customers-to-ask-developer-for-refund\/\">Apple Support Tells Customers to Ask Developer for Refund<\/a><\/li>\n<\/ul>\n\n<p id=\"storekit-2-update-2021-06-13\">Update (2021-06-13): <a href=\"https:\/\/twitter.com\/jeiting\/status\/1403055856858583047\">Jacob Eiting<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jeiting\/status\/1403055856858583047\"><p>This is huge. You are now able to get to IAP transactions IDs from the customer order ID present in customer emails.<\/p><p>This will help a ton with the evergreen &ldquo;I purchased this thing, where is my content&rdquo; support ticket.<\/p><\/blockquote>\n\n<p id=\"storekit-2-update-2021-10-20\">Update (2021-10-20): <a href=\"https:\/\/twitter.com\/elkmovie\/status\/1401978538195095553\">Michael Love<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/elkmovie\/status\/1401978538195095553\"><p>Bunch of new StoreKit stuff they didn&rsquo;t mention at all, though it appears they <em>still<\/em> aren&rsquo;t allowing developers to actually initiate refunds likely due to the fact that the whole backend is made out of tin cans + string.<\/p><p>&ldquo;Invoice Lookup&rdquo; is nice, but only works if the user has a receipt, which they usually don&rsquo;t - Google has supported search by email from the beginning and they&rsquo;ve done it safely\/anonymously (have to enter it exactly + they don&rsquo;t display it).<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/developer.apple.com\/news\/?id=1mmydqta\">Apple<\/a>:<\/p>\n<blockquote cite=\"https:\/\/developer.apple.com\/news\/?id=1mmydqta\"><p>StoreKit 2 introduces powerful new Swift-based APIs that make supporting in-app purchases and subscriptions easier than ever. You can now easily determine product entitlements and eligibility for offers, quickly get a user&rsquo;s history of in-app purchases, find out the latest status of a subscription with one simple check, provide a way to request refunds and manage subscriptions from within your app, and more. StoreKit 2 also uses Swift concurrency and JSON Web Signature to simplify how you retrieve product information and handle transactions.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jeiting\/status\/1440718057853231111\">Jacob Eiting<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jeiting\/status\/1440718057853231111\"><p>&ldquo;Wow, StoreKit2 is going to kill RevenueCat&rdquo;<\/p><p>The reality:<\/p>\n<img decoding=\"async\" src=\"https:\/\/pbs.twimg.com\/media\/E_51TgVVkAQuJH-?format=png&amp;name=900x900\" alt=\"\" \/><\/blockquote>\n\n<p id=\"storekit-2-update-2022-10-13\">Update (2022-10-13): <a href=\"https:\/\/twitter.com\/chockenberry\/status\/1567214007223996417\">Craig Hockenberry<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/chockenberry\/status\/1567214007223996417\">\n<p>You know what would be great? The TestFlight sandbox working with StoreKit2 as well as Xcode does.<\/p>\n<p>I have never seen it return <code>currentEntitlements<\/code> and that&rsquo;s a hell of a thing to be missing if you want to test behavior for PAYING customers.<\/p>\n<p>At this point, I&rsquo;d prefer TestFlight to use the production App Store backend.<\/p>\n<p>Let testers pay for real or hand out promo codes as needed.<\/p>\n<p>The current situation achieves nothing.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jcieplinski\/status\/1567224593898786817\">Joe Cieplinski<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jcieplinski\/status\/1567224593898786817\">\n<p>Could not agree more. Getting paid is about as crucial a function of shipping an app as can be, and yet we&rsquo;re still ultimately left to cross our fingers and ship to the general public before we know for certain it&rsquo;s working properly.<\/p>\n<\/blockquote>\n\n<p id=\"storekit-2-update-2024-02-01\">Update (2024-02-01): <a href=\"https:\/\/mastodon.social\/@vandal\/111722981896278240\">Luc Vandal<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@vandal\/111722981896278240\"><p>Is it just me or StoreKit 2 is far from reliable on macOS? Products or subscriptions not loading, app unable to connect to the StoreKit service (XPC), etc. It&rsquo;s pretty flawless on iOS. &#x1F997;&#x1F997;&#x1F997; from the StoreKit team or on Apple Dev forums (which is not surprising).<\/p><\/blockquote>\n\n<p id=\"storekit-2-update-2024-05-07\">Update (2024-05-07): <a href=\"https:\/\/mastodon.social\/@vandal\/112388573674673982\">Luc Vandal<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@vandal\/112388573674673982\"><p>Working with StoreKit 2 is frustrating. Production often differ from debug, dealing with Family Sharing adds another layer of complexity. Hopefully, we&rsquo;ll see significant improvements this June. It&rsquo;s frustrating to debug production issues blindly, so a more robust solution would be highly welcomed.<\/p><\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Apple: StoreKit 2 delivers powerful, Swift-native APIs for in-app purchases and auto-renewable subscriptions. Learn how you can easily implement in-app purchases and subscriptions, and discover APIs for retrieving product information, handling transactions, determining product entitlements and customer status, as well as comprehensive testing support in Xcode. Jake Mor: The Refund API doesn&rsquo;t let you programmatically [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2021-06-08T19:21:58Z","apple_news_api_id":"5f4e7272-4c5e-4b63-a15f-e62900c56358","apple_news_api_modified_at":"2024-05-07T15:41:10Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAACA==","apple_news_api_share_url":"https:\/\/apple.news\/AX05yckxeS2OhX-YpAMVjWA","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[91,2392,101,2518,784,522,31,2078,30,39,2077,71,2125],"class_list":["post-32779","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-appstore","tag-app-store-receipt-validation","tag-business","tag-entitlements","tag-google-play-store","tag-inapppurchase","tag-ios","tag-ios-15","tag-mac","tag-macappstore","tag-macos-12","tag-programming","tag-revenuecat"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/32779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=32779"}],"version-history":[{"count":8,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/32779\/revisions"}],"predecessor-version":[{"id":43116,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/32779\/revisions\/43116"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=32779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=32779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=32779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}