Post

Replies

Boosts

Views

Activity

How do I control a SwiftUI TextField with a game controller?
I've coded a text-adventure game in SwiftUI. (My game has no graphics or sound effects.) My app already supports keyboard navigation; I would like to add support for game controllers on iPhone. I can't figure out how to do it. I especially can't see any way to allow controller users to enter text in a TextField. I've read https://developer.apple.com/documentation/gamecontroller/supporting-game-controllers and it's all about button events. There's no reference to SwiftUI at all in that documentation, or any input-method editing at all. The only mention of "keyboard" is about treating the keyboard itself as if it were a game controller providing button events. How do I implement this?
1
1
432
Jun ’26
How do I control a SwiftUI TextField with a game controller?
I've coded a text-adventure game in SwiftUI. (My game has no graphics or sound effects.) My app already supports keyboard navigation; I would like to add support for game controllers on iPhone. I can't figure out how to do it. I especially can't see any way to allow controller users to enter text in a TextField. I've read https://developer.apple.com/documentation/gamecontroller/supporting-game-controllers and it's all about button events. There's no reference to SwiftUI at all in that documentation, or any input-method editing at all. The only mention of "keyboard" is about treating the keyboard itself as if it were a game controller providing button events. How do I implement this?
0
0
360
Feb ’26
App Store Connect API `inAppPurchaseV2` returns `links.next`, even when there's no more `data`
I think there's been a recent change to the App Store Connect API; I claim that it's a bug. When querying App Store Connect API endpoints that return arrays, like https://api.appstoreconnect.apple.com/v1/apps, the response includes a links property, of type PagedDocumentLinks. https://developer.apple.com/documentation/appstoreconnectapi/pageddocumentlinks links should include a next link only if there's more data to provide, and, indeed, this is how it works for the /v1/apps endpoint. But when querying inAppPurchasesV2, I find that starting very recently (this week?) the API always returns a next link, even if there's no more data to show. { data: [], links: { self: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=APo&limit=50', first: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?limit=50', next: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=ASw' }, meta: { paging: { total: 223, nextCursor: 'ASw', limit: 50 } } } If I request the next link, it will generate me another response with empty data and with a new cursor. { data: [], links: { self: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=ASw&limit=50', first: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?limit=50', next: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=AV4' }, meta: { paging: { total: 223, nextCursor: 'AV4', limit: 50 } } } Code I've written against this API (including my open-source library https://github.com/dfabulich/node-app-store-connect-api) assumes that if there's another links.next link, we should follow it; as a result, my code is looping infinitely, requesting empty data until eventually I have to give up. This issue doesn't affect other endpoints, like /v1/apps, just this inAppPurchasesV2 endpoint. Was this an intentional change? It seems to be a bug.
4
5
697
Nov ’25
"Captions" in the Accessibility Nutrition Label for text-based apps
My game app is text-based interactive fiction, containing no audio/video content, making captions unnecessary. Our game is completely accessible to deaf users. Despite this, in the Accessibility Nutrition Label, I'm only able to leave the "Captions" box checked or unchecked. Leaving it unchecked would leave deaf players with the wrong impression that they can't enjoy our game. Leaving it checked would imply that we do have A/V content with captions included. In the WWDC video on this, https://developer.apple.com/videos/play/wwdc2025/224/ the video says: After we completed common tasks, we realized our app doesn’t have any video or audio only content. In this case, we aren’t going to indicate that Landmarks supports Captions. That's okay. This accurately describes the features that people will expect to be available while using the app. Maybe that's "OK," but I wish the form allowed me to say "This app doesn't contain audio/video content."
3
1
199
Jun ’25
Intelligence Features not available in Xcode 26 beta 1
At the Platform State of the Union, Apple demoed clicking a ✨ button in the Xcode toolbar to use Apple Intelligence in Xcode. I don't see that button in Xcode Version 26.0 beta (17A5241e). Am I missing it? It's supposed to be in the upper-left corner, right? Do I need to turn it on or something? I'm on macOS 15.5 Sequoia, on a 16-inch, 2021 MacBook Pro
8
7
1.5k
Jun ’25
Can't create new app version on App Store Connect
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.
185
119
35k
Aug ’24
Privacy Manifests: Incorrect "Missing API Declaration" error
I received an email from Apple saying my app is using the following privacy-restricted APIs without an API declaration. NSPrivacyAccessedAPICategoryUserDefaults NSPrivacyAccessedAPICategoryFileTimestamp NSPrivacyAccessedAPICategorySystemBootTime It's true, my app is using those features, in multiple pods that I depend on. For example, my app depends on the FBAudienceNetwork cocoapod, and I've upgraded it to version 6.15.0, which added a privacy manifest specifically to ensure that Apple wouldn't flag my app with an error. https://developers.facebook.com/docs/audience-network/setting-up/platform-setup/ios/changelog/ I can see its privacy manifest explicitly covers these APIs, below: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSPrivacyTrackingDomains</key> <array> <string>ep1.facebook.com</string> <string>ep6.facebook.com</string> </array> <key>NSPrivacyCollectedDataTypes</key> <array> <dict> <key>NSPrivacyCollectedDataType</key> <string>NSPrivacyCollectedDataTypeAdvertisingData</string> <key>NSPrivacyCollectedDataTypeLinked</key> <true/> <key>NSPrivacyCollectedDataTypeTracking</key> <true/> <key>NSPrivacyCollectedDataTypePurposes</key> <array> <string>NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising</string> <string>NSPrivacyCollectedDataTypePurposeAnalytics</string> </array> </dict> <dict> <key>NSPrivacyCollectedDataType</key> <string>NSPrivacyCollectedDataTypeDeviceID</string> <key>NSPrivacyCollectedDataTypeLinked</key> <true/> <key>NSPrivacyCollectedDataTypeTracking</key> <true/> <key>NSPrivacyCollectedDataTypePurposes</key> <array> <string>NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising</string> </array> </dict> </array> <key>NSPrivacyAccessedAPITypes</key> <array> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategoryUserDefaults</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>CA92.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategorySystemBootTime</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>35F9.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategoryFileTimestamp</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>C617.1</string> </array> </dict> </array> <key>NSPrivacyTracking</key> <true/> </dict> </plist> So, why is Apple flagging my app with "Missing API Declaration" errors? The API declaration is right there. What am I still missing?
1
0
1.2k
Apr ’24
Using Apple Push Notifications Console with Safari Web Push?
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?
0
0
865
Jan ’24
Unable to upload Game Center Achievement Image using API
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);
6
0
1.5k
Nov ’23
Bug: Can't file Feedback reports in Feedback Assistant
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
2
0
912
Nov ’23
Bug: App Store Connect API no longer returns startDate on appPrices objects
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?
0
0
779
Jan ’23
Can't file a TSI for App Store Connect API; DTS won't investigate
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.
2
0
1.9k
Aug ’22
Bug: IAP pricing API returns inconsistent results
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: "xxx", apiKey: "xxx" }); 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" ] }
1
0
1.1k
Aug ’22
Minigame support in GameKit?
My app contains hundreds of games, each of which would benefit from its own set of achievements, leaderboards, etc. Is there any hope for minigame support in GameKit?
Replies
1
Boosts
3
Views
446
Activity
Jun ’26
How do I control a SwiftUI TextField with a game controller?
I've coded a text-adventure game in SwiftUI. (My game has no graphics or sound effects.) My app already supports keyboard navigation; I would like to add support for game controllers on iPhone. I can't figure out how to do it. I especially can't see any way to allow controller users to enter text in a TextField. I've read https://developer.apple.com/documentation/gamecontroller/supporting-game-controllers and it's all about button events. There's no reference to SwiftUI at all in that documentation, or any input-method editing at all. The only mention of "keyboard" is about treating the keyboard itself as if it were a game controller providing button events. How do I implement this?
Replies
1
Boosts
1
Views
432
Activity
Jun ’26
How do I control a SwiftUI TextField with a game controller?
I've coded a text-adventure game in SwiftUI. (My game has no graphics or sound effects.) My app already supports keyboard navigation; I would like to add support for game controllers on iPhone. I can't figure out how to do it. I especially can't see any way to allow controller users to enter text in a TextField. I've read https://developer.apple.com/documentation/gamecontroller/supporting-game-controllers and it's all about button events. There's no reference to SwiftUI at all in that documentation, or any input-method editing at all. The only mention of "keyboard" is about treating the keyboard itself as if it were a game controller providing button events. How do I implement this?
Replies
0
Boosts
0
Views
360
Activity
Feb ’26
App Store Connect API `inAppPurchaseV2` returns `links.next`, even when there's no more `data`
I think there's been a recent change to the App Store Connect API; I claim that it's a bug. When querying App Store Connect API endpoints that return arrays, like https://api.appstoreconnect.apple.com/v1/apps, the response includes a links property, of type PagedDocumentLinks. https://developer.apple.com/documentation/appstoreconnectapi/pageddocumentlinks links should include a next link only if there's more data to provide, and, indeed, this is how it works for the /v1/apps endpoint. But when querying inAppPurchasesV2, I find that starting very recently (this week?) the API always returns a next link, even if there's no more data to show. { data: [], links: { self: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=APo&limit=50', first: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?limit=50', next: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=ASw' }, meta: { paging: { total: 223, nextCursor: 'ASw', limit: 50 } } } If I request the next link, it will generate me another response with empty data and with a new cursor. { data: [], links: { self: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=ASw&limit=50', first: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?limit=50', next: 'https://api.appstoreconnect.apple.com/v1/apps/1363309257/inAppPurchasesV2?cursor=AV4' }, meta: { paging: { total: 223, nextCursor: 'AV4', limit: 50 } } } Code I've written against this API (including my open-source library https://github.com/dfabulich/node-app-store-connect-api) assumes that if there's another links.next link, we should follow it; as a result, my code is looping infinitely, requesting empty data until eventually I have to give up. This issue doesn't affect other endpoints, like /v1/apps, just this inAppPurchasesV2 endpoint. Was this an intentional change? It seems to be a bug.
Replies
4
Boosts
5
Views
697
Activity
Nov ’25
"Captions" in the Accessibility Nutrition Label for text-based apps
My game app is text-based interactive fiction, containing no audio/video content, making captions unnecessary. Our game is completely accessible to deaf users. Despite this, in the Accessibility Nutrition Label, I'm only able to leave the "Captions" box checked or unchecked. Leaving it unchecked would leave deaf players with the wrong impression that they can't enjoy our game. Leaving it checked would imply that we do have A/V content with captions included. In the WWDC video on this, https://developer.apple.com/videos/play/wwdc2025/224/ the video says: After we completed common tasks, we realized our app doesn’t have any video or audio only content. In this case, we aren’t going to indicate that Landmarks supports Captions. That's okay. This accurately describes the features that people will expect to be available while using the app. Maybe that's "OK," but I wish the form allowed me to say "This app doesn't contain audio/video content."
Replies
3
Boosts
1
Views
199
Activity
Jun ’25
Intelligence Features not available in Xcode 26 beta 1
At the Platform State of the Union, Apple demoed clicking a ✨ button in the Xcode toolbar to use Apple Intelligence in Xcode. I don't see that button in Xcode Version 26.0 beta (17A5241e). Am I missing it? It's supposed to be in the upper-left corner, right? Do I need to turn it on or something? I'm on macOS 15.5 Sequoia, on a 16-inch, 2021 MacBook Pro
Replies
8
Boosts
7
Views
1.5k
Activity
Jun ’25
Can't create new app version on App Store Connect
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.
Replies
185
Boosts
119
Views
35k
Activity
Aug ’24
Privacy Manifests: Incorrect "Missing API Declaration" error
I received an email from Apple saying my app is using the following privacy-restricted APIs without an API declaration. NSPrivacyAccessedAPICategoryUserDefaults NSPrivacyAccessedAPICategoryFileTimestamp NSPrivacyAccessedAPICategorySystemBootTime It's true, my app is using those features, in multiple pods that I depend on. For example, my app depends on the FBAudienceNetwork cocoapod, and I've upgraded it to version 6.15.0, which added a privacy manifest specifically to ensure that Apple wouldn't flag my app with an error. https://developers.facebook.com/docs/audience-network/setting-up/platform-setup/ios/changelog/ I can see its privacy manifest explicitly covers these APIs, below: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSPrivacyTrackingDomains</key> <array> <string>ep1.facebook.com</string> <string>ep6.facebook.com</string> </array> <key>NSPrivacyCollectedDataTypes</key> <array> <dict> <key>NSPrivacyCollectedDataType</key> <string>NSPrivacyCollectedDataTypeAdvertisingData</string> <key>NSPrivacyCollectedDataTypeLinked</key> <true/> <key>NSPrivacyCollectedDataTypeTracking</key> <true/> <key>NSPrivacyCollectedDataTypePurposes</key> <array> <string>NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising</string> <string>NSPrivacyCollectedDataTypePurposeAnalytics</string> </array> </dict> <dict> <key>NSPrivacyCollectedDataType</key> <string>NSPrivacyCollectedDataTypeDeviceID</string> <key>NSPrivacyCollectedDataTypeLinked</key> <true/> <key>NSPrivacyCollectedDataTypeTracking</key> <true/> <key>NSPrivacyCollectedDataTypePurposes</key> <array> <string>NSPrivacyCollectedDataTypePurposeThirdPartyAdvertising</string> </array> </dict> </array> <key>NSPrivacyAccessedAPITypes</key> <array> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategoryUserDefaults</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>CA92.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategorySystemBootTime</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>35F9.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategoryFileTimestamp</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>C617.1</string> </array> </dict> </array> <key>NSPrivacyTracking</key> <true/> </dict> </plist> So, why is Apple flagging my app with "Missing API Declaration" errors? The API declaration is right there. What am I still missing?
Replies
1
Boosts
0
Views
1.2k
Activity
Apr ’24
Using Apple Push Notifications Console with Safari Web Push?
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?
Replies
0
Boosts
0
Views
865
Activity
Jan ’24
Unable to upload Game Center Achievement Image using API
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);
Replies
6
Boosts
0
Views
1.5k
Activity
Nov ’23
Bug: Can't file Feedback reports in Feedback Assistant
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
Replies
2
Boosts
0
Views
912
Activity
Nov ’23
Bug: App Store Connect API no longer permits updating app prices
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.
Replies
1
Boosts
0
Views
1.2k
Activity
Jan ’23
Bug: App Store Connect API no longer returns startDate on appPrices objects
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?
Replies
0
Boosts
0
Views
779
Activity
Jan ’23
Can't file a TSI for App Store Connect API; DTS won't investigate
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.
Replies
2
Boosts
0
Views
1.9k
Activity
Aug ’22
Bug: IAP pricing API returns inconsistent results
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: "xxx", apiKey: "xxx" }); 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" ] }
Replies
1
Boosts
0
Views
1.1k
Activity
Aug ’22