Posts

Post not yet marked as solved
145 Replies
20k Views
It's not possible to create a new version for any App Store Connect app. To reproduce, I navigate to my app and click the (+) button to create a new version number. I type in a version number, and click "Create." It fails with an error, "An error has occurred. Try again later." When I view it in the Network tab of the Web Inspector, it shows that there's a 500 error. { "errors": [{ "status": "500", "code": "UNEXPECTED_ERROR", "title": "An unexpected error occurred.", "detail": "An unexpected error occurred on the server side. If this issue continues, contact us at https://developer.apple.com/contact/." }] } The same error occurs when I attempt to create an app store version using the App Store Connect API.
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
0 Replies
349 Views
I'm using standard Safari Web Push, but my notifications aren't coming through. I'm trying to debug this. Is it possible to use the Apple Push Notifications Console to debug/analyze Safari Web Push deliverability? I can't figure out how to use it for web push. When I login and try to use the Push Notification Console, it asks me to choose an "app." But for standard Safari 16+ Web Push, there is no "app," no "Website Push ID", etc. that I register with Apple. So how can I use the Push Notification Console for this? Apple's documentation does strongly imply that it should work. Sending web push notifications in web apps and browsers: To resolve an error, address the issue and resend your push notification request. For more information about the factors that impact the delivery of a push notification, see Viewing the status of push notifications using Metrics and APNs. And that page is all about the Push Notification Console. So it must be possible somehow, right?
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
5 Replies
553 Views
I attempted to use the new App Store Connect API 3.0 feature to manage Game Center achievements. My goal was to create a bunch of achievements, with one en-US localization each, with an attached image. Creating the achievement and its localization initially seems to have worked fine; I uploaded the image, and its assetDeliveryState.state is COMPLETED. But when I visit the achievement in the App Store Connect Console UI, all the images I've uploaded are 404 Not Found. I'm going to have to upload all of these images by hand. 😭 Here's the sample code I used, using the https://github.com/dfabulich/node-app-store-connect-api v5.0.3. import { api } from 'node-app-store-connect-api'; import { readFile, stat } from 'node:fs/promises'; import { homedir } from 'node:os'; const appId = 6468677114; const vendorIdentifier = 'com.example.myachievement'; const showBeforeEarend = true; const points = 10; const locale = "en-US"; const title = "My Achievement"; const afterEarnedDescription = "Earned the achievment."; const beforeEarnedDescription = "Earn the achievement."; const fileName = `${vendorIdentifier}.png`; const params = { issuerId: "69a6de6f-0d6d-47e3-e053-5b8c7c11a4d1", apiKey: "3S3G8T48YW", }; params.privateKey = await readFile(`${homedir()}/.appstoreconnect/private_keys/AuthKey_${params.apiKey}.p8`, 'utf8'); const { read, create, uploadAsset, pollForUploadSuccess } = await api(params); const {data: gameCenterDetail} = await read(`apps/${appId}/gameCenterDetail`); console.log('creating', vendorIdentifier); const gameCenterAchievement = await create({ type: 'gameCenterAchievements', attributes: { referenceName: title, vendorIdentifier, points, repeatable: false, showBeforeEarned, }, relationships: { gameCenterDetail } }); console.log(' localization'); const gameCenterAchievementLocalization = await create({ type: 'gameCenterAchievementLocalizations', attributes: { locale, name: title, afterEarnedDescription, beforeEarnedDescription, }, relationships: { gameCenterAchievement } }); console.log(' image'); const image = await create({ type: 'gameCenterAchievementImages', attributes: { fileName, fileSize: (await stat(fileName)).size, }, relationships: { gameCenterAchievementLocalization } }); console.log(' upload'); await uploadAsset(image, await readFile(fileName)); console.log(' poll'); await pollForUploadSuccess(image.links.self);
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
2 Replies
399 Views
I'm unable to file bug reports in Feedback Assistant. To reproduce: Navigate to https://feedbackassistant.apple.com/ (I'm logged in) Click the Create button in the header, taking you to https://feedbackassistant.apple.com/new-form-response Click any category button Expected: A form to fill out Actual: A blank white screen; no way to fill out the form I've tested this in Safari 17.1 and Chrome 119 on macOS Sonoma 14.1 I see an error in when I open Safari Web Inspector: Failed to load resource: the server responded with a status of 404 (Not Found) https://appleseed.apple.com/sp/en-US/feedback/forms/3027
Posted
by dfabulich.
Last updated
.
Post marked as solved
1 Replies
763 Views
When attempting to set the price for an app, the App Store Connect API returns a 500 error. "An unexpected error occurred on the server side. If this issue continues, contact us at https://developer.apple.com/contact/.'" Can anyone else reproduce this error? I've filed it as FB11924370.
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
0 Replies
528 Views
The documentation on the site says, https://developer.apple.com/documentation/appstoreconnectapi/list_all_prices_for_an_app "The current price has a null start date. Each additional price has a start date that indicates the date when the price will take effect around the world." The WWDC documentation provides an example of this. https://developer.apple.com/videos/play/wwdc2020/10004/?time=431 This used to work, but the AppPrice object no longer includes a start date. All mention of the AppPrice startDate attribute (or even that it has attributes) seems to have been scrubbed from the public documentation. https://developer.apple.com/documentation/appstoreconnectapi/appprice I filed this as FB11548644 in September, with no reply. Can anyone think of a workaround?
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
2 Replies
1.5k Views
I filed a bug in Feedback Assistant for this issue https://developer.apple.com/forums/thread/711307 (FB10941060). Apple didn't reply, so I attempted to file a Technical Support Incident to have an engineer at Apple investigate the issue. (Follow up 805401346) DTS replied saying that they refuse to investigate any issues in App Store Connect, including the App Store Connect API. This is not OK! When there are critical problems with the App Store Connect API, there has to be some support channel I can use to get an Apple engineer's attention. What can I do here? Thank you for contacting Apple Developer Technical Support (DTS). We provide support for code-level questions on hardware & software development, and are unable to help you with your question. For questions regarding App Store Connect, we recommend that you first check the App Store Connect Help: https://help.apple.com/app-store-connect/ If you are not able to find the information you need in the App Store Connect Help and you are still not able to resolve your issue, please direct your inquiry through the Contact Us page: https://developer.apple.com/contact/ Submitting an inquiry through the Contact Us page will expedite the response time from the proper Apple representative. When contacting the App Store Connect Team, be sure to mention that you were referred by DTS.
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
1 Replies
737 Views
The App Store Connect API returns inconsistent results for IAP pricing. https://api.appstoreconnect.apple.com/v1/inAppPurchasePriceSchedules/:iapId/manualPrices?include=inAppPurchasePricePoint&filter[territory]=USA I expect to see at least two inAppPurchasePrices objects, one with startDate: null, representing the current, active price, and at least one with a non-null startDate. Many IAPs I query don't include an inAppPurchasePrices object that has startDate: null, forcing me to sort through the return objects for the latest startDate (excluding those in the future). Other IAPs I query return only one inAppPurchasePrices object, and that object has startDate: null. Worst of all, sometimes the startDate: null object points to the wrong price point! To repro Run this Node program I wrote using https://www.npmjs.com/package/node-app-store-connect-api const { fetchJson } = await api({ issuerId: "***", apiKey: "***" }); const iaps = await fetchJson('apps/1302297731/inAppPurchasesV2?limit=200'); const output = { noLatest: [], noNull: [], nullMismatchesLatest: [], ok: [], } await Promise.all(iaps.map(async (iap) => { const { data: inAppPurchasePrices, included } = await fetchJson(`inAppPurchasePriceSchedules/${iap.id}/manualPrices?include=inAppPurchasePricePoint&filter[territory]=USA`, { inclusions: 'tree' }); const latestStartPrice = inAppPurchasePrices.filter(price => price.attributes.startDate && new Date(price.attributes.startDate).getTime() < Date.now()) .sort((a, b) => b.attributes.startDate.localeCompare(a.attributes.startDate))[0]; const nullStartPrice = inAppPurchasePrices.filter(price => !price.attributes.startDate)[0]; if (!latestStartPrice) { output.noLatest.push(iap.id); } if (!nullStartPrice) { output.noNull.push(iap.id); } if (latestStartPrice && nullStartPrice) { const latestStartPricePoint = included.inAppPurchasePricePoints[latestStartPrice.relationships.inAppPurchasePricePoint.data.id]; const nullStartPricePoint = included.inAppPurchasePricePoints[nullStartPrice.relationships.inAppPurchasePricePoint.data.id]; if (latestStartPricePoint !== nullStartPricePoint) { output.nullMismatchesLatest.push(iap.id); } else { output.ok.push(iap.id); } } })); console.log(JSON.stringify(output, null, 2)); Expected All IAPs should appear in the ok array, having a startDate: null price that matches the current latest price with a non-null startDate. Actual { "noLatest": [ "1497954161", "1441701978", "1435841888", "1456629092", "1381567394", "1478155596", "1420181684", "1546010700", "1307073664", "1435842259", "1447528634", "1456628326", "1355941688", "1355943062", "1389691983", "1364108501", "1614866807", "1412920025", "1412927608", "1377458307", "1635603476", "1614867647", "1402141384", "1355943058", "1522960459", "1438261088", "1355943066", "1473496366", "1435186057", "1364106150", "1443695443", "1473495651", "1624284308", "1412923459", "1532797948", "1467986798", "1364102273", "1480297027", "1391358524", "1606438471", "1497951341", "1364106702", "1332191975", "1480298417", "1454531393", "1634234785", "1496622145", "1355942300", "1607908448", "1412924898", "1452845547", "1412922765", "1614901335", "1412928940", "1601726945", "1579373942", "1635602874", "1496621119", "1402775284", "1555535989", "1481266301", "1402141505", "1467986077", "1526194764", "1584208741", "1364106824", "1522959003", "1364107650", "1450343495", "1419335516", "1473494688", "1361358209", "1440133234", "1449545225", "1529667540", "1635603182", "1412928190", "1355943775", "1441701155", "1514835714", "1634325161", "1412923835" ], "noNull": [ "1402141378", "1402141617", "1402141630", "1402141433", "1402141611", "1402141281", "1402141605", "1402141608", "1402141440", "1402141273", "1402141370", "1402141442", "1402141439", "1402141437", "1402141276", "1402141389", "1402141504", "1402141502", "1402141501", "1402141607", "1402141615", "1402141613", "1402141435", "1402141619", "1402141510", "1402141429", "1402141494", "1402141279", "1402141622", "1402141623", "1402141375", "1402141610", "1402141606", "1402142202", "1402141508", "1402141609", "1402141424", "1402141503", "1402141441", "1402141509", "1402141280", "1402141430", "1402141496", "1402141616", "1402141292", "1402141295", "1402141275", "1402141612", "1402141298", "1402141385", "1402141282", "1402141272", "1402141602", "1402141423", "1402141625", "1402141629", "1402141271", "1402141387", "1402141601", "1402141386", "1402141428", "1402141421", "1402141495", "1402141294", "1402141438", "1402140691", "1402141390", "1402142201", "1402141627", "1402141620", "1402141614", "1402141604", "1402141434", "1402141296", "1402141383", "1402141278", "1402141626", "1402141621" ], "nullMismatchesLatest": [ "1559613404", "1480951433", "1593896143", "1624290126", "1402141388", "1497950653", "1611780428", "1478784036", "1575588963", "1607162006", "1611045747", "1575589112", "1569461289", "1619138153", "1583793186", "1601722583", "1539790918", "1487867489", "1402141618", "1506977067", "1588425188", "1632448119", "1619138571", "1497954915", "1611045866", "1593060899", "1601719729", "1482341662", "1512806464", "1532073035", "1530425266", "1617098896", "1611046073", "1633118569", "1497959781", "1412920918", "1624064036", "1497951222", "1617100668", "1578378729", "1536619711", "1569460808", "1632483553", "1478782797", "1482341459", "1543962463", "1606792538", "1402141426", "1588968070", "1493021281", "1564178247", "1624276610", "1562385331", "1585716972", "1517480296", "1402141422", "1482781115" ], "ok": [ "1402141274", "1391871240", "1402141293", "1364108521", "1469870296", "1461673391", "1443694803", "1402141425", "1481265446", "1402141443", "1412917867", "1384042585", "1562888619", "1412920920", "1402141507", "1402141506", "1402141452", "1364107061", "1447036664", "1364107609" ] }
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
0 Replies
954 Views
I'm filing this as a bug, with three sections, "To Repro", "Actual" and "Expected" To Repro Using the App Store Connect API, you can load the price schedule for an IAP, like this: https://api.appstoreconnect.apple.com/v1/inAppPurchasePriceSchedules/:iapId/manualPrices Actual: Indistinguishable Prices The API at least one inAppPurchasePrices object per territory, but doesn't mention any relationships to the territory or the price point. For the current price, where the startDate is null, it's showing a bunch of indistinguishable "price" objects that include no pricing information, and no visible link to any pricing information. In other words, the API returns 175 of these meaningless blobs, which are only distinguished by their IDs, with no visible price or territory information: { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJUVE8ifQ", "attributes": { "startDate": null }, "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJUVE8ifQ" } }, { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJCSUgifQ", "attributes": { "startDate": null }, "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJCSUgifQ" } }, { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJNU1IifQ", "attributes": { "startDate": null }, "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJNU1IifQ" } } Workaround: include price points and territories You can workaround this by adding include=inAppPurchasePricePoint,territory to the request. https://api.appstoreconnect.apple.com/v1/inAppPurchasePriceSchedules/:iapId/manualPrices?include=inAppPurchasePricePoint,territory When you do that, each inAppPurchasePrices object will have a relationships section, like this: { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJaV0UifQ", "attributes": { "startDate": null }, "relationships": { "inAppPurchasePricePoint": { "data": { "type": "inAppPurchasePricePoints", "id": "MTM5MzU0MTgzMV96d181NTA" } }, "territory": { "data": { "type": "territories", "id": "ZWE" } } }, "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJaV0UifQ" } }, { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJNS0QifQ", "attributes": { "startDate": null }, "relationships": { "inAppPurchasePricePoint": { "data": { "type": "inAppPurchasePricePoints", "id": "MTM5MzU0MTgzMV9ta181NTA" } }, "territory": { "data": { "type": "territories", "id": "MKD" } } }, "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJNS0QifQ" } }, { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJGU00ifQ", "attributes": { "startDate": null }, "relationships": { "inAppPurchasePricePoint": { "data": { "type": "inAppPurchasePricePoints", "id": "MTM5MzU0MTgzMV9mbV81NTA" } }, "territory": { "data": { "type": "territories", "id": "FSM" } } }, But when you do that, the territories and price points will also appear in the response, in the included section. (That's what include= normally does in the App Store Connect API.) Expected: The relationships links should be present even without explicitly including them Normally, in the App Store Connect API, important relationships are linked even without explicitly adding includes. For example, if you make a request like this: https://api.appstoreconnect.apple.com/v1/apps/:appId/inAppPurchasesV2 You'll see that the corresponding data objects each have a bunch of declared relationships, for inAppPurchaseLocalizations, pricePoints, content, etc. The relationship links are there, even though I didn't explicitly include any of them, so they don't clutter up the included array. Each inAppPurchasePrices data object should mention its territory and its price point, even without explicitly including it (i.e. the relationships links should be there, but the included array should not). Ideally, when I do this query: https://api.appstoreconnect.apple.com/v1/inAppPurchasePriceSchedules/:iapId/manualPrices The response should look like this: { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJaV0UifQ", "attributes": { "startDate": null }, "relationships": { "inAppPurchasePricePoint": { "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePricePoints/MTM5MzU0MTgzMV96d181NTA" } }, "territory": { "links:" { "self": "https://api.appstoreconnect.apple.com/v1/territories/ZWE" } } }, "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJaV0UifQ" } }, { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJNS0QifQ", "attributes": { "startDate": null }, "relationships": { "inAppPurchasePricePoint": { "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePricePoints/MTM5MzU0MTgzMV9ta181NTA" } }, "territory": { "links:" { "self": "https://api.appstoreconnect.apple.com/v1/territories/MKD" } } "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePrices/eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJNS0QifQ" } }, { "type": "inAppPurchasePrices", "id": "eyJpIjoiMTM5MzU0MTgzMSIsImQiOjAsImMiOiJGU00ifQ", "attributes": { "startDate": null }, "relationships": { "inAppPurchasePricePoint": { "links": { "self": "https://api.appstoreconnect.apple.com/v1/inAppPurchasePricePoints/MTM5MzU0MTgzMV9mbV81NTA" } }, "territory": { "links:" { "self": "https://api.appstoreconnect.apple.com/v1/territories/FSM" } } } },
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
0 Replies
566 Views
When you do this query: https://api.appstoreconnect.apple.com/v1/apps/:appId/inAppPurchasesV2?include=iapPriceSchedule It adds inAppPurchasePriceSchedules objects to the response. But those objects contain no data at all; they just contain relationships links to the manualPrices objects. As a result, there's no way to include the current price tier in the request for IAPs. You have to make N requests for N manualPrices objects to get N actual price schedules (with actual prices). The prices endpoint for apps allow you to include=priceTier to see the price tiers. IAPs should do something similar.
Posted
by dfabulich.
Last updated
.
Post marked as solved
1 Replies
628 Views
I think there's a problem with https://developer.apple.com/wwdc21/sessions/ It lists two Xcode Cloud sessions, "Explore Xcode Cloud workflows" and "Customize your advanced Xcode Cloud workflows" whose descriptions say: "we recommend first watching “Meet Xcode Cloud” from WWDC21." But I see no session titled "Meet Xcode Cloud" anywhere on the session list. This indicates to me that the session is missing somehow. (I wonder if other sessions are missing, too. The "multiple product pages" A/B testing feature for App Store Connect suggests to me that there'd be a "What's new in App Store Connect" session this year, but I don't see one.)
Posted
by dfabulich.
Last updated
.
Post marked as solved
3 Replies
3.0k Views
I'm a small-time app developer; I'm not likely to get access to the Developer Transition Kit. Despite that, I'd like to be able to test my macOS app on my existing Intel Mac, to make sure my apps will continue to work on Apple Silicon. Is it possible to do a test my Apple Silicon compatibility today on my Intel Mac? (I'm imagining something like running macOS Big Sur in a VM. It might perform slowly, but at least it would give me peace of mind to know that my app will work.)
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
1 Replies
538 Views
I'm looking for information on how to integrate with Safari Quick Website Search as a web developer. I see how I can turn off websites in Quick Website Search (Preferences -> Search) but I believe users are not able to add them manually; Safari is meant to automagically detect them. Under what circumstances will my website show up as an option for Quick Website Search? How can I test this? On my own Mac, can I manually add sites to Quick Website Search by editing configuration files? Which configuration file would I look at to do this?
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
0 Replies
315 Views
On a Mac or Windows machine, when I visit a an app details page on apps.apple.com like https://apps.apple.com/us/app/gorogoa/id1269225754 it has a banner at the top, "This app is available only on the App Store for iPhone and iPad." I wish there were a button on this page that I could use to login and send the link directly to my iPhone. I know it's possible to use Handoff to send the link to a phone, but most users don't know how to do that. (Swipe slowly up from the bottom of the screen to enable the app switcher, tap the Handoff bar at the bottom.) Instead, users who want to download an iOS app are typically searching for it again by name on the App Store, or emailing themselves the link and opening the link on their phone, which adds friction to the download process. (I'm guessing this might not be the right place to raise this question. But what IS the right place? If I were at WWDC in person I could ask around in the hallways…)
Posted
by dfabulich.
Last updated
.
Post not yet marked as solved
1 Replies
1.4k Views
I'm trying to use Transporter to lookupMetadata for my app ID 1363309257, using an API key instead of a username and password.I created my API key on the https://appstoreconnect.apple.com/access/api page, and configured it with the App Manager role.I'm using my API key like this:"/usr/local/itms/bin/iTMSTransporter -m lookupMetadata -apiIssuer 69a6de6f-0d6d-47e3-e053-5b8c7c11a4d1 -apiKey 3S3G8T48YW -app_platform ios -apple_id 1363309257 -destination /tmp"The apiKey secret file is stored in ~/.appstoreconnect/private_keys/AuthKey_3S3G8T48YW.p8When I run that command, I get this error:iTMSTransporter says: "You cannot access '1363309257'. An Admin or App Manager has limited your access to this item, or the item does not exist. (1198)"I know my API key is good/correct and the App Manager role is correctly configured, because I can use that same secret key to generate a JWT and use it successfully with the REST API. When I curl https://api.appstoreconnect.apple.com/v1/apps/1363309257 using my JWT, I see my app in the response.Using the iTMSTransporter with the "-jwt" option with that same JWT fails, with exactly the same "You cannot access" error message.Is this my fault? Are API keys just broken with iTMSTransporter? Do I need to report a bug?
Posted
by dfabulich.
Last updated
.