zitare-native/project.yml
Till 7b4cb13afe fix(icon): TestFlight-Validation grün — Icon + CFBundleIconName
Apple Validator hatte drei Fehler geworfen:
  - Missing 120x120 (iPhone) und 152x152 (iPad)
  - Missing Info.plist key CFBundleIconName

Root-Cause: AppIcon.appiconset hatte keinen filename gesetzt → keine
PNG-Variants im Bundle. Plus: bei GENERATE_INFOPLIST_FILE=NO injiziert
Xcode CFBundleIconName nicht automatisch, das muss explizit in die
plist.

Fixes:
- scripts/make-appicon.swift erzeugt 1024×1024-PNG-Platzhalter in
  paper-Theme-Farben (Sienna-Background, dunkles Z, zwei
  Anführungszeichen-Akzente) analog cards-native
- Sources/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
  verlinkt AppIcon-1024.png für light / dark / tinted (3 Appearances)
- project.yml setzt CFBundleIconName: AppIcon im Info.plist-Root

Archive-Verifikation:
  $ /usr/libexec/PlistBuddy -c "Print :CFBundleIconName" Info.plist
  → AppIcon
  $ ls ZitareNative.app | grep AppIcon
  → AppIcon, AppIcon60x60@2x.png (=120×120), AppIcon76x76@2x~ipad.png
    (=152×152)

Platzhalter — vor produktivem App-Store-Launch durch designtes Icon
ersetzen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 21:00:24 +02:00

224 lines
7.2 KiB
YAML

name: ZitareNative
options:
bundleIdPrefix: ev.mana
createIntermediateGroups: true
xcodeVersion: "16.0"
deploymentTarget:
iOS: "18.0"
macOS: "15.0"
developmentLanguage: de
groupSortPosition: top
generateEmptyDirectories: true
packages:
ManaSwiftCore:
path: ../mana-swift-core
ManaSwiftUI:
path: ../mana-swift-ui
settings:
base:
SWIFT_VERSION: "6.0"
SWIFT_STRICT_CONCURRENCY: complete
CURRENT_PROJECT_VERSION: "1"
MARKETING_VERSION: "0.1.0"
GENERATE_INFOPLIST_FILE: "NO"
ENABLE_USER_SCRIPT_SANDBOXING: "YES"
DEAD_CODE_STRIPPING: "YES"
CLANG_ENABLE_MODULES: "YES"
# mana e.V. Apple-Developer-Team-ID. Muss matchen mit dem AASA-
# Eintrag auf https://zitare.com/.well-known/apple-app-site-association.
DEVELOPMENT_TEAM: QP3GLU8PH3
targets:
ZitareNative:
type: application
supportedDestinations: [iOS, macOS]
dependencies:
- package: ManaSwiftCore
product: ManaCore
- package: ManaSwiftCore
product: ManaTokens
- package: ManaSwiftUI
product: ManaAuthUI
- target: ZitareWidgetExtension
embed: true
- target: ZitareShareExtension
embed: true
sources:
- path: Sources/App
- path: Sources/Features
- path: Sources/Core
- path: Sources/Resources
excludes:
- "Info.plist"
- "ZitareNative.entitlements"
info:
path: Sources/Resources/Info.plist
properties:
CFBundleShortVersionString: "0.1.0"
CFBundleVersion: "1"
CFBundleDevelopmentRegion: de
CFBundleDisplayName: Zitare
# Pflicht-Key für iOS 11+ mit Asset-Catalog-Icons. Xcode setzt
# ihn nur automatisch wenn GENERATE_INFOPLIST_FILE=YES; bei uns
# ist die Info.plist XcodeGen-getrieben, also explizit hier.
CFBundleIconName: AppIcon
LSApplicationCategoryType: "public.app-category.reference"
UILaunchScreen: {}
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
CFBundleURLTypes:
- CFBundleURLName: ev.mana.zitare
CFBundleURLSchemes:
- zitare
NSUserActivityTypes:
- NSUserActivityTypeBrowsingWeb
# WKWebView lädt zitare.com + zitare.mana.how. Beide sind
# https, kein App-Transport-Security-Override nötig.
ITSAppUsesNonExemptEncryption: false
entitlements:
path: Sources/Resources/ZitareNative.entitlements
properties:
com.apple.security.app-sandbox: true
com.apple.security.network.client: true
com.apple.security.files.user-selected.read-write: true
keychain-access-groups:
- $(AppIdentifierPrefix)ev.mana.zitare
# Universal-Link-Domains:
# - zitare.com ist die kanonische Production-Domain (steht
# auch im Manifest und im AASA-File auf zitare-com).
# - zitare.mana.how als Staging-Domain, solange die zitare.com-
# Cloudflare-Zone noch nicht aufgelöst wird (DNS-Setup
# blockiert auf separatem cloudflared-Login). Nach Cloudflare-
# Cut kann der Eintrag bleiben — schadet nicht, deckt einfach
# beide Hosts ab.
# Beide Hosts liefern identische AASA-Files (siehe nginx-app.conf
# bzw. nginx-com.conf im zitare-Repo).
com.apple.developer.associated-domains:
- applinks:zitare.com
- applinks:zitare.mana.how
com.apple.security.application-groups:
- group.ev.mana.zitare
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.zitare
CODE_SIGN_STYLE: Automatic
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
ENABLE_PREVIEWS: "YES"
ZitareShareExtension:
type: app-extension
supportedDestinations: [iOS]
sources:
- path: ShareExtension
excludes:
- "Resources/Info.plist"
- "Resources/ZitareShareExtension.entitlements"
info:
path: ShareExtension/Resources/Info.plist
properties:
CFBundleDisplayName: An Zitare schicken
CFBundleShortVersionString: "0.1.0"
CFBundleVersion: "1"
NSExtension:
NSExtensionPointIdentifier: com.apple.share-services
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController
NSExtensionAttributes:
NSExtensionActivationRule:
NSExtensionActivationSupportsText: true
NSExtensionActivationSupportsWebURLWithMaxCount: 1
entitlements:
path: ShareExtension/Resources/ZitareShareExtension.entitlements
properties:
com.apple.security.application-groups:
- group.ev.mana.zitare
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.zitare.share
CODE_SIGN_STYLE: Automatic
SKIP_INSTALL: "YES"
ZitareWidgetExtension:
type: app-extension
supportedDestinations: [iOS]
sources:
- path: Widgets/ZitareWidget
excludes:
- "Resources/Info.plist"
- "Resources/ZitareWidgetExtension.entitlements"
# Geteilter Snapshot-Code (SwiftData-Models + Container).
# Widget liest aus dem App-Group-Store, den die App befüllt.
- path: Sources/Core/Snapshot/SnapshotModels.swift
info:
path: Widgets/ZitareWidget/Resources/Info.plist
properties:
CFBundleDisplayName: Zitare Widget
CFBundleShortVersionString: "0.1.0"
CFBundleVersion: "1"
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension
entitlements:
path: Widgets/ZitareWidget/Resources/ZitareWidgetExtension.entitlements
properties:
com.apple.security.application-groups:
- group.ev.mana.zitare
dependencies:
- sdk: WidgetKit.framework
- sdk: SwiftUI.framework
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.zitare.widget
CODE_SIGN_STYLE: Automatic
SKIP_INSTALL: "YES"
INFOPLIST_KEY_CFBundleDisplayName: Zitare Widget
ZitareNativeTests:
type: bundle.unit-test
supportedDestinations: [iOS, macOS]
sources:
- Tests/UnitTests
dependencies:
- target: ZitareNative
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.zitare.tests
GENERATE_INFOPLIST_FILE: "YES"
ZitareNativeUITests:
type: bundle.ui-testing
supportedDestinations: [iOS, macOS]
sources:
- Tests/UITests
dependencies:
- target: ZitareNative
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.zitare.uitests
GENERATE_INFOPLIST_FILE: "YES"
schemes:
ZitareNative:
build:
targets:
ZitareNative: all
ZitareNativeTests: [test]
ZitareNativeUITests: [test]
test:
targets:
- ZitareNativeTests
- ZitareNativeUITests
gatherCoverageData: false
run:
config: Debug
archive:
config: Release