appreview: add paywall disclosures and privacy policy links

This commit is contained in:
h3p 2026-02-12 16:55:14 +01:00
parent 48321d6164
commit e96cd3cea1
4 changed files with 40 additions and 0 deletions

View file

@ -39,6 +39,7 @@ struct NeonSettingsView: View {
@State private var geminiAPIToken: String = SecureTokenStore.token(for: .gemini)
@State private var anthropicAPIToken: String = SecureTokenStore.token(for: .anthropic)
@State private var showSupportPurchaseDialog: Bool = false
private let privacyPolicyURL = URL(string: "https://github.com/h3pdesign/Neon-Vision-Editor/blob/main/PRIVACY.md")!
@AppStorage("SettingsThemeName") private var selectedTheme: String = "Neon Glow"
@AppStorage("SettingsThemeTextColor") private var themeTextHex: String = "#EDEDED"
@ -454,6 +455,9 @@ struct NeonSettingsView: View {
VStack(alignment: .leading, spacing: 12) {
Text("In-App Purchase is optional and only used to support the app.")
.foregroundStyle(.secondary)
Text("One-time, non-consumable purchase. No subscription and no auto-renewal.")
.font(.footnote)
.foregroundStyle(.secondary)
if supportPurchaseManager.canUseInAppPurchases {
Text("Price: \(supportPurchaseManager.supportPriceLabel)")
.font(.headline)
@ -467,6 +471,11 @@ struct NeonSettingsView: View {
}
.disabled(supportPurchaseManager.isPurchasing || supportPurchaseManager.isLoadingProducts)
Button("Restore Purchases") {
Task { await supportPurchaseManager.restorePurchases() }
}
.disabled(supportPurchaseManager.isLoadingProducts)
Button("Refresh Price") {
Task { await supportPurchaseManager.refreshProducts() }
}
@ -480,6 +489,10 @@ struct NeonSettingsView: View {
.font(.footnote)
.foregroundStyle(.secondary)
}
Link("Privacy Policy", destination: privacyPolicyURL)
.font(.footnote.weight(.semibold))
if supportPurchaseManager.canBypassInCurrentBuild {
Divider()
Text("TestFlight/Sandbox: You can bypass purchase for testing.")

24
PRIVACY.md Normal file
View file

@ -0,0 +1,24 @@
# Privacy Policy
Neon Vision Editor does not collect, sell, or share personal data for analytics or advertising.
## Data Handling
- Local editor content stays on-device unless you explicitly open/save/export files.
- API tokens for optional AI providers are stored in Apple Keychain.
- No telemetry is sent by default.
## Network Use
- Network requests occur only when you explicitly use optional AI/completion providers.
- Requests are sent over HTTPS to the selected provider endpoint.
## In-App Purchase
- The support purchase is a one-time, non-consumable purchase.
- No auto-renewing subscription is used.
- Core app functionality is not locked behind the support purchase.
## Contact
For privacy questions, use the security contact in `SECURITY.md`.

View file

@ -170,6 +170,7 @@ Full release history: [`CHANGELOG.md`](CHANGELOG.md)
## Privacy & Security
- Privacy policy: [`PRIVACY.md`](PRIVACY.md).
- API keys are stored in Keychain (`SecureTokenStore`), not `UserDefaults`.
- Network traffic uses HTTPS.
- No telemetry.

View file

@ -12,6 +12,8 @@
- Users can use the full app without purchasing.
- Purchase UI is in Settings -> Support.
- "Restore Purchases" is available in the same Support dialog.
- Support purchase is one-time and non-consumable (no subscription / no auto-renewal).
- Privacy policy link is shown in-app in the Support tab and documented in `PRIVACY.md`.
## Test Notes
- Local StoreKit config file included at: