Δημοσίευση .NET MAUI σε App Store & Google Play: Οδηγός 2026

Πλήρης οδηγός deployment .NET MAUI σε App Store και Google Play το 2026 με code signing, privacy manifests, .ipa/.aab και CI/CD σε GitHub Actions.

Δημοσίευση .NET MAUI σε App Store & Play 2026

Ενημερώθηκε: 13 Ιουνίου 2026

Η δημοσίευση μιας .NET MAUI εφαρμογής σε App Store και Google Play το 2026 απαιτεί τέσσερα βασικά βήματα: ρύθμιση code signing (Apple Developer profile και Android keystore), δημιουργία release build με dotnet publish για κάθε πλατφόρμα, υποβολή του .ipa στο App Store Connect μέσω Transporter, και τέλος upload του Android App Bundle (.aab) στο Google Play Console. Σε αυτόν τον οδηγό περπατάμε ολόκληρη τη διαδικασία deployment .NET MAUI για iOS και Android, με τις απαιτήσεις του 2026 (privacy manifests, target API level 35, App Tracking Transparency) και ένα πλήρες CI/CD pipeline σε GitHub Actions. Στο πιο πρόσφατο project που έστησα, χάσαμε σχεδόν μία εβδομάδα σε rejections επειδή αγνοήσαμε δύο μικρές λεπτομέρειες· γι' αυτό θα τις δούμε αναλυτικά.

  • Η Apple απαιτεί υποχρεωτικά privacy manifest (PrivacyInfo.xcprivacy) και ορθές δηλώσεις για required reason APIs από την 1η Μαΐου 2024 και μετά. Χωρίς αυτό, η υποβολή απορρίπτεται αυτόματα.
  • Το Google Play απαιτεί target API level 35 (Android 15) για νέες εφαρμογές και ενημερώσεις από τον Αύγουστο 2025, καθώς και υποβολή αποκλειστικά σε μορφή Android App Bundle (.aab).
  • Για iOS χρειάζεσαι Apple Developer Program ($99/έτος), provisioning profile τύπου App Store και distribution certificate. Για Android, ένα upload keystore και ενεργοποιημένο Play App Signing.
  • Το dotnet publish -f net9.0-ios -c Release παράγει .ipa, ενώ το dotnet publish -f net9.0-android -c Release -p:AndroidPackageFormat=aab παράγει .aab έτοιμο για υποβολή.
  • Με ένα CI/CD pipeline σε GitHub Actions ή Azure DevOps μπορείς να αυτοματοποιήσεις signing, build και upload σε TestFlight και Google Play Internal Testing με κάθε push σε main.

Προαπαιτούμενα για δημοσίευση το 2026

Πριν ξεκινήσεις τη διαδικασία deployment, χρειάζεσαι έναν συγκεκριμένο συνδυασμό λογαριασμών, εργαλείων και ρυθμίσεων. Στην πράξη, η λίστα δεν έχει αλλάξει δραματικά από το 2024. Όμως οι απαιτήσεις target API και τα privacy manifests κάνουν τη ζωή πιο δύσκολη σε όσους αμελούν την προετοιμασία.

  • Apple Developer Program: $99/έτος, με ενεργοποιημένο τον λογαριασμό σου στο App Store Connect.
  • Google Play Console: $25 εφάπαξ τέλος. Από το 2024 απαιτείται επιπλέον επαλήθευση ταυτότητας (D-U-N-S ή προσωπικό ID), και η νέα εφαρμογή σου χρειάζεται 20 closed testers για 14 ημέρες πριν το production rollout.
  • Mac με Xcode 16+ για iOS builds. Ακόμη και όταν χρησιμοποιείς Visual Studio σε Windows, χρειάζεσαι remote pair Mac για signing.
  • .NET 9 SDK με workloads maui, ios, android εγκατεστημένα μέσω dotnet workload install maui. Πάντα καλό να ελέγξεις την επίσημη τεκμηρίωση .NET MAUI της Microsoft για τις τρέχουσες εκδόσεις.
  • App icon και splash στις σωστές αναλύσεις, screenshots σε όλες τις απαιτούμενες συσκευές (iPhone 6.9", iPhone 6.5", iPad Pro 12.9", Android phone/tablet) και πλήρης περιγραφή στα ελληνικά για την ελληνική αγορά.

Code signing και provisioning για iOS

Το iOS code signing παραμένει ένα από τα πιο μπερδεμένα κομμάτια του deployment. Στην ουσία, χρειάζεσαι τρία πράγματα: ένα Distribution Certificate στο Keychain σου, ένα App ID καταχωρημένο στο Apple Developer portal, και ένα Provisioning Profile τύπου "App Store" που τα συνδέει.

Στο .NET MAUI, ορίζεις ποιο profile και ποιο certificate θα χρησιμοποιηθεί απευθείας στο .csproj ή στο publish command:

<PropertyGroup Condition="'$(Configuration)' == 'Release' and $(TargetFramework.Contains('-ios'))">
  <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
  <CodesignKey>Apple Distribution: Your Company (TEAMID)</CodesignKey>
  <CodesignProvision>MyMauiApp AppStore Profile</CodesignProvision>
  <CodesignEntitlements>Platforms/iOS/Entitlements.plist</CodesignEntitlements>
  <ArchiveOnBuild>true</ArchiveOnBuild>
</PropertyGroup>

Το CodesignProvision πρέπει να ταιριάζει ακριβώς με το Name του profile, όχι το UUID. (Σ' αυτό το σημείο έχω χάσει αρκετές ώρες σε προηγούμενα projects.) Αν δουλεύεις σε CI, κατέβασε το .mobileprovision και τοποθέτησέ το στο ~/Library/MobileDevice/Provisioning Profiles/ πριν τρέξεις build. Για το certificate, χρησιμοποίησε το Apple-Actions/import-codesign-certs action, που εισάγει αυτόματα .p12 αρχείο στο runner keychain.

Keystore και Play App Signing για Android

Για Android χρειάζεσαι ένα upload keystore που υπογράφει τοπικά το .aab πριν το ανεβάσεις στο Play Console. Το Google αναλαμβάνει την υπογραφή για διανομή (Play App Signing), κρατώντας ένα ξεχωριστό app signing key. Αυτό σημαίνει ότι αν χάσεις το upload keystore, μπορείς να αιτηθείς reset· δεν χάνεις την εφαρμογή σου, σε αντίθεση με παλιότερες εποχές.

Δημιούργησε το upload keystore με keytool:

keytool -genkeypair -v \
  -keystore mymauiapp-upload.keystore \
  -alias mymauiapp \
  -keyalg RSA -keysize 2048 -validity 10000 \
  -storepass "$KEYSTORE_PASSWORD" \
  -keypass "$KEY_PASSWORD" \
  -dname "CN=Mobile Tech Lead, OU=Engineering, O=Acme, L=Athens, C=GR"

Στη συνέχεια ρύθμισε το .csproj ώστε να υπογράφει αυτόματα το AAB:

<PropertyGroup Condition="'$(Configuration)' == 'Release' and $(TargetFramework.Contains('-android'))">
  <AndroidPackageFormat>aab</AndroidPackageFormat>
  <AndroidKeyStore>true</AndroidKeyStore>
  <AndroidSigningKeyStore>mymauiapp-upload.keystore</AndroidSigningKeyStore>
  <AndroidSigningKeyAlias>mymauiapp</AndroidSigningKeyAlias>
  <AndroidSigningKeyPass>$(KEY_PASSWORD)</AndroidSigningKeyPass>
  <AndroidSigningStorePass>$(KEYSTORE_PASSWORD)</AndroidSigningStorePass>
</PropertyGroup>

Μη βάλεις ποτέ τα passwords σε commit. Πέρνα τα σαν environment variables στο CI ή χρησιμοποίησε dotnet user-secrets τοπικά. Για περισσότερα μοτίβα ασφαλείας στο .NET MAUI, δες τον οδηγό μας για ασφάλεια εφαρμογών .NET MAUI με SecureStorage και OAuth.

Πώς να φτιάξεις το .ipa αρχείο για App Store

Με ρυθμισμένο code signing, η δημιουργία ενός υπογεγραμμένου .ipa είναι μία εντολή. Από Mac terminal, μέσα στον φάκελο του project:

dotnet publish -f:net9.0-ios -c:Release \
  -p:RuntimeIdentifier=ios-arm64 \
  -p:ArchiveOnBuild=true \
  -p:CodesignKey="Apple Distribution: Acme Inc (ABCDE12345)" \
  -p:CodesignProvision="MyMauiApp AppStore Profile" \
  -o ./artifacts/ios

Το αποτέλεσμα είναι ένα .ipa μέσα στο artifacts/ios. Στη συνέχεια ανεβάζεις στο App Store Connect με τρεις τρόπους:

  1. Transporter.app (δωρεάν από το Mac App Store): drag-and-drop, οπτικά απλό αλλά χειροκίνητο.
  2. xcrun altool --upload-app: απαρχαιωμένο από Xcode 14+, οπότε απόφυγέ το.
  3. xcrun notarytool και xcrun iTMSTransporter: η σύγχρονη CI επιλογή για αυτοματοποιημένο upload.

Για CI, χρησιμοποίησε App Store Connect API key (Issuer ID + Key ID + .p8) αντί για username/password. Παράδειγμα:

xcrun iTMSTransporter -m upload \
  -assetFile artifacts/ios/MyMauiApp.ipa \
  -apiKey $APP_STORE_KEY_ID \
  -apiIssuer $APP_STORE_ISSUER_ID

Δημιουργία Android App Bundle (.aab)

Το Google Play δεν δέχεται πλέον .apk για νέες εφαρμογές. Μόνο Android App Bundle (.aab). Η διαφορά είναι ότι το AAB περιέχει όλα τα assets, locales και ABI splits, και το Google παράγει βελτιστοποιημένα APK για κάθε συσκευή στο install time. Αυτό μειώνει το μέγεθος εγκατάστασης κατά 30–50% σε σύγκριση με universal APK. Αρκετά καλό deal, αν θες τη γνώμη μου.

Με το .NET MAUI:

dotnet publish -f:net9.0-android -c:Release \
  -p:AndroidPackageFormat=aab \
  -p:AndroidKeyStore=true \
  -p:AndroidSigningKeyStore=mymauiapp-upload.keystore \
  -p:AndroidSigningKeyAlias=mymauiapp \
  -p:AndroidSigningStorePass=$KEYSTORE_PASSWORD \
  -p:AndroidSigningKeyPass=$KEY_PASSWORD \
  -o ./artifacts/android

Στο ./artifacts/android θα βρεις το com.acme.mymauiapp-Signed.aab. Πριν το ανεβάσεις, επιβεβαίωσε με bundletool ότι το AAB είναι έγκυρο και τρέχει σωστά σε device με bundletool build-apks --bundle=app.aab --output=app.apks.

Για το upload στο Google Play, ο πιο καθαρός τρόπος σε CI είναι το r0adkll/upload-google-play GitHub Action με Service Account JSON. Αν χτίζεις μια Xamarin εφαρμογή που μεταναστεύει σε MAUI, δες τον οδηγό μας για migration από Xamarin.Forms σε .NET MAUI πριν ξεκινήσεις deployment.

Privacy manifests και App Tracking Transparency

Από την 1η Μαΐου 2024 και μετά, η Apple απαιτεί privacy manifest (PrivacyInfo.xcprivacy) για κάθε νέα ή ενημερωμένη εφαρμογή. Αν η εφαρμογή σου ή κάποιο SDK που χρησιμοποιείς (π.χ. Firebase, Sentry, ή τρίτων NuGet packages) καλεί ένα από τα required reason APIs, όπως UserDefaults ή FileManager.creationDate, πρέπει να δηλώσεις τον λόγο. Όλη η λίστα υπάρχει στην επίσημη τεκμηρίωση Apple για privacy manifests.

Δημιούργησε το αρχείο στο Platforms/iOS/PrivacyInfo.xcprivacy:

<?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>NSPrivacyTracking</key>
  <false/>
  <key>NSPrivacyCollectedDataTypes</key>
  <array/>
  <key>NSPrivacyAccessedAPITypes</key>
  <array>
    <dict>
      <key>NSPrivacyAccessedAPIType</key>
      <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
      <key>NSPrivacyAccessedAPITypeReasons</key>
      <array><string>CA92.1</string></array>
    </dict>
  </array>
</dict>
</plist>

Σύνδεσέ το στο .csproj:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\PrivacyInfo.xcprivacy"
                  LogicalName="PrivacyInfo.xcprivacy" />
</ItemGroup>

Αν εμφανίζεις διαφημίσεις ή κάνεις cross-app tracking, χρειάζεσαι App Tracking Transparency (ATT). Στο .NET MAUI χρησιμοποίησε το AppTrackingTransparency bindings ή το Plugin.MauiAppTracking. Πρόσθεσε επίσης NSUserTrackingUsageDescription στο Info.plist· χωρίς αυτό, η app crashάρει όταν καλέσεις το prompt. (Αυτό ακριβώς το bug με έπιασε σε μία υποβολή πέρυσι· hard-fail στο App Review και άμεσο rejection.)

TestFlight και Google Play Internal Testing

Μη ανεβάσεις ποτέ απευθείας σε production. Και οι δύο πλατφόρμες προσφέρουν beta channels που σου επιτρέπουν να δοκιμάσεις την υποβολή πριν τη ζωντανή κυκλοφορία.

TestFlight (Apple)

Όταν ανεβάσεις ένα build στο App Store Connect, εμφανίζεται αυτόματα στο TestFlight μετά την επεξεργασία (συνήθως 10–30 λεπτά). Μπορείς να καλέσεις έως 100 internal testers (μέλη του Apple Developer team) και έως 10.000 external testers μέσω public link. Τα external builds απαιτούν beta App Review, συνήθως 24 ώρες.

Google Play Internal Testing

Στο Play Console, δημιούργησε ένα Internal testing track και πρόσθεσε emails ή Google Groups. Σε αντίθεση με το TestFlight, η διανομή είναι σχεδόν άμεση. Νέο για το 2024+: για νέους personal developer accounts απαιτούνται 20 testers για 14 ημέρες πριν προωθήσεις την εφαρμογή σε production. Σχεδίασε το roadmap σου ανάλογα.

CI/CD με GitHub Actions

Ένα πλήρες pipeline σε GitHub Actions αυτοματοποιεί κάθε βήμα: checkout, restore, build, signing, upload. Παράδειγμα workflow για iOS:

name: Deploy iOS to TestFlight

on:
  push:
    branches: [main]

jobs:
  ios:
    runs-on: macos-15
    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET 9
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x

      - name: Install MAUI workload
        run: dotnet workload install maui-ios

      - name: Import signing certificate
        uses: Apple-Actions/import-codesign-certs@v3
        with:
          p12-file-base64: ${{ secrets.IOS_DIST_CERT_P12 }}
          p12-password: ${{ secrets.IOS_DIST_CERT_PASSWORD }}

      - name: Download provisioning profile
        uses: Apple-Actions/download-provisioning-profiles@v3
        with:
          bundle-id: com.acme.mymauiapp
          profile-type: IOS_APP_STORE
          issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
          api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
          api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }}

      - name: Publish IPA
        run: |
          dotnet publish src/MyMauiApp/MyMauiApp.csproj \
            -f net9.0-ios -c Release \
            -p:ArchiveOnBuild=true \
            -p:ApplicationDisplayVersion=1.0.${{ github.run_number }} \
            -p:ApplicationVersion=${{ github.run_number }}

      - name: Upload to TestFlight
        uses: Apple-Actions/upload-testflight-build@v3
        with:
          app-path: src/MyMauiApp/bin/Release/net9.0-ios/ios-arm64/publish/MyMauiApp.ipa
          issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }}
          api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
          api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }}

Για Android, το ισοδύναμο pipeline τρέχει σε ubuntu-latest, υπογράφει με AndroidKeyStore properties από secrets, και ανεβάζει με r0adkll/upload-google-play στο internal track. Επειδή τα Release builds του .NET MAUI ενεργοποιούν βελτιστοποιήσεις απόδοσης όπως compiled bindings και NativeAOT, αναμένουμε build times γύρω στα 8–15 λεπτά ανά πλατφόρμα σε GitHub-hosted runners.

Συχνοί λόγοι απόρριψης και πώς να τους αποφύγεις

Σύμφωνα με δεδομένα από το App Store Connect του 2025, πάνω από το 40% των απορρίψεων αφορά τους ίδιους πέντε λόγους. Έλεγξέ τους πριν υποβάλεις:

Λόγος απόρριψηςApple App StoreGoogle Play
Λείπει privacy manifest / Data Safety formΣυχνότατο (Guideline 5.1.2)Συχνό (Data Safety section)
Crash στο launchΠολύ συχνό (Guideline 2.1)Συχνό (pre-launch report)
Λανθασμένο target API/SDKiOS 17 SDK minimum από Απρίλιος 2025Target API 35 απαιτητικό
Demo account λείπειΣυχνό για apps με loginΣπάνιο
Παραπλανητικά screenshots/metadataGuideline 2.3Policy: Misrepresentation
ATT prompt χωρίς usage descriptionCrash στο reviewΔεν ισχύει

Δοκίμασε πάντα την έκδοση σε φυσική συσκευή που δεν είναι το dev machine σου, γιατί πολλά crashes εμφανίζονται μόνο όταν τρέχει χωρίς attached debugger. Για apps με authentication, πρόσθεσε demo credentials στο πεδίο "App Review Information" του App Store Connect. Πίστεψέ με, ένα reject επειδή ο reviewer δεν μπόρεσε να μπει στην εφαρμογή σου είναι από τα πιο εκνευριστικά.

Συχνές ερωτήσεις

Πώς δημοσιεύω μια .NET MAUI εφαρμογή στο App Store;

Χρειάζεσαι Apple Developer Program λογαριασμό, distribution certificate, App Store provisioning profile και ένα Mac με Xcode 16+. Τρέξε dotnet publish -f net9.0-ios -c Release -p:ArchiveOnBuild=true για να φτιάξεις υπογεγραμμένο .ipa και ανέβασέ το στο App Store Connect μέσω Transporter ή iTMSTransporter.

Υποστηρίζει το .NET MAUI Android App Bundle (.aab);

Ναι, πλήρως. Πέρνα -p:AndroidPackageFormat=aab στο dotnet publish και το MAUI παράγει υπογεγραμμένο .aab έτοιμο για υποβολή στο Google Play. Από το 2021 το Google Play δέχεται μόνο AAB για νέες εφαρμογές.

Ποια είναι η διαφορά μεταξύ APK και AAB;

Το .apk είναι το παραδοσιακό Android πακέτο εγκατάστασης και περιέχει όλα τα assets για κάθε αρχιτεκτονική. Το .aab (Android App Bundle) είναι format υποβολής που περιέχει όλα τα assets, αλλά το Google δημιουργεί custom APK για κάθε συσκευή, μειώνοντας το μέγεθος εγκατάστασης κατά 30–50%.

Χρειάζομαι Mac για να δημοσιεύσω .NET MAUI iOS app;

Πρακτικά ναι. Η Apple απαιτεί υπογραφή και archiving μέσω εργαλείων που τρέχουν μόνο σε macOS. Μπορείς να αναπτύσσεις σε Windows με Visual Studio και Pair-to-Mac, ή να χρησιμοποιείς macOS GitHub Actions runners σε CI χωρίς να έχεις φυσικό Mac.

Πόσο διαρκεί η διαδικασία App Review;

Το 2026, το 90% των iOS υποβολών εγκρίνονται εντός 24 ωρών. Το Google Play για νέες εφαρμογές χρειάζεται 3–7 ημέρες, ενώ updates συνήθως εγκρίνονται σε λίγες ώρες. Νέοι personal accounts στο Google Play απαιτούν επιπλέον 14 ημέρες closed testing με 20 testers πριν το production rollout.

Editorial Team
Σχετικά με τον Συγγραφέα Editorial Team

Our team of expert writers and editors.