Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här guiden visar hur du använder winapp CLI med ett Flutter-program för att lägga till paketidentitet och paketera din app som en MSIX.
Paketidentitet är ett grundläggande begrepp i Windows app modellen. Det gör att ditt program kan access specifika Windows-API:er (t.ex. meddelanden, säkerhet, AI-API:er osv.), har en ren installation/avinstallation med mera.
Förutsättningar
Flutter SDK: Installera Flutter enligt den officiella guiden.
winapp CLI: Installera
winappCLI via winget:winget install Microsoft.winappcli --source winget
1. Skapa en ny Flutter-app
Följ guiden i de officiella Flutter-dokumenten för att skapa ett nytt program och köra det.
2. Uppdatera koden för att kontrollera identiteten
ffi Lägg till paketet:
flutter pub add ffi
Ersätt innehållet i med följande kod som söker efter paketidentitet med hjälp av lib/main.dart Windows GetCurrentPackageFamilyName API via Dart FFI:
import 'dart:ffi';
import 'dart:io' show Platform;
import 'package:ffi/ffi.dart';
import 'package:flutter/material.dart';
String? getPackageFamilyName() {
if (!Platform.isWindows) return null;
final kernel32 = DynamicLibrary.open('kernel32.dll');
final getCurrentPackageFamilyName = kernel32.lookupFunction<
Int32 Function(Pointer<Uint32>, Pointer<Uint16>),
int Function(
Pointer<Uint32>, Pointer<Uint16>)>('GetCurrentPackageFamilyName');
final length = calloc<Uint32>();
try {
final result =
getCurrentPackageFamilyName(length, Pointer<Uint16>.fromAddress(0));
if (result != 122) return null; // ERROR_INSUFFICIENT_BUFFER = 122
final namePtr = calloc<Uint16>(length.value);
try {
final result2 = getCurrentPackageFamilyName(length, namePtr);
if (result2 == 0) {
return namePtr.cast<Utf16>().toDartString();
}
return null;
} finally {
calloc.free(namePtr);
}
} finally {
calloc.free(length);
}
}
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
late final String? _packageFamilyName;
@override
void initState() {
super.initState();
_packageFamilyName = getPackageFamilyName();
}
void _incrementCounter() {
setState(() { _counter++; });
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.all(16),
margin: const EdgeInsets.only(bottom: 24),
decoration: BoxDecoration(
color: _packageFamilyName != null
? Colors.green.shade50
: Colors.orange.shade50,
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: _packageFamilyName != null
? Colors.green
: Colors.orange,
),
),
child: Text(
_packageFamilyName != null
? 'Package Family Name:\n$_packageFamilyName'
: 'Not packaged',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyLarge,
),
),
const Text('You have pushed the button this many times:'),
Text('$_counter',
style: Theme.of(context).textTheme.headlineMedium),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
3. Kör utan identitet
Skapa och kör appen:
flutter build windows
.\build\windows\x64\runner\Release\flutter_app.exe
Du bör se appen med en orange indikator för "Inte paketerad".
4. Initiera project med winapp CLI
winapp init
När du uppmanas att göra det:
- Paketnamn: Tryck på Retur för att acceptera standardinställningen
- Utgivarens namn: Tryck på Enter för att acceptera standardvärdet eller ange ditt namn
- Version: Tryck på Retur för att acceptera 1.0.0.0
- Startpunkt: Tryck på Retur för att acceptera standardinställningen (flutter_app.exe)
- Setup SDK:er: Välj "Stabila SDK:er" för att ladda ned Windows App SDK och generera C++-huvuden
5. Felsöka med identitet
Skapa appen:
flutter build windowsAnvänd felsökningsidentitet:
winapp create-debug-identity .\build\windows\x64\runner\Release\flutter_app.exeKör den körbara filen:
.\build\windows\x64\runner\Release\flutter_app.exe
Du bör se appen med en grön indikator som visar paketfamiljenamnet.
Anmärkning
Efter att du har kört flutter clean eller återskapat programmet måste du köra create-debug-identity igen eftersom den körbara filen har ersatts.
6. Paket med MSIX
Skapa för lansering:
flutter build windowsFörberedelse av en paketkatalog:
mkdir dist copy .\build\windows\x64\runner\Release\* .\dist\ -RecurseGenerera ett utvecklingscertifikat:
winapp cert generate --if-exists skipPaketera och signera:
winapp pack .\dist --cert .\devcert.pfxInstallera certifikatet (kör som administratör):
winapp cert install .\devcert.pfxInstallera paketet:
Add-AppxPackage .\flutter-app.msix
Tips/Råd
- Microsoft Store signerar MSIX åt dig, du behöver inte signera innan det skickas in.
- Azure betrodd signering är ett bra sätt att hantera certifikat på ett säkert sätt för CI/CD-pipelines.
Relaterade ämnen
Windows developer