.NET MAUI quickstart
WordsAreFlowing.Sdk.Maui adds the native store prompt to the .NET
head: Google Play In-App Review on Android (API 24 and up) and StoreKit on iOS (15 and up).
Everything on the .NET page — triggers, decisions, notes — works the
same way here.
1. Install
dotnet add package WordsAreFlowing.Sdk.Maui
The packages are on nuget.org. This package brings in
WordsAreFlowing.Sdk and WordsAreFlowing.Sdk.Core.
2. Register
In MauiProgram.cs, call
AddWordsAreFlowingMaui. Its options are a
WordsAreFlowingMauiOptions, which has every
option of the .NET head plus one.
using WordsAreFlowing.Sdk.Maui;
builder.Services.AddWordsAreFlowingMaui(o =>
{
o.ApiKey = "waf_live_…";
o.AppVersion = AppInfo.VersionString;
#if DEBUG
o.UseFakeReviewManager = true; // Android debug builds only — never ship it
#endif
});
What it sets up for you:
- Platform detection.
Platformis set from the device (android,ios,macos,windowsorunknown), and any value you set is replaced. - Storage. Counters live in MAUI Preferences, in their own container named
wordsareflowing, so your app'sPreferences.Clear()does not reset them. - The review prompt. Google Play In-App Review on Android, StoreKit on iOS. No
review flow ships for Windows or macOS; there a store-prompt rule ends in
prompter_unavailable, as on the web.
Storage and the prompter are singletons, so a native lifecycle hook and a Blazor component share the same counters. As with the .NET head, a registration you make before this call wins.
3. The ask and the triggers
In a Blazor Hybrid app, use the FeedbackAsk component and
TrackAsync exactly as on the .NET
page. The package has no XAML control; a XAML-only app listens to
DecisionMade and draws its own ask, then calls
SubmitFeedbackAsync or
DismissAskAsync.
var decision = await loop.TrackAsync("trip_finished");
// StorePromptFired: the platform was asked. Whether a sheet appeared, it does not say.
Android: Google Play In-App Review
The prompt comes from Google's com.google.android.play:review library. Play decides
whether a dialog actually appears and never reports it, so
StorePromptFired means "Play was asked", not "the user saw it".
The real review manager only succeeds for an app that has been installed from a Play track. A
debug build that is on no track cannot succeed, so
UseFakeReviewManager switches to Play's own
FakeReviewManager, which reports success and shows nothing. Use it to exercise the path
in debug builds. Never ship it set to true: your release users would never see a
prompt. To see the real dialog, install from an internal testing track.
iOS: StoreKit
The SDK calls AppStore.RequestReview on iOS 16 and later, and
SKStoreReviewController.RequestReview on iOS 15. Apple shows the sheet at most three
times in 365 days, always shows it in development builds, and never shows it in
TestFlight — a TestFlight build cannot prove the dialog. StoreKit does not report whether
the sheet appeared either.
Caps
By default the SDK asks for the store prompt at most twice in any rolling 365 days on Android and
three times on iOS. A rule's maxPerYear (1 to 3) replaces that default for its
trigger, the MaxStorePromptsPerYear option can only
lower the cap, and nothing ever goes above three. See the
rules reference.