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.
Post
Replies
Boosts
Views
Activity
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?
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?
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);
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
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.
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?
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.
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"
]
}
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"
}
}
}
},
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.
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.)
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.)
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?
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…)