Revert refunded features on launch
This commit is contained in:
parent
441b1059cf
commit
495e714737
|
@ -27,6 +27,9 @@ import UIKit
|
||||||
import TunnelKit
|
import TunnelKit
|
||||||
import PassepartoutCore
|
import PassepartoutCore
|
||||||
import Convenience
|
import Convenience
|
||||||
|
import SwiftyBeaver
|
||||||
|
|
||||||
|
private let log = SwiftyBeaver.self
|
||||||
|
|
||||||
@UIApplicationMain
|
@UIApplicationMain
|
||||||
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
|
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
|
||||||
|
@ -79,6 +82,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
|
||||||
|
|
||||||
func applicationDidBecomeActive(_ application: UIApplication) {
|
func applicationDidBecomeActive(_ application: UIApplication) {
|
||||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||||
|
ProductManager.shared.reviewPurchases()
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationWillTerminate(_ application: UIApplication) {
|
func applicationWillTerminate(_ application: UIApplication) {
|
||||||
|
|
|
@ -96,7 +96,7 @@ class ProductManager: NSObject {
|
||||||
|
|
||||||
// MARK: In-app eligibility
|
// MARK: In-app eligibility
|
||||||
|
|
||||||
private func reloadReceipt() {
|
private func reloadReceipt(andNotify: Bool = true) {
|
||||||
guard let url = Bundle.main.appStoreReceiptURL else {
|
guard let url = Bundle.main.appStoreReceiptURL else {
|
||||||
log.warning("No App Store receipt found!")
|
log.warning("No App Store receipt found!")
|
||||||
return
|
return
|
||||||
|
@ -140,7 +140,9 @@ class ProductManager: NSObject {
|
||||||
}
|
}
|
||||||
log.info("Purchased features: \(purchasedFeatures)")
|
log.info("Purchased features: \(purchasedFeatures)")
|
||||||
|
|
||||||
NotificationCenter.default.post(name: ProductManager.didReloadReceipt, object: nil)
|
if andNotify {
|
||||||
|
NotificationCenter.default.post(name: ProductManager.didReloadReceipt, object: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func isFullVersion() -> Bool {
|
func isFullVersion() -> Bool {
|
||||||
|
@ -169,6 +171,60 @@ class ProductManager: NSObject {
|
||||||
func isEligibleForFeedback() -> Bool {
|
func isEligibleForFeedback() -> Bool {
|
||||||
return AppConstants.Flags.isBeta || !purchasedFeatures.isEmpty
|
return AppConstants.Flags.isBeta || !purchasedFeatures.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: Review
|
||||||
|
|
||||||
|
func reviewPurchases() {
|
||||||
|
let service = TransientStore.shared.service
|
||||||
|
reloadReceipt(andNotify: false)
|
||||||
|
var shouldReinstall = false
|
||||||
|
|
||||||
|
// review features and potentially revert them if they were used (Siri is handled in AppDelegate)
|
||||||
|
|
||||||
|
log.debug("Checking 'Trusted networks'")
|
||||||
|
if !isEligible(forFeature: .trustedNetworks) {
|
||||||
|
if service.preferences.trustsMobileNetwork || !service.preferences.trustedWifis.isEmpty {
|
||||||
|
service.preferences.trustsMobileNetwork = false
|
||||||
|
service.preferences.trustedWifis.removeAll()
|
||||||
|
log.debug("\tRefunded")
|
||||||
|
shouldReinstall = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("Checking 'Unlimited hosts'")
|
||||||
|
if !isEligible(forFeature: .unlimitedHosts) {
|
||||||
|
let ids = service.ids(forContext: .host)
|
||||||
|
if ids.count > AppConstants.InApp.limitedNumberOfHosts {
|
||||||
|
for id in ids {
|
||||||
|
service.removeProfile(ProfileKey(.host, id))
|
||||||
|
}
|
||||||
|
log.debug("\tRefunded")
|
||||||
|
shouldReinstall = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("Checking providers")
|
||||||
|
for name in service.currentProviderNames() {
|
||||||
|
if !isEligible(forProvider: name) {
|
||||||
|
service.removeProfile(ProfileKey(name))
|
||||||
|
log.debug("\tRefunded provider: \(name)")
|
||||||
|
shouldReinstall = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no refunds
|
||||||
|
guard shouldReinstall else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
// save reverts and remove fraud VPN profile
|
||||||
|
TransientStore.shared.serialize(withProfiles: true)
|
||||||
|
VPN.shared.uninstall(completionHandler: nil)
|
||||||
|
|
||||||
|
NotificationCenter.default.post(name: ProductManager.didReloadReceipt, object: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ConnectionService {
|
extension ConnectionService {
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 7476e0751d1a64efca0180a1e31f0e24f04fce84
|
Subproject commit dad47f3581ab25d966d204de93634d82b9fe808b
|
Loading…
Reference in New Issue