mirror of
https://github.com/h3pdesign/Neon-Vision-Editor
synced 2026-04-21 13:27:16 +00:00
appreview: add paywall disclosures and privacy policy links
This commit is contained in:
parent
48321d6164
commit
e96cd3cea1
4 changed files with 40 additions and 0 deletions
|
|
@ -39,6 +39,7 @@ struct NeonSettingsView: View {
|
||||||
@State private var geminiAPIToken: String = SecureTokenStore.token(for: .gemini)
|
@State private var geminiAPIToken: String = SecureTokenStore.token(for: .gemini)
|
||||||
@State private var anthropicAPIToken: String = SecureTokenStore.token(for: .anthropic)
|
@State private var anthropicAPIToken: String = SecureTokenStore.token(for: .anthropic)
|
||||||
@State private var showSupportPurchaseDialog: Bool = false
|
@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("SettingsThemeName") private var selectedTheme: String = "Neon Glow"
|
||||||
@AppStorage("SettingsThemeTextColor") private var themeTextHex: String = "#EDEDED"
|
@AppStorage("SettingsThemeTextColor") private var themeTextHex: String = "#EDEDED"
|
||||||
|
|
@ -454,6 +455,9 @@ struct NeonSettingsView: View {
|
||||||
VStack(alignment: .leading, spacing: 12) {
|
VStack(alignment: .leading, spacing: 12) {
|
||||||
Text("In-App Purchase is optional and only used to support the app.")
|
Text("In-App Purchase is optional and only used to support the app.")
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
|
Text("One-time, non-consumable purchase. No subscription and no auto-renewal.")
|
||||||
|
.font(.footnote)
|
||||||
|
.foregroundStyle(.secondary)
|
||||||
if supportPurchaseManager.canUseInAppPurchases {
|
if supportPurchaseManager.canUseInAppPurchases {
|
||||||
Text("Price: \(supportPurchaseManager.supportPriceLabel)")
|
Text("Price: \(supportPurchaseManager.supportPriceLabel)")
|
||||||
.font(.headline)
|
.font(.headline)
|
||||||
|
|
@ -467,6 +471,11 @@ struct NeonSettingsView: View {
|
||||||
}
|
}
|
||||||
.disabled(supportPurchaseManager.isPurchasing || supportPurchaseManager.isLoadingProducts)
|
.disabled(supportPurchaseManager.isPurchasing || supportPurchaseManager.isLoadingProducts)
|
||||||
|
|
||||||
|
Button("Restore Purchases") {
|
||||||
|
Task { await supportPurchaseManager.restorePurchases() }
|
||||||
|
}
|
||||||
|
.disabled(supportPurchaseManager.isLoadingProducts)
|
||||||
|
|
||||||
Button("Refresh Price") {
|
Button("Refresh Price") {
|
||||||
Task { await supportPurchaseManager.refreshProducts() }
|
Task { await supportPurchaseManager.refreshProducts() }
|
||||||
}
|
}
|
||||||
|
|
@ -480,6 +489,10 @@ struct NeonSettingsView: View {
|
||||||
.font(.footnote)
|
.font(.footnote)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Link("Privacy Policy", destination: privacyPolicyURL)
|
||||||
|
.font(.footnote.weight(.semibold))
|
||||||
|
|
||||||
if supportPurchaseManager.canBypassInCurrentBuild {
|
if supportPurchaseManager.canBypassInCurrentBuild {
|
||||||
Divider()
|
Divider()
|
||||||
Text("TestFlight/Sandbox: You can bypass purchase for testing.")
|
Text("TestFlight/Sandbox: You can bypass purchase for testing.")
|
||||||
|
|
|
||||||
24
PRIVACY.md
Normal file
24
PRIVACY.md
Normal 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`.
|
||||||
|
|
@ -170,6 +170,7 @@ Full release history: [`CHANGELOG.md`](CHANGELOG.md)
|
||||||
|
|
||||||
## Privacy & Security
|
## Privacy & Security
|
||||||
|
|
||||||
|
- Privacy policy: [`PRIVACY.md`](PRIVACY.md).
|
||||||
- API keys are stored in Keychain (`SecureTokenStore`), not `UserDefaults`.
|
- API keys are stored in Keychain (`SecureTokenStore`), not `UserDefaults`.
|
||||||
- Network traffic uses HTTPS.
|
- Network traffic uses HTTPS.
|
||||||
- No telemetry.
|
- No telemetry.
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@
|
||||||
- Users can use the full app without purchasing.
|
- Users can use the full app without purchasing.
|
||||||
- Purchase UI is in Settings -> Support.
|
- Purchase UI is in Settings -> Support.
|
||||||
- "Restore Purchases" is available in the same Support dialog.
|
- "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
|
## Test Notes
|
||||||
- Local StoreKit config file included at:
|
- Local StoreKit config file included at:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue