Documentation
¶
Index ¶
- Constants
- func HasTermsOfUseLink(description string) bool
- func IsValidHTTPURL(s string) bool
- func KeywordFieldLength(value string) int
- func MetadataFieldLabel(field string) string
- func NormalizeKeywordAuditTerms(terms []string) []string
- func SortedUniqueNonEmptyStrings(values []string) []string
- func ValidateKeywordField(value string) error
- type AgeRatingDeclaration
- type AppInfoLocalization
- type BetaBuildLocalization
- type BetaReviewDetails
- type Build
- type CheckResult
- type DiagnosticStatus
- type IAP
- type IAPInput
- type IAPReport
- type Input
- type KeywordAuditCheck
- type KeywordAuditInput
- type KeywordAuditLocale
- type KeywordAuditReport
- type MetadataLengthIssue
- type MetadataMinimumLengthIssue
- type Remediation
- type RemediationStep
- type Report
- type ReviewDetails
- type Screenshot
- type ScreenshotSet
- type Severity
- type Subscription
- type SubscriptionDiagnosticRow
- type SubscriptionDiagnostics
- type SubscriptionGroupLocalizationInfo
- type SubscriptionLocalizationInfo
- type SubscriptionPlanAvailabilityInfo
- type SubscriptionsInput
- type SubscriptionsReport
- type Summary
- type TestFlightInput
- type TestFlightReport
- type VersionLocalization
Constants ¶
const ( LimitDescription = 4000 LimitKeywords = 100 LimitWhatsNew = 4000 LimitPromotionalText = 170 LimitName = 30 LimitSubtitle = 30 )
App Store metadata character limits.
const ( LimitMarketingURL = 255 LimitSupportURL = 255 LimitPrivacyPolicyURL = 255 LimitPrivacyChoicesURL = 255 )
App Store metadata URL length limits.
Apple's App Store Connect OpenAPI specification carries no maxLength for these attributes, so the values below track Apple's documented App Store Connect field constraints instead of a machine-readable schema. Checks built on them are advisory (warning severity) so a longer value Apple happens to accept never hard-fails a local run.
const ( MinLengthName = 2 MinLengthDescription = 10 )
Minimum lengths that separate real metadata from placeholders such as "X" or "TBD". Apple states no exact minimum in a machine-readable form, so these only ever produce warnings.
const AppleStandardEULAURL = "https://www.apple.com/legal/internet-services/itunes/dev/stdeula/"
const LimitScreenshotsPerSet = 10
LimitScreenshotsPerSet is the maximum number of screenshots the App Store accepts in a single screenshot set, meaning one display type within one localization. The App Store Connect OpenAPI snapshot does not express this cap, so it is enforced server-side at upload time.
Variables ¶
This section is empty.
Functions ¶
func HasTermsOfUseLink ¶
HasTermsOfUseLink reports whether a description includes a functional Terms of Use / EULA link.
func IsValidHTTPURL ¶ added in v1.260825.0
IsValidHTTPURL reports whether a value is an absolute HTTP/HTTPS URL with a hostname and no raw whitespace, matching the URL syntax App Store Connect accepts for metadata URL fields. It is exported so offline metadata checks apply the same rule as the online validation report.
func KeywordFieldLength ¶ added in v1.260407.0
KeywordFieldLength returns the App Store Connect keyword field length in characters.
func MetadataFieldLabel ¶ added in v1.260825.0
MetadataFieldLabel returns the operator-facing label for a metadata field.
func NormalizeKeywordAuditTerms ¶ added in v1.260407.0
NormalizeKeywordAuditTerms trims, de-duplicates, and sorts user-supplied terms.
func SortedUniqueNonEmptyStrings ¶ added in v1.260325.0
SortedUniqueNonEmptyStrings trims, deduplicates, and sorts a string slice.
func ValidateKeywordField ¶ added in v1.260407.0
ValidateKeywordField returns an error when the keyword field exceeds ASC's character limit.
Types ¶
type AgeRatingDeclaration ¶
type AgeRatingDeclaration struct {
Advertising *bool
Gambling *bool
HealthOrWellnessTopics *bool
LootBox *bool
MessagingAndChat *bool
ParentalControls *bool
AgeAssurance *bool
SocialMedia *bool
SocialMediaAgeRestricted *bool
UnrestrictedWebAccess *bool
UserGeneratedContent *bool
AlcoholTobaccoOrDrugUseOrReferences *string
Contests *string
GamblingSimulated *string
GunsOrOtherWeapons *string
MedicalOrTreatmentInformation *string
ProfanityOrCrudeHumor *string
SexualContentGraphicAndNudity *string
SexualContentOrNudity *string
HorrorOrFearThemes *string
MatureOrSuggestiveThemes *string
ViolenceCartoonOrFantasy *string
ViolenceRealistic *string
ViolenceRealisticProlongedGraphicOrSadistic *string
KidsAgeBand *string
AgeRatingOverride *string
AgeRatingOverrideV2 *string
KoreaAgeRatingOverride *string
DeveloperAgeRatingInfoURL *string
}
AgeRatingDeclaration represents age rating attributes for validation.
type AppInfoLocalization ¶
type AppInfoLocalization struct {
ID string
Locale string
Name string
Subtitle string
PrivacyPolicyURL string
PrivacyChoicesURL string
}
AppInfoLocalization represents app info metadata.
type BetaBuildLocalization ¶
BetaBuildLocalization represents a build localization (TestFlight "What to Test").
type BetaReviewDetails ¶
type BetaReviewDetails struct {
ID string
ContactFirstName string
ContactLastName string
ContactEmail string
ContactPhone string
DemoAccountName string
DemoAccountPassword string
DemoAccountRequired bool
Notes string
}
BetaReviewDetails represents TestFlight beta app review details.
type Build ¶
type Build struct {
ID string
Version string
ProcessingState string
Expired bool
UsesNonExemptEncryption *bool
AppEncryptionDeclarationID string
AppEncryptionDeclarationState string
}
Build represents an attached build for a version.
type CheckResult ¶
type CheckResult struct {
ID string `json:"id"`
Severity Severity `json:"severity"`
Message string `json:"message"`
Remediation string `json:"remediation,omitempty"`
Locale string `json:"locale,omitempty"`
Field string `json:"field,omitempty"`
ResourceType string `json:"resourceType,omitempty"`
ResourceID string `json:"resourceId,omitempty"`
}
CheckResult represents a single validation check result.
func PrivacyPublishStateAdvisory ¶
func PrivacyPublishStateAdvisory(appID string) CheckResult
PrivacyPublishStateAdvisory returns a public-only advisory for App Privacy.
type DiagnosticStatus ¶ added in v1.260325.0
type DiagnosticStatus string
DiagnosticStatus captures the state of a subscription diagnostics row.
const ( DiagnosticStatusYes DiagnosticStatus = "yes" DiagnosticStatusNo DiagnosticStatus = "no" DiagnosticStatusUnverified DiagnosticStatus = "unverified" DiagnosticStatusUnknown DiagnosticStatus = "unknown" DiagnosticStatusOptional DiagnosticStatus = "optional" )
type IAPReport ¶
type IAPReport struct {
AppID string `json:"appId"`
IAPCount int `json:"iapCount,omitempty"`
Summary Summary `json:"summary"`
Checks []CheckResult `json:"checks"`
Strict bool `json:"strict,omitempty"`
}
IAPReport is the top-level validate iap output.
func ValidateIAP ¶
ValidateIAP validates IAP review readiness and returns a report.
type Input ¶
type Input struct {
AppID string
AppInfoID string
VersionID string
VersionString string
VersionState string
Platform string
PrimaryLocale string
VersionLocalizations []VersionLocalization
AppInfoLocalizations []AppInfoLocalization
ReviewDetails *ReviewDetails
PrimaryCategoryID string
ContentRightsDeclaration *string
Build *Build
PriceScheduleID string
PricingFetchSkipReason string
AvailabilityID string
AvailableTerritories int
AppAvailableTerritories []string
PricingTerritories []string
PricingTerritoryCount int
AvailabilityFetchSkipReason string
PricingCoverageSkipReason string
ScreenshotSets []ScreenshotSet
Subscriptions []Subscription
SubscriptionFetchSkipReason string
IAPs []IAP
IAPFetchSkipReason string
AgeRatingDeclaration *AgeRatingDeclaration
ReleaseType string
EarliestReleaseDate string
Copyright string
}
Input collects the validation inputs.
type KeywordAuditCheck ¶ added in v1.260407.0
type KeywordAuditCheck struct {
ID string `json:"id"`
Severity Severity `json:"severity"`
Message string `json:"message"`
Remediation string `json:"remediation,omitempty"`
Locale string `json:"locale,omitempty"`
Field string `json:"field,omitempty"`
Keyword string `json:"keyword,omitempty"`
MatchedTerm string `json:"matchedTerm,omitempty"`
RelatedLocales []string `json:"relatedLocales,omitempty"`
UsedCharacters int `json:"usedBytes,omitempty"`
RemainingCharacters int `json:"remainingBytes,omitempty"`
}
KeywordAuditCheck represents one keyword-audit finding.
type KeywordAuditInput ¶ added in v1.260407.0
type KeywordAuditInput struct {
AppID string
VersionID string
VersionString string
Platform string
BlockedTerms []string
VersionLocalizations []VersionLocalization
AppInfoLocalizations []AppInfoLocalization
}
KeywordAuditInput describes the inputs for a keyword audit report.
type KeywordAuditLocale ¶ added in v1.260407.0
type KeywordAuditLocale struct {
Locale string `json:"locale"`
VersionLocalizationID string `json:"versionLocalizationId,omitempty"`
AppInfoLocalizationID string `json:"appInfoLocalizationId,omitempty"`
KeywordField string `json:"keywordField,omitempty"`
KeywordCount int `json:"keywordCount"`
// Legacy JSON field names are retained for compatibility with existing audit consumers.
UsedCharacters int `json:"usedBytes"`
RemainingCharacters int `json:"remainingBytes"`
Name string `json:"name,omitempty"`
Subtitle string `json:"subtitle,omitempty"`
Errors int `json:"errors"`
Warnings int `json:"warnings"`
Infos int `json:"infos"`
}
KeywordAuditLocale summarizes one audited locale.
type KeywordAuditReport ¶ added in v1.260407.0
type KeywordAuditReport struct {
AppID string `json:"appId"`
VersionID string `json:"versionId"`
VersionString string `json:"versionString,omitempty"`
Platform string `json:"platform,omitempty"`
BlockedTerms []string `json:"blockedTerms,omitempty"`
Summary Summary `json:"summary"`
Locales []KeywordAuditLocale `json:"locales"`
Checks []KeywordAuditCheck `json:"checks"`
Strict bool `json:"strict,omitempty"`
}
KeywordAuditReport is the top-level keyword-audit output.
func AuditKeywords ¶ added in v1.260407.0
func AuditKeywords(input KeywordAuditInput, strict bool) KeywordAuditReport
AuditKeywords builds a keyword-quality report across version localizations.
type MetadataLengthIssue ¶
MetadataLengthIssue describes one over-limit metadata field.
func AppInfoLocalizationLengthIssues ¶
func AppInfoLocalizationLengthIssues(loc AppInfoLocalization) []MetadataLengthIssue
AppInfoLocalizationLengthIssues returns over-limit fields for one app-info localization.
func KeywordFieldLengthIssue ¶ added in v1.260407.0
func KeywordFieldLengthIssue(value string) *MetadataLengthIssue
KeywordFieldLengthIssue returns an over-limit issue for keywords when present.
func VersionLocalizationLengthIssues ¶
func VersionLocalizationLengthIssues(loc VersionLocalization) []MetadataLengthIssue
VersionLocalizationLengthIssues returns over-limit fields for one version localization.
type MetadataMinimumLengthIssue ¶ added in v1.260825.0
MetadataMinimumLengthIssue describes one metadata field that is too short to be real content.
func AppInfoLocalizationMinimumLengthIssues ¶ added in v1.260825.0
func AppInfoLocalizationMinimumLengthIssues(loc AppInfoLocalization) []MetadataMinimumLengthIssue
AppInfoLocalizationMinimumLengthIssues returns implausibly short fields for one app-info localization.
func VersionLocalizationMinimumLengthIssues ¶ added in v1.260825.0
func VersionLocalizationMinimumLengthIssues(loc VersionLocalization) []MetadataMinimumLengthIssue
VersionLocalizationMinimumLengthIssues returns implausibly short fields for one version localization. Empty values are left to the required-field checks, which distinguish "unset" from "too short".
type Remediation ¶ added in v1.260407.0
type Remediation struct {
TotalActionable int `json:"totalActionable"`
Steps []RemediationStep `json:"steps"`
}
Remediation summarizes actionable validation steps in priority order.
func BuildRemediation ¶ added in v1.260407.0
func BuildRemediation(checks []CheckResult, strict bool) Remediation
BuildRemediation derives an ordered remediation plan from validation checks.
type RemediationStep ¶ added in v1.260407.0
type RemediationStep struct {
Order int `json:"order"`
Blocking bool `json:"blocking"`
Severity Severity `json:"severity"`
CheckID string `json:"checkId"`
Message string `json:"message"`
Remediation string `json:"remediation"`
Locale string `json:"locale,omitempty"`
Field string `json:"field,omitempty"`
ResourceType string `json:"resourceType,omitempty"`
ResourceID string `json:"resourceId,omitempty"`
}
RemediationStep represents one actionable item derived from a validation check.
func RemediationSteps ¶ added in v1.260407.0
func RemediationSteps(checks []CheckResult, strict bool) []RemediationStep
RemediationSteps orders actionable remediation steps from most urgent to least urgent.
type Report ¶
type Report struct {
AppID string `json:"appId"`
VersionID string `json:"versionId"`
VersionString string `json:"versionString,omitempty"`
Platform string `json:"platform,omitempty"`
Summary Summary `json:"summary"`
Remediation Remediation `json:"remediation"`
Checks []CheckResult `json:"checks"`
Strict bool `json:"strict,omitempty"`
}
Report is the top-level validation output.
type ReviewDetails ¶
type ReviewDetails struct {
ID string
ContactFirstName string
ContactLastName string
ContactEmail string
ContactPhone string
DemoAccountName string
DemoAccountPassword string
DemoAccountRequired bool
Notes string
}
ReviewDetails represents App Store review details for a version.
type Screenshot ¶
Screenshot represents a screenshot asset.
type ScreenshotSet ¶
type ScreenshotSet struct {
ID string
DisplayType string
Locale string
LocalizationID string
Screenshots []Screenshot
}
ScreenshotSet represents a screenshot set and its assets.
type Severity ¶
type Severity string
Severity represents the validation severity level.
func MetadataLengthSeverity ¶ added in v1.260825.0
MetadataLengthSeverity returns the severity for an over-limit metadata field. URL limits are documented rather than schema-backed, so they stay advisory while the text limits Apple publishes per field remain blocking.
type Subscription ¶
type Subscription struct {
ID string
Name string
ProductID string
State string
GroupID string
GroupName string
HasImage bool
ImageCheckSkipped bool
ImageCheckSkipReason string
ReviewScreenshotID string
ReviewScreenshotAssetDeliveryState string
ReviewScreenshotAssetDeliveryErrors []string
ReviewScreenshotCheckSkipped bool
ReviewScreenshotCheckReason string
AvailabilityID string
AvailabilityTerritories []string
AvailabilityCheckSkipped bool
AvailabilityCheckSkipReason string
AvailabilityInNewTerritories *bool
SubscriptionPeriod string
PlanAvailabilities []SubscriptionPlanAvailabilityInfo
PlanAvailabilityCheckSkipped bool
PlanAvailabilityCheckReason string
// Deep diagnostics (populated when State is MISSING_METADATA).
Localizations []SubscriptionLocalizationInfo
LocalizationCheckSkipped bool
LocalizationCheckSkipReason string
GroupLocalizations []SubscriptionGroupLocalizationInfo
GroupLocalizationCheckSkipped bool
GroupLocalizationCheckReason string
PriceCount int
PriceTerritories []string
PriceCheckSkipped bool
PriceCheckSkipReason string
IntroductoryOfferCount int
IntroductoryOfferCheckSkipped bool
IntroductoryOfferCheckReason string
PromotionalOfferCount int
PromotionalOfferCheckSkipped bool
PromotionalOfferCheckReason string
WinBackOfferCount int
WinBackOfferCheckSkipped bool
WinBackOfferCheckReason string
}
Subscription represents an auto-renewable subscription for review-readiness validation.
type SubscriptionDiagnosticRow ¶ added in v1.260325.0
type SubscriptionDiagnosticRow struct {
Key string `json:"key"`
Label string `json:"label"`
Status DiagnosticStatus `json:"status"`
Source string `json:"source"`
Blocking bool `json:"blocking"`
Evidence string `json:"evidence,omitempty"`
Remediation string `json:"remediation,omitempty"`
}
SubscriptionDiagnosticRow captures a single diagnostics row for a subscription.
type SubscriptionDiagnostics ¶ added in v1.260325.0
type SubscriptionDiagnostics struct {
SubscriptionID string `json:"subscriptionId"`
Name string `json:"name,omitempty"`
ProductID string `json:"productId,omitempty"`
State string `json:"state,omitempty"`
Conclusion string `json:"conclusion"`
Summary string `json:"summary,omitempty"`
Rows []SubscriptionDiagnosticRow `json:"rows"`
}
SubscriptionDiagnostics is the detailed diagnostics output for a subscription.
type SubscriptionGroupLocalizationInfo ¶
SubscriptionGroupLocalizationInfo holds per-locale metadata for a subscription group.
type SubscriptionLocalizationInfo ¶
SubscriptionLocalizationInfo holds per-locale metadata for a subscription.
type SubscriptionPlanAvailabilityInfo ¶ added in v1.260716.0
type SubscriptionPlanAvailabilityInfo struct {
ID string
PlanType string
AvailableInNewTerritories *bool
Territories []string
}
SubscriptionPlanAvailabilityInfo holds one billing plan's territory availability.
type SubscriptionsInput ¶
type SubscriptionsInput struct {
AppID string
Subscriptions []Subscription
AvailableTerritories int
AppAvailableTerritories []string
AppAvailabilityCoverageSkipReason string
PricingTerritories []string
PricingTerritoryCount int
PricingCoverageSkipReason string
AppBuildCount int
BuildCheckSkipped bool
BuildCheckSkipReason string
}
SubscriptionsInput collects subscription validation inputs.
type SubscriptionsReport ¶
type SubscriptionsReport struct {
AppID string `json:"appId"`
SubscriptionCount int `json:"subscriptionCount,omitempty"`
Summary Summary `json:"summary"`
Checks []CheckResult `json:"checks"`
Diagnostics []SubscriptionDiagnostics `json:"diagnostics,omitempty"`
Strict bool `json:"strict,omitempty"`
}
SubscriptionsReport is the top-level validate subscriptions output.
func ValidateSubscriptions ¶
func ValidateSubscriptions(input SubscriptionsInput, strict bool) SubscriptionsReport
ValidateSubscriptions validates subscription review readiness and returns a report.
type Summary ¶
type Summary struct {
Errors int `json:"errors"`
Warnings int `json:"warnings"`
Infos int `json:"infos"`
Blocking int `json:"blocking"`
}
Summary aggregates check counts by severity.
type TestFlightInput ¶
type TestFlightInput struct {
AppID string
AppPrimaryLocale string
BuildID string
Build *Build
BuildAppID string
BetaReviewDetails *BetaReviewDetails
BetaBuildLocalizations []BetaBuildLocalization
}
TestFlightInput collects the TestFlight validation inputs.
type TestFlightReport ¶
type TestFlightReport struct {
AppID string `json:"appId"`
BuildID string `json:"buildId"`
BuildVersion string `json:"buildVersion,omitempty"`
Summary Summary `json:"summary"`
Checks []CheckResult `json:"checks"`
Strict bool `json:"strict,omitempty"`
}
TestFlightReport is the top-level validate testflight output.
func ValidateTestFlight ¶
func ValidateTestFlight(input TestFlightInput, strict bool) TestFlightReport
ValidateTestFlight runs TestFlight validation rules and returns a report.
Source Files
¶
- age_rating.go
- builds.go
- categories.go
- content.go
- iap.go
- keyword_audit.go
- keywords.go
- legal.go
- limits.go
- metadata.go
- monetization.go
- pricing_availability.go
- privacy_publish_state.go
- release.go
- remediation.go
- report.go
- required_fields.go
- review_details.go
- screenshots.go
- submit_readiness.go
- subscriptions_diagnostics.go
- subscriptions_validate.go
- testflight_report.go
- testflight_types.go
- types.go