Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In deze handleiding ziet u hoe u de winapp CLI gebruikt met een Flutter-toepassing om pakketidentiteit toe te voegen en uw app als msix te verpakken.
Pakketidentiteit is een kernconcept in het Windows app model. Hiermee kan uw toepassing specifieke Windows-API's (zoals meldingen, beveiliging, AI-API's, enzovoort) access, een schone installatie-/verwijderingservaring hebben, en meer.
Vereiste voorwaarden
Flutter SDK: Installeer Flutter volgens de officiële handleiding.
winapp CLI: Installeer de
winappCLI met winget:winget install Microsoft.winappcli --source winget
1. Een nieuwe Flutter-app maken
Volg de handleiding in de officiële Flutter-documenten om een nieuwe toepassing te maken en uit te voeren.
2. Werk code bij om de identiteit te controleren
Voeg het ffi pakket toe:
flutter pub add ffi
Vervang de inhoud van lib/main.dart met de volgende code die de pakketidentiteit controleert met behulp van de Windows-API GetCurrentPackageFamilyName 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. Uitvoeren zonder identiteit
Bouw en voer de app uit:
flutter build windows
.\build\windows\x64\runner\Release\flutter_app.exe
U ziet de app met een oranje indicator 'Niet verpakt'.
4. Initialiseer project met winapp CLI
winapp init
Wanneer u hierom wordt gevraagd:
- Pakketnaam: druk op Enter om de standaardwaarde te accepteren
- Publisher naam: Druk op Enter om de standaardinstelling te accepteren of voer uw naam in
- Versie: Druk op Enter om 1.0.0.0 te accepteren
- Toegangspunt: Druk op Enter om de standaardwaarde (flutter_app.exe) te accepteren
- Setup SDK's: Selecteer 'Stabiele SDK's' om Windows App SDK te downloaden en C++-headers te genereren
Debuggen met identiteit
Bouw de app:
flutter build windowsDebug-identiteit toepassen
winapp create-debug-identity .\build\windows\x64\runner\Release\flutter_app.exeVoer het uitvoerbare bestand uit:
.\build\windows\x64\runner\Release\flutter_app.exe
U ziet de app met een groene indicator met de familienaam van het pakket.
Opmerking
Nadat u flutter clean hebt uitgevoerd of opnieuw hebt opgebouwd, moet u create-debug-identity opnieuw uitvoeren omdat het uitvoerbare bestand is vervangen.
6. Pakket met MSIX
Build voor release:
flutter build windowsPakketmap voorbereiden:
mkdir dist copy .\build\windows\x64\runner\Release\* .\dist\ -RecurseEen ontwikkelingscertificaat genereren:
winapp cert generate --if-exists skipPakket en teken:
winapp pack .\dist --cert .\devcert.pfxInstalleer het certificaat (als beheerder uitvoeren):
winapp cert install .\devcert.pfxInstalleer het pakket:
Add-AppxPackage .\flutter-app.msix
Aanbeveling
- De Microsoft Store ondertekent de MSIX voor u. U hoeft de MSIX niet te ondertekenen voordat u deze inzendt.
- Azure Trusted Signing is een uitstekende manier om certificaten veilig te beheren voor CI/CD-pipelines.
Verwante onderwerpen
Windows developer