summaryrefslogtreecommitdiff
path: root/DomainDig/PurchaseService.swift
Commit message (Collapse)AuthorAgeFilesLines
* feat: owner Pro+ allowlist via CloudKit, cut v5.0.1v5.0.1Christian Cleberg10 days1-3/+50
| | | | | | | | | | | | | | | | | | | | | Grants the app owner Pro+ without a purchase, keyed to their CloudKit user-record ID so it works on the release App Store build. - OwnerAccess holds the owner's CloudKit user-record ID (opaque, per-Apple-ID, scoped to the app's container; safe to publish — CloudKit verifies identity server-side, so it can't be presented by anyone else). - PurchaseService resolves the allowlist against CloudKit once per launch and, on a match, records a persisted owner grant so it applies instantly and offline thereafter. The grant only ever elevates the tier to .proPlus and defers to the existing #if DEBUG overrides, so real purchases and free/pro testing are unaffected. cachedTier / cachedEntitlement were refactored to fall back to the owner grant only when no debug override or stored purchase applies. - Supersedes the DEBUG record-ID reveal (PR #60): its only purpose was to read the owner's ID, which is now hardcoded, so the reveal is not shipped. Release cut: MARKETING_VERSION 5.0.0 -> 5.0.1, CURRENT_PROJECT_VERSION 45 -> 46, AppVersion.current -> 5.0.1, roadmap updated. App builds clean; unit suite 63/63.
* v4.8.3: Clear SonarCloud new-code issuesChristian Cleberg2026-07-201-4/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes the 4 reported bugs and ~97 code smells flagged in the new-code period. No behavior changes. Bugs (swift:S3923) — DomainInspectionService's confidenceFor* helpers each returned `error == nil ? .low : .low`, an inert conditional. Simplified to `return .low` and dropped the now-unused `error` parameter. Smells: - Merged 14 identical `.empty`/`.error` switch branches in DomainViewModel - Consolidated duplicate implementations (clearPresentedResults/reset, String.nonEmpty/nilIfEmpty, ExportFormat.id/fileExtension) - Extracted nested ternaries into TLSGrade.tone, EmailSecurityGrade.tone, and ChangeImpactClassification.color; removed ContentView.impactColor and the duplicate mapping in BatchResultsView - Documented empty closures and singleton inits - Marked unused protocol-conformance parameters `_` - Renamed CloudSyncTrigger.`import` to `imported` (raw value preserved) and SSLSessionDelegate's _serverTrust/_tlsMetadata - Merged nested ifs in the DER parser; flattened closure nesting in PortScanService and IntegrationService - Replaced two-case switches with if/else Left open: S107 (init parameter counts), S115 (constants mirroring DoH and ipapi JSON keys), S1075 (false positives on https:// literals), and two S117 hits on SwiftUI $binding shorthand. These want a Won't Fix resolution in SonarCloud, not a code change.
* fix: match IAP product IDs to App Store ConnectChristian Cleberg2026-07-201-4/+4
| | | | | | | | | | | | | | The four product ID constants did not match the auto-renewable subscriptions configured in App Store Connect, so Product.products(for:) returned an empty array and tier(for:) resolved every purchase to .free. Product IDs are permanent in App Store Connect, so the code is corrected to match the configured values rather than the reverse: domaindig.pro.monthly -> domaindig.pro.month domaindig.pro.yearly -> domaindig.pro.annually domaindig.dataplus.monthly -> domaindig.proplus.monthly domaindig.dataplus.yearly -> domaindig.proplus.annually
* DomainDig v4.1.0: Add a full local data reset flow in Data ManagementChristian Cleberg2026-04-251-0/+8
| | | | | | | | | | | | | | | | | | | | - add a destructive Delete All Data action with confirmation, progress, success, and failure handling - centralize wipe behavior in DataResetService instead of scattering delete logic in views - clear local persistence, temp/export files, integration secrets, notifications, caches, and in-memory app state - reset sync, purchase, and integration services after wipe so the app returns to a clean first-launch state Polish batch and empty-state UX - present the batch sweep summary after manual bulk searches complete, not only from Watchlist - align the Workflows empty state styling with other empty states by removing the extra background card treatment Bump the project version from 4.0.0 to 4.1.0
* DomainDig v3.8.0 — Smart MonitoringChristian Cleberg2026-04-241-11/+66
| | | | | | | | | * Stable domain intervals * Frequent changes decrease intervals * Duplicate states do not trigger alerts * Quiet hours suppress alerts * Quiet hours across midnight work correctly * Sensitivity levels alter behavior as expected
* feat(v3.2.0): add Data+ tier and external data integrationsChristian Cleberg2026-04-221-5/+31
| | | | | | | | | | - introduce Data+ tier for advanced data features - add ownership history and DNS history - expand subdomain discovery with external sources - add domain pricing insights - implement local usage/credit system - integrate external data service layer with rate limiting - extend export and CLI for Data+ features
* feat(v3​.1​.0): add ​Store​Kit integration and ​Pro tierChristian Cleberg2026-04-221-0/+245
• implement Purchase​Service using StoreKit 2 • activate feature tiers based on entitlement • add minimal paywall and restore flow • enforce free-tier limits with upgrade paths • integrate Pro status into settings • ensure clean and non-intrusive monetization flow