Unser App-Template kommt mit einem voll funktionsfähiger Lizenz-Verwaltung, welche unter anderem auch unser 3D Druckkosten-Kalkulator verwendet.
Abhängigkeiten
Um die Lizenz-Verwaltung nutzen zu können, sind jedoch folgende Drittanbieterlösungen nötig.
- WooCommerce (via WordPress)
- WP Software License Plugin, kostenpflichtig (https://wpsoftwarelicense.com/)
Produkt erstellen und konfigurieren
Um die Lizenz-Verwaltung zu aktivieren, erstelle oder bearbeite das gewünschte Produkt unter “Produkte” in deinem WordPress-Dashboard.

Bei den Produktdaten, wähle “Variables Produkt” und aktiviere “Lizenz”. Nun muss unter “Eigenschaften” noch eine Eigenschaft angelegt werde, welche zur Unterscheidung der Varianten verwendet wird. In unserem Beispiel ist es die Eigenschaft “Lizenz”. Die Werte werden dabei mit | getrennt.

Aktiviere hier die Option “Für Varianten verwenden”. Gehe nun zu “Varianten” und gib die jeweiligen Produktdaten zu deiner Lizenz ein, sowie den gewünschten Preis.
Abschließend wird die Lizenz unter “Lizenz” noch konfiguriert.

Hier sind nur die Informationen entscheidet, welche unter “Allgemein” angegeben werden. Die einzigartige ID wird benötigt, damit unser LicenseManager das Produkt identifizieren kann. Die Version, damit auf Updates geprüft werden kann.
App konfigurieren
Damit die App das richtige Produkt (Unique ID) in WooCommerce abfragt, musst du die Produkt-ID in der secrets.json Datei eingeben.
{
"AppBasement": {
//..
"LicenseManagerProductCode": "MY-PRODUCTID"
//..
}
}In der Klasse AppHostBuilderExtensions wird der LicenseManager initialisiert. Hier ist nur noch der Uri zu deiner WordPress Website anzugeben,
public static MauiAppBuilder ConfigureApp(this MauiAppBuilder builder)
{
builder
.RegisterDispatcher()
.RegisterMainViewModels()
.RegisterPageViewModels()
.RegisterModalViewModels()
.RegisterSettingsViewModels()
.RegisterMainViews()
.RegisterPageViews()
.RegisterModalViews()
.RegisterSettingsViews()
.RegisterNavigationRoots()
.ConfigureLicensing(new Uri("https://ar3dp.de"), "")
;
ConfigureMappers();
return builder;
}Lizenz-Manager
Die Instanz des LicenseManager ist über den ServiceProvider zugreifbar. In der BaseViewModel Klasse wird dieser initialisiert.
public BaseViewModel(IDispatcher dispatcher, IServiceProvider provider) : base(dispatcher, provider)
{
Dispatcher = dispatcher;
Provider = provider;
UpdateVersionBuild();
RegisterMessages();
InitializeLicenseServer();
}
/// <summary>
/// Initializes the LicenseManager to react on chances of the current license state.
/// </summary>
protected void InitializeLicenseServer()
{
LicenseManager = Provider.GetServices<ILicenseManager>().First();
LicenseManager.LicenseChanged += LicenseManager_LicenseChanged;
IsLightVersion = !LicenseManager?.CurrentLicense?.IsValid ?? true;
}
//....
/// <summary>
/// Event if the current license info has changed. All dependencies will be updated.
/// </summary>
/// <param name="sender"><c>LicenseManager</c></param>
/// <param name="e"><c>LicenseChangedEventArgs</c></param>
protected void LicenseManager_LicenseChanged(object sender, EventArgs e)
{
DispatchManager.Dispatch(Dispatcher, () => {
if (e is LicenseChangedEventArgs args)
{
LicenseValid = args.Valid;
IsLightVersion = !args.Valid;
LicenseKey = args.LicenseKey;
LastLicenseCheck = args.CheckDate;
}
});
}
Alle ViewModels, welche auf dem BaseViewModel basieren, werden automatisch benachrichtig, wenn sich die Lizenz ändert.
Debugging
Solange das Projekt im Debug ausgeführt wird, erscheint der Lizenz-Dialog, solange bis keine Aktivierung erfolgt hat. Dies kann in der Funktion BaseViewModel.CheckLicense() deaktiviert werden.
[RelayCommand]
protected async Task CheckLicense()
{
try
{
LicenseInfo licenseInfo = JsonConvertHelper.ToObject<LicenseInfo>(SettingsApp.LicenseInfo);
if (!string.IsNullOrEmpty(licenseInfo?.License))
{
bool isValid = await CheckLicenseValidAsync(licenseInfo);
SettingsApp.LicenseInfo = JsonConvertHelper.ToSettingsString(licenseInfo);
await SettingsApp.SaveSettingsAsync();
//IsLightVersion = !isValid;
// Notify all about license change
WeakReferenceMessenger.Default.Send(new LicenseChangedMessage(licenseInfo));
}
#if DEBUG
else if (true) // Set this to false to avoid showing the license enter dialog
#else
else if (VersionTracking.Default.IsFirstLaunchEver && !LicenseActivationShown)
#endif
{
// Avoids multiple popups in the first session
LicenseActivationShown = true;
await ShowLicenseActivation();
}
DispatchManager.Dispatch(Dispatcher, () => LastLicenseCheck = DateTime.Now);
}
catch (Exception exc)
{
//Log error
EventManager.Instance.LogError(exc);
}
}