Browse Source

【综合】回头客优惠相关调研文件提交

zenghong 2 months ago
parent
commit
7dba1495bb

+ 5 - 1
PDF Office/PDF Master/AppDelegate.swift

@@ -115,7 +115,11 @@ class AppDelegate: NSObject, NSApplicationDelegate, iRateDelegate{
         KMKdanRemoteConfig.remoteConfig.fetchWithRemoteConfigCompletionHandler { status, error in
             
         }
-        
+        if #available(macOS 12.0, *) {
+            TransactionObserver()
+        } else {
+            // Fallback on earlier versions
+        };
         let token = UserDefaults.standard.value(forKey: "MemberAccessToken")
         if token is String {
             if (token as! String).count > 0 {

+ 6 - 1
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController.swift

@@ -294,7 +294,12 @@ import Cocoa
         // 更新属性页面的信息
         NotificationCenter.default.post(name: KMInfoWindowC.windowDidBecomeMainNotification, object: self.myDocument)
         self.interfaceThemeDidChanged(self.view.window?.appearance?.name ?? (NSApp.appearance?.name ?? .aqua))
-        
+        if #available(macOS 15.0, *) {
+            let contentViewController = ContentViewViewController()
+            contentViewController.presentContentView()
+        } else {
+            // Fallback on earlier versions
+        }
         if (self.document == nil) {
             return
         }

+ 85 - 0
PDF Office/PDF Master/Class/Purchase/CPDFOfferSubscriptionStoreView.swift

@@ -0,0 +1,85 @@
+//
+//  CPDFOfferSubscriptionStoreView.swift
+//  PDFReaderPro
+//
+//  Created by zenghong on 1/3/25.
+//
+
+import SwiftUI
+import StoreKit
+
+@available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *)
+public struct CPDFOfferSubscriptionStoreView: View {
+    @State private var products: [Product] = []
+    @State private var tProduct: Product?
+    @State private var showLoading: Bool = true
+    @State private var winBack : Product.SubscriptionOffer?
+        
+    public var body: some View {
+        VStack {
+            
+            if showLoading {
+                ProgressView("加载订阅信息中...")
+            } else {
+                //                SubscriptionStoreView(groupID: "21572797")
+                
+                SubscriptionStoreView(subscriptions: self.products).preferredSubscriptionOffer { product, subscription, eligibleOffers in
+                    print("winBackOffers:\(product.subscription?.winBackOffers)")
+                    return product.subscription?.winBackOffers.first
+                }
+                .onAppear {
+                    fetchProducts()
+                }
+                .frame(maxWidth: .infinity, maxHeight: .infinity)
+            }
+        }
+        .onAppear {
+            fetchProducts()
+        }
+    }
+    
+    public func purchaseWinBackOffer() async {
+        let purchaseOption = Product.PurchaseOption.winBackOffer(winBack!)
+        do {
+            let purchaseResult = try await tProduct!.purchase(options: [purchaseOption])
+            switch purchaseResult {
+            case .success(let verificationResult):
+                switch verificationResult {
+                case .verified(let transaction):
+                    print("购买成功:\(transaction)")
+                    await transaction.finish()
+                case .unverified(_, let error):
+                    print("验证失败:\(error)")
+                }
+            case .userCancelled:
+                print("用户取消了购买")
+            case .pending:
+                print("购买中")
+            @unknown default:
+                print("未知错误")
+            }
+        } catch {
+            print("发生错误:\(error)")
+        }
+    }
+    
+    public func fetchProducts() {
+        Task {
+            do {
+                // 加载订阅组的产品
+                let identifiers = Set(["com.pdfreaderpro.mac_free.member.all_access_pack_advanced_6months.001"])
+                let fetchedProducts = try await Product.products(for:identifiers)
+                
+                // 更新产品信息
+                DispatchQueue.main.async {
+                    self.products = fetchedProducts
+                    self.tProduct = fetchedProducts.first
+                    self.showLoading = false
+                }
+            } catch {
+                print("无法加载产品: \(error)")
+                self.showLoading = false
+            }
+        }
+    }
+}

+ 120 - 0
PDF Office/PDF Master/Class/Purchase/ContentView.swift

@@ -0,0 +1,120 @@
+//
+//  ContentView.swift
+//  PDFReaderPro
+//
+//  Created by zenghong on 1/6/25.
+//
+
+import SwiftUI
+import StoreKit
+
+@available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *)
+struct ContentView: View {
+    var body: some View {
+        NavigationView {
+            VStack(spacing: 20) {
+                Text("欢迎来到订阅页面")
+                    .font(.headline)
+                    .padding()
+
+                Button("购买 Win-Back Offer") {
+                    Task {
+                        await purchaseWinBackOffer(for: "com.pdfreaderpro.mac_free.member.all_access_pack_advanced_6months.001")
+                    }
+                }
+                .buttonStyle(.borderedProminent)
+
+                Button("加载订阅页面") {
+                    Task {
+                        await loadSubscriptionStoreView()
+                    }
+                }
+                .buttonStyle(.bordered)
+            }
+            .navigationTitle("订阅示例")
+        }
+    }
+
+    func purchaseWinBackOffer(for productID: String) async {
+        do {
+            // 加载产品
+            let products = try await Product.products(for: [productID])
+            guard let product = products.first else {
+                print("未找到指定的产品")
+                return
+            }
+
+            // 确保产品为订阅类型
+            guard let subscriptionInfo = product.subscription else {
+                print("该产品不是订阅类型")
+                return
+            }
+
+            // 查找可用的 Win-Back Offer
+            print("product:\(product)")
+            print("subscriptionInfo.winBackOffers:\(subscriptionInfo.winBackOffers)")
+            let offers = subscriptionInfo.winBackOffers
+            guard let winBackOffer = offers.first else {
+                print("没有找到适合用户的 Win-Back Offer")
+                return
+            }
+
+            // 使用 Win-Back Offer 创建购买选项
+            let purchaseOption = Product.PurchaseOption.winBackOffer(winBackOffer)
+
+            // 发起购买
+            let purchaseResult = try await product.purchase(options: [purchaseOption])
+            switch purchaseResult {
+            case .success(let verificationResult):
+                switch verificationResult {
+                case .verified(let transaction):
+                    print("购买成功:\(transaction.id)")
+                    await transaction.finish()
+                case .unverified(_, let error):
+                    print("验证失败:\(error)")
+                }
+            case .userCancelled:
+                print("用户取消了购买")
+            case .pending:
+                print("购买失败")
+            @unknown default:
+                print("购买失败")
+            }
+        } catch {
+            print("发生错误:\(error)")
+        }
+    }
+
+    func loadSubscriptionStoreView() async {
+        
+        do {
+                // 加载订阅产品
+                let products = try await Product.products(for: ["com.pdfreaderpro.mac_free.member.all_access_pack_advanced_6months.001"])
+
+                // 检查是否有可用产品
+                if !products.isEmpty {
+                    // 创建 SubscriptionViewController
+                    let subscriptionVC = SubscriptionViewController()
+
+                    // 初始化窗口
+                    let window = NSWindow(
+                        contentRect: NSRect(x: 0, y: 0, width: 400, height: 300),
+                        styleMask: [.titled, .closable, .resizable],
+                        backing: .buffered,
+                        defer: false
+                    )
+                    window.contentViewController = subscriptionVC
+                    window.title = "SubscriptionStoreView in macOS"
+                    
+                    // 弹出窗口
+                    let windowController = NSWindowController(window: window)
+                    windowController.showWindow(nil)
+                    
+                } else {
+                    print("未找到订阅产品")
+                }
+            } catch {
+                print("加载订阅页面失败: \(error)")
+            }
+    }
+}

+ 38 - 0
PDF Office/PDF Master/Class/Purchase/ContentViewViewController.swift

@@ -0,0 +1,38 @@
+//
+//  ContentViewViewController.swift
+//  PDFReaderPro
+//
+//  Created by zenghong on 1/6/25.
+//
+
+import Cocoa
+import SwiftUI
+
+@available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *)
+@objc class ContentViewViewController: NSViewController {
+    override func loadView() {
+        let hostingView = NSHostingView(rootView: ContentView())
+        hostingView.frame = NSRect(x: 0, y: 0, width: 400, height: 300)
+        self.view = hostingView
+    }
+    
+    // 弹出 ContentView 的窗口
+    func presentContentView() {
+        // 创建自定义 ViewController
+        let contentViewController = ContentViewViewController()
+
+        // 初始化窗口
+        let window = NSWindow(
+            contentRect: NSRect(x: 0, y: 0, width: 400, height: 300),
+            styleMask: [.titled, .closable, .resizable],
+            backing: .buffered,
+            defer: false
+        )
+        window.contentViewController = contentViewController
+        window.title = "SwiftUI in macOS"
+        
+        // 弹出窗口
+        let windowController = NSWindowController(window: window)
+        windowController.showWindow(nil)
+    }
+}

+ 39 - 0
PDF Office/PDF Master/Class/Purchase/SubscriptionViewController.swift

@@ -0,0 +1,39 @@
+//
+//  SubscriptionViewController.swift
+//  PDFReaderPro
+//
+//  Created by zenghong on 1/3/25.
+//
+
+import Cocoa
+import SwiftUI
+
+
+@available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *)
+@objc class SubscriptionViewController: NSViewController {
+    override func loadView() {
+        let hostingView = NSHostingView(rootView: CPDFOfferSubscriptionStoreView())
+        hostingView.frame = NSRect(x: 0, y: 0, width: 1000, height: 1000)
+        self.view = hostingView
+    }
+    
+    // 弹出 ContentView 的窗口
+    func presentSubscriptionView() {
+        // 创建自定义 ViewController
+        let contentViewController = SubscriptionViewController()
+
+        // 初始化窗口
+        let window = NSWindow(
+            contentRect: NSRect(x: 0, y: 0, width: 1000, height: 1000),
+            styleMask: [.titled, .closable, .resizable],
+            backing: .buffered,
+            defer: false
+        )
+        window.contentViewController = contentViewController
+        window.title = "SubscriptionStoreView in macOS"
+        
+        // 弹出窗口
+        let windowController = NSWindowController(window: window)
+        windowController.showWindow(nil)
+    }
+}

+ 75 - 0
PDF Office/PDF Master/Class/Purchase/TransactionObserver.swift

@@ -0,0 +1,75 @@
+//
+//  TransactionObserver.swift
+//  PDFReaderPro
+//
+//  Created by zenghong on 1/8/25.
+//
+
+import Foundation
+import SwiftUI
+import StoreKit
+
+
+@available(macOS 12.0, *)
+@objc final class TransactionObserver: NSObject {
+    
+    var updates: Task<Void, Never>? = nil
+    
+//    @Environment(\.displayStoreKitMessage) private var displayStoreMessage
+    
+    override init() {
+        super.init()
+        updates = newTransactionListenerTask()
+    }
+
+
+    deinit {
+        // Cancel the update handling task when you deinitialize the class.
+        updates?.cancel()
+    }
+    
+    private func newTransactionListenerTask() -> Task<Void, Never> {
+        Task(priority: .background) {
+            for await verificationResult in Transaction.updates {
+                self.handle(updatedTransaction: verificationResult)
+            }
+            
+//            for await message in StoreKit.Message.messages {
+//                if message.reason != .winBackOffer {
+                    // Ask the system to display messages now.
+//                    try? await displayStoreMessage(message)
+//                }
+//            }
+        }
+    }
+    
+    private func handle(updatedTransaction verificationResult: VerificationResult<StoreKit.Transaction>) {
+        guard case .verified(let transaction) = verificationResult else {
+            // Ignore unverified transactions.
+            return
+        }
+
+        print("同步购买信息:\(transaction)")
+
+        if let revocationDate = transaction.revocationDate {
+            // Remove access to the product identified by transaction.productID.
+            // Transaction.revocationReason provides details about
+            // the revoked transaction.
+            
+        } else if let expirationDate = transaction.expirationDate,
+            expirationDate < Date() {
+            // Do nothing, this subscription is expired.
+            print("订阅过期")
+            return
+        } else if transaction.isUpgraded {
+            // Do nothing, there is an active transaction
+            // for a higher level of service.
+            return
+        } else {
+            // Provide access to the product identified by
+            // transaction.productID.
+            
+        }
+    }
+    
+}

+ 52 - 10
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -16,6 +16,24 @@
 		037A787F2CE9FEC400B025FE /* KMProductCompareWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 037A787E2CE9FEC400B025FE /* KMProductCompareWC.xib */; };
 		037A78802CE9FEC400B025FE /* KMProductCompareWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 037A787E2CE9FEC400B025FE /* KMProductCompareWC.xib */; };
 		037A78812CE9FEC400B025FE /* KMProductCompareWC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 037A787E2CE9FEC400B025FE /* KMProductCompareWC.xib */; };
+		1B12385E2D2CCB9600B2A3AD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385A2D2CCB9600B2A3AD /* ContentView.swift */; };
+		1B12385F2D2CCB9600B2A3AD /* SubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385D2D2CCB9600B2A3AD /* SubscriptionViewController.swift */; };
+		1B1238602D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385C2D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift */; };
+		1B1238612D2CCB9600B2A3AD /* ContentViewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385B2D2CCB9600B2A3AD /* ContentViewViewController.swift */; };
+		1B1238622D2CCB9600B2A3AD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385A2D2CCB9600B2A3AD /* ContentView.swift */; };
+		1B1238632D2CCB9600B2A3AD /* SubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385D2D2CCB9600B2A3AD /* SubscriptionViewController.swift */; };
+		1B1238642D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385C2D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift */; };
+		1B1238652D2CCB9600B2A3AD /* ContentViewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385B2D2CCB9600B2A3AD /* ContentViewViewController.swift */; };
+		1B1238662D2CCB9600B2A3AD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385A2D2CCB9600B2A3AD /* ContentView.swift */; };
+		1B1238672D2CCB9600B2A3AD /* SubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385D2D2CCB9600B2A3AD /* SubscriptionViewController.swift */; };
+		1B1238682D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385C2D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift */; };
+		1B1238692D2CCB9600B2A3AD /* ContentViewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B12385B2D2CCB9600B2A3AD /* ContentViewViewController.swift */; };
+		1B12386B2D2CDAD300B2A3AD /* SyncedProducts.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 1B12386A2D2CDAD300B2A3AD /* SyncedProducts.storekit */; };
+		1B12386C2D2CDAD300B2A3AD /* SyncedProducts.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 1B12386A2D2CDAD300B2A3AD /* SyncedProducts.storekit */; };
+		1B12386D2D2CDAD300B2A3AD /* SyncedProducts.storekit in Resources */ = {isa = PBXBuildFile; fileRef = 1B12386A2D2CDAD300B2A3AD /* SyncedProducts.storekit */; };
+		1B1238732D2E235000B2A3AD /* TransactionObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B1238722D2E235000B2A3AD /* TransactionObserver.swift */; };
+		1B1238742D2E235000B2A3AD /* TransactionObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B1238722D2E235000B2A3AD /* TransactionObserver.swift */; };
+		1B1238752D2E235000B2A3AD /* TransactionObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B1238722D2E235000B2A3AD /* TransactionObserver.swift */; };
 		651169E32D13D0A00011E76B /* KMNewUserGuideModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651169E22D13D0A00011E76B /* KMNewUserGuideModel.swift */; };
 		651169E42D13D0A00011E76B /* KMNewUserGuideModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651169E22D13D0A00011E76B /* KMNewUserGuideModel.swift */; };
 		651169E52D13D0A00011E76B /* KMNewUserGuideModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651169E22D13D0A00011E76B /* KMNewUserGuideModel.swift */; };
@@ -5870,6 +5888,12 @@
 		03063B5B2CE3908C006DB603 /* KMMemberCenterWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMemberCenterWindowController.swift; sourceTree = "<group>"; };
 		03063B5C2CE3908C006DB603 /* KMMemberCenterWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMMemberCenterWindowController.xib; sourceTree = "<group>"; };
 		037A787E2CE9FEC400B025FE /* KMProductCompareWC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMProductCompareWC.xib; sourceTree = "<group>"; };
+		1B12385A2D2CCB9600B2A3AD /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
+		1B12385B2D2CCB9600B2A3AD /* ContentViewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentViewViewController.swift; sourceTree = "<group>"; };
+		1B12385C2D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPDFOfferSubscriptionStoreView.swift; sourceTree = "<group>"; };
+		1B12385D2D2CCB9600B2A3AD /* SubscriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionViewController.swift; sourceTree = "<group>"; };
+		1B12386A2D2CDAD300B2A3AD /* SyncedProducts.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = SyncedProducts.storekit; sourceTree = "<group>"; };
+		1B1238722D2E235000B2A3AD /* TransactionObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionObserver.swift; sourceTree = "<group>"; };
 		651169E22D13D0A00011E76B /* KMNewUserGuideModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNewUserGuideModel.swift; sourceTree = "<group>"; };
 		651169E62D13F68D0011E76B /* KMNewUserGuideCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNewUserGuideCellView.swift; sourceTree = "<group>"; };
 		6526E69E2D1969B10089572F /* KMCancelSubscribeCouponsWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCancelSubscribeCouponsWindowController.swift; sourceTree = "<group>"; };
@@ -14227,6 +14251,11 @@
 				655445062C88481300BD9010 /* DiscountToSave */,
 				BB1B0A9C2B4FB88000889528 /* IAPProductsManager.h */,
 				BB1B0A9B2B4FB88000889528 /* IAPProductsManager.m */,
+				1B12385A2D2CCB9600B2A3AD /* ContentView.swift */,
+				1B12385B2D2CCB9600B2A3AD /* ContentViewViewController.swift */,
+				1B12385C2D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift */,
+				1B12385D2D2CCB9600B2A3AD /* SubscriptionViewController.swift */,
+				1B1238722D2E235000B2A3AD /* TransactionObserver.swift */,
 				65F476572D24C23600CE007C /* IAPReceiptModel.h */,
 				65F476582D24C23600CE007C /* IAPReceiptModel.m */,
 				BB6EA28F2B70AF44000D4490 /* KMConvertCompareViewController.h */,
@@ -14928,6 +14957,7 @@
 		BBFBE6B128DD7B97008B2335 = {
 			isa = PBXGroup;
 			children = (
+				1B12386A2D2CDAD300B2A3AD /* SyncedProducts.storekit */,
 				BB56D4002BFC92EE004E4DF4 /* PDF Reader Pro DMG.entitlements */,
 				BBFBE6BC28DD7B97008B2335 /* PDF Master */,
 				BBFBE6CE28DD7B98008B2335 /* PDF MasterTests */,
@@ -15870,6 +15900,7 @@
 				BBE66D092B55467C009343FA /* repeatTrialAlert_icon.png in Resources */,
 				BBD922332B50D61200DB9585 /* KMRateWindowController.xib in Resources */,
 				BBB789932BE8BF2400F7E09C /* AITypeItemChooseView.xib in Resources */,
+				1B12386B2D2CDAD300B2A3AD /* SyncedProducts.storekit in Resources */,
 				BB1E7F2C2B4FE2C6002D9785 /* GuideInfoImages.xcassets in Resources */,
 				BBB789B72BE8BF2400F7E09C /* AIChatDefaultTIpItem.xib in Resources */,
 				BBF62C742B0347D1007B7E86 /* SplitWindowController.xib in Resources */,
@@ -16468,6 +16499,7 @@
 				BBC8A7762B0640C200FA9377 /* KMBotaSearchViewController.xib in Resources */,
 				BBE66D0A2B55467C009343FA /* repeatTrialAlert_icon.png in Resources */,
 				9F3A48C92C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.xib in Resources */,
+				1B12386C2D2CDAD300B2A3AD /* SyncedProducts.storekit in Resources */,
 				BB8810BC2B4F872500AFA63E /* KMVerificationWindowController.xib in Resources */,
 				BB96A0B52AFCD56B00559E24 /* KMToolCompareWindowController.xib in Resources */,
 				9F8539FD2947137500DF644E /* throbber_waiting.png in Resources */,
@@ -16745,6 +16777,7 @@
 				ADE86AF42B0AF56C00414DFA /* KMCompareCoveringSettingView.xib in Resources */,
 				9FC3465B2CD0C7ED00F35823 /* KMEnterVerificationCodeView.xib in Resources */,
 				9F8539ED2947131F00DF644E /* KMChromiumTabView.xib in Resources */,
+				1B12386D2D2CDAD300B2A3AD /* SyncedProducts.storekit in Resources */,
 				AD1D48402AFB81F4007AC1F0 /* KMMergeBlankView.xib in Resources */,
 				BB986AE92AD5376100ADF172 /* WelcomeWindowController.xib in Resources */,
 				BBEC00DE295C39FD00A26C98 /* KMBatesPropertyInfoController.xib in Resources */,
@@ -17724,6 +17757,7 @@
 				AD68783329A60FA7005B5210 /* KMLoginView.swift in Sources */,
 				ADC63E3F2A49816900854E02 /* KMSubscribeSuccessView.swift in Sources */,
 				9F0CB531298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
+				1B1238742D2E235000B2A3AD /* TransactionObserver.swift in Sources */,
 				BB8115FF2992682F0008F536 /* KMSecureLimitAlertView.swift in Sources */,
 				ADDEEA662AD3C4BE00EF675D /* KMPDFSignatureImageView.swift in Sources */,
 				BBB14A5B2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
@@ -18244,6 +18278,10 @@
 				89D2D2E2294C452B00BFF5FE /* KMPDFThumbnailView.swift in Sources */,
 				BB10FAE52AFE039E00F18D65 /* KMPDFEditPageRangeWindowController.swift in Sources */,
 				654858CB2D126A1D00EC73F5 /* KMCheckInWindowController.swift in Sources */,
+				1B1238622D2CCB9600B2A3AD /* ContentView.swift in Sources */,
+				1B1238632D2CCB9600B2A3AD /* SubscriptionViewController.swift in Sources */,
+				1B1238642D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift in Sources */,
+				1B1238652D2CCB9600B2A3AD /* ContentViewViewController.swift in Sources */,
 				BB9599C32B31647B0062D346 /* KMRedactPropertiesWindowController.swift in Sources */,
 				ADD1B6B729420B2300C3FFF7 /* KMPrintChooseView.swift in Sources */,
 				BBFEF7232B3A78BC00C28AC0 /* KMSystemGotoMenu.swift in Sources */,
@@ -18823,6 +18861,7 @@
 				AD58F4202B1DC29100299EE0 /* KMPrintViewModel.swift in Sources */,
 				BB83B8ED2BA8415A00EFF584 /* KMPageEditExtractWindowController.swift in Sources */,
 				AD1FE8302BD7C98300AA4A9B /* KMBookletParameterModel.m in Sources */,
+				1B1238752D2E235000B2A3AD /* TransactionObserver.swift in Sources */,
 				BB65A0552AF8B90F003A27A0 /* KMDisplayPreferences.swift in Sources */,
 				BB74DA7C2AC41DE9006EDFE7 /* NSString+KMExtension.swift in Sources */,
 				BBB789912BE8BF2300F7E09C /* AITypeItemChooseView.swift in Sources */,
@@ -19039,6 +19078,10 @@
 				BB5F8A2029BB15AD00365ADB /* KMEmailSubWindowController.m in Sources */,
 				AD68783429A60FA7005B5210 /* KMLoginView.swift in Sources */,
 				9F0CB532298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
+				1B12385E2D2CCB9600B2A3AD /* ContentView.swift in Sources */,
+				1B12385F2D2CCB9600B2A3AD /* SubscriptionViewController.swift in Sources */,
+				1B1238602D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift in Sources */,
+				1B1238612D2CCB9600B2A3AD /* ContentViewViewController.swift in Sources */,
 				BB981E562AD4F638001988CA /* KMPageIndicator.swift in Sources */,
 				AD055E4B2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */,
 				BB3A669B2B07520800575343 /* KMCustomOutlineView.swift in Sources */,
@@ -20968,6 +21011,7 @@
 				AD867F9E29D9853200F00440 /* KMBOTAOutlineRowView.swift in Sources */,
 				BBC3482B29559B22008D2CD1 /* KMBackgroundListCell.swift in Sources */,
 				F34BF93729530708002C25A2 /* NSImage+PDFListView.m in Sources */,
+				1B1238732D2E235000B2A3AD /* TransactionObserver.swift in Sources */,
 				BB4A94A62B04DA0C00940F8B /* KMGOCRManagerNew.swift in Sources */,
 				9FAAA32C290BD01D0046FFCE /* KMHomeHistoryFileViewController.swift in Sources */,
 				BB276A522B0376B400AB5578 /* KMBatchOperateRemoveHeaderFooterViewController.swift in Sources */,
@@ -21111,6 +21155,10 @@
 				9F1FE50129406E4700E952CA /* CTTabStripModel.m in Sources */,
 				AD055EB62B8841780035F824 /* SKSeparatorCell.m in Sources */,
 				9FC346572CD0C4FB00F35823 /* KMEnterVerificationCodeView.swift in Sources */,
+				1B1238662D2CCB9600B2A3AD /* ContentView.swift in Sources */,
+				1B1238672D2CCB9600B2A3AD /* SubscriptionViewController.swift in Sources */,
+				1B1238682D2CCB9600B2A3AD /* CPDFOfferSubscriptionStoreView.swift in Sources */,
+				1B1238692D2CCB9600B2A3AD /* ContentViewViewController.swift in Sources */,
 				BBF729B12B1962C900576AC5 /* KMRemoveHeaderFooterQueue.swift in Sources */,
 				BBB789AA2BE8BF2400F7E09C /* AIChatFileInfoItem.swift in Sources */,
 				AD85D1A62AF09864000F4D28 /* KMHomeQuickToolsWindowController.swift in Sources */,
@@ -21554,14 +21602,12 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = "PDF Master/PDF_Reader_Pro.entitlements";
 				CODE_SIGN_IDENTITY = "Apple Development";
-				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer";
-				CODE_SIGN_STYLE = Manual;
+				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				COPYING_PRESERVES_HFS_DATA = NO;
 				CURRENT_PROJECT_VERSION = 0;
 				DEFINES_MODULE = YES;
-				DEVELOPMENT_TEAM = "";
-				"DEVELOPMENT_TEAM[sdk=macosx*]" = 4GGQPGRTSV;
+				DEVELOPMENT_TEAM = 4GGQPGRTSV;
 				ENABLE_HARDENED_RUNTIME = NO;
 				EXCLUDED_ARCHS = "";
 				FRAMEWORK_SEARCH_PATHS = (
@@ -21647,7 +21693,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.brother.pdfreaderprofree.mac;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
-				"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = pdfreaderpro_development_provisioning;
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG VERSION_FREE";
 				SWIFT_EMIT_LOC_STRINGS = YES;
 				SWIFT_OBJC_BRIDGING_HEADER = "PDF Master/PDF_Reader_Pro-Bridging-Header.h";
@@ -21668,14 +21713,12 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = "PDF Master/PDF_Reader_Pro.entitlements";
 				CODE_SIGN_IDENTITY = "Apple Development";
-				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer";
-				CODE_SIGN_STYLE = Manual;
+				CODE_SIGN_STYLE = Automatic;
 				COMBINE_HIDPI_IMAGES = YES;
 				COPYING_PRESERVES_HFS_DATA = NO;
 				CURRENT_PROJECT_VERSION = 0;
 				DEFINES_MODULE = YES;
-				DEVELOPMENT_TEAM = "";
-				"DEVELOPMENT_TEAM[sdk=macosx*]" = 4GGQPGRTSV;
+				DEVELOPMENT_TEAM = 4GGQPGRTSV;
 				ENABLE_HARDENED_RUNTIME = NO;
 				EXCLUDED_ARCHS = "";
 				FRAMEWORK_SEARCH_PATHS = (
@@ -21761,7 +21804,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.brother.pdfreaderprofree.mac;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
-				"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = pdfreaderpro_development_provisioning;
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = VERSION_FREE;
 				SWIFT_EMIT_LOC_STRINGS = YES;
 				SWIFT_OBJC_BRIDGING_HEADER = "PDF Master/PDF_Reader_Pro-Bridging-Header.h";

+ 553 - 0
PDF Office/SyncedProducts.storekit

@@ -0,0 +1,553 @@
+{
+  "appPolicies" : {
+    "eula" : "",
+    "policies" : [
+      {
+        "locale" : "en_US",
+        "policyText" : "",
+        "policyURL" : ""
+      }
+    ]
+  },
+  "identifier" : "A5F77AA7",
+  "nonRenewingSubscriptions" : [
+
+  ],
+  "products" : [
+    {
+      "displayPrice" : "14.99",
+      "familyShareable" : false,
+      "internalID" : "6476610390",
+      "localizations" : [
+        {
+          "description" : "one-time purchase for 50 credit within 30 day",
+          "displayName" : "ai_all_access_pack",
+          "locale" : "en_US"
+        }
+      ],
+      "productID" : "com.pdfreaderpro.mac_free.ai_1_month_subscription",
+      "referenceName" : "ai_all_access_pack",
+      "type" : "Consumable"
+    },
+    {
+      "displayPrice" : "89.99",
+      "familyShareable" : false,
+      "internalID" : "6738076759",
+      "localizations" : [
+        {
+          "description" : "Get lifetime access to all advanced features.",
+          "displayName" : "PDF Pro · Advanced Permanent",
+          "locale" : "en_US"
+        }
+      ],
+      "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_advanced_permanent_license.001",
+      "referenceName" : "all_access_pack_permanent",
+      "type" : "NonConsumable"
+    },
+    {
+      "displayPrice" : "79.99",
+      "familyShareable" : false,
+      "internalID" : "1466736513",
+      "localizations" : [
+        {
+          "description" : "Access all premium features in PDF Reader Pro",
+          "displayName" : "Permanent License",
+          "locale" : "en_US"
+        }
+      ],
+      "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_permanent_license.001",
+      "referenceName" : "all_access_pack_permanent_license",
+      "type" : "NonConsumable"
+    }
+  ],
+  "settings" : {
+    "_applicationInternalID" : "919472673",
+    "_developerTeamID" : "4GGQPGRTSV",
+    "_failTransactionsEnabled" : false,
+    "_lastSynchronizedDate" : 757998137.97390997,
+    "_locale" : "en_US",
+    "_storefront" : "USA",
+    "_storeKitErrors" : [
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Load Products"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Purchase"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Verification"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "App Store Sync"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Subscription Status"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "App Transaction"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Manage Subscriptions Sheet"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Refund Request Sheet"
+      },
+      {
+        "current" : null,
+        "enabled" : false,
+        "name" : "Offer Code Redeem Sheet"
+      }
+    ]
+  },
+  "subscriptionGroups" : [
+    {
+      "id" : "21580095",
+      "localizations" : [
+
+      ],
+      "name" : "AI Access Pack",
+      "subscriptions" : [
+        {
+          "adHocOffers" : [
+
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "125.99",
+          "familyShareable" : false,
+          "groupNumber" : 2,
+          "internalID" : "6738066463",
+          "introductoryOffer" : {
+            "internalID" : "6331E9DE",
+            "numberOfPeriods" : 1,
+            "paymentMode" : "free",
+            "subscriptionPeriod" : "P1Y"
+          },
+          "localizations" : [
+            {
+              "description" : "Utilize AI-powered features Annual.",
+              "displayName" : "PDF Pro · AI Annual",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.ai_pack_12_month",
+          "recurringSubscriptionPeriod" : "P1Y",
+          "referenceName" : "ai_all_access_pack_12month",
+          "subscriptionGroupID" : "21580095",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        },
+        {
+          "adHocOffers" : [
+
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "14.99",
+          "familyShareable" : false,
+          "groupNumber" : 1,
+          "internalID" : "6738066484",
+          "introductoryOffer" : null,
+          "localizations" : [
+            {
+              "description" : "Utilize AI-powered features monthly.",
+              "displayName" : "PDF Pro · AI Monthly",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.ai_pack_1_month",
+          "recurringSubscriptionPeriod" : "P1M",
+          "referenceName" : "ai_all_access_pack_1month",
+          "subscriptionGroupID" : "21580095",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        }
+      ]
+    },
+    {
+      "id" : "20403872",
+      "localizations" : [
+
+      ],
+      "name" : "All Access Pack",
+      "subscriptions" : [
+        {
+          "adHocOffers" : [
+            {
+              "displayPrice" : "69.99",
+              "internalID" : "77770EF2",
+              "numberOfPeriods" : 1,
+              "offerID" : "4_devices_all_access_pack_12months_20250102",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "FreeTrialUserOffer_12months",
+              "subscriptionPeriod" : "P1Y"
+            }
+          ],
+          "codeOffers" : [
+            {
+              "displayPrice" : "99.99",
+              "eligibility" : [
+                "existing",
+                "new",
+                "expired"
+              ],
+              "internalID" : "EE4A3A79",
+              "isStackable" : false,
+              "numberOfPeriods" : 1,
+              "paymentMode" : "payAsYouGo",
+              "referenceName" : "test",
+              "subscriptionPeriod" : "P1Y"
+            }
+          ],
+          "displayPrice" : "99.99",
+          "familyShareable" : false,
+          "groupNumber" : 1,
+          "internalID" : "6738075487",
+          "introductoryOffer" : {
+            "displayPrice" : "59.99",
+            "internalID" : "4DCBD920",
+            "numberOfPeriods" : 1,
+            "paymentMode" : "payAsYouGo",
+            "subscriptionPeriod" : "P1Y"
+          },
+          "localizations" : [
+            {
+              "description" : "Unlock all premium features for a full year.",
+              "displayName" : "PDF Pro · New Advanced Annual",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_advanced_annual.001",
+          "recurringSubscriptionPeriod" : "P1Y",
+          "referenceName" : "4_devices_all_access_pack_12months",
+          "subscriptionGroupID" : "20403872",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        },
+        {
+          "adHocOffers" : [
+            {
+              "displayPrice" : "39.99",
+              "internalID" : "410FF241",
+              "numberOfPeriods" : 1,
+              "offerID" : "4_devices_all_access_pack_new_6month_20250102",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "FreeTrialUserOffer",
+              "subscriptionPeriod" : "P6M"
+            }
+          ],
+          "codeOffers" : [
+            {
+              "displayPrice" : "39.99",
+              "eligibility" : [
+                "expired",
+                "new"
+              ],
+              "internalID" : "71ADEE58",
+              "isStackable" : false,
+              "numberOfPeriods" : 1,
+              "paymentMode" : "payUpFront",
+              "referenceName" : "NewUserOffer",
+              "subscriptionPeriod" : "P6M"
+            },
+            {
+              "displayPrice" : "39.99",
+              "eligibility" : [
+                "new"
+              ],
+              "internalID" : "B3646B85",
+              "isStackable" : false,
+              "numberOfPeriods" : 1,
+              "paymentMode" : "payUpFront",
+              "referenceName" : "NewUser_Offer",
+              "subscriptionPeriod" : "P6M"
+            }
+          ],
+          "displayPrice" : "49.99",
+          "familyShareable" : false,
+          "groupNumber" : 1,
+          "internalID" : "6738075448",
+          "introductoryOffer" : {
+            "displayPrice" : "39.99",
+            "internalID" : "B2A79555",
+            "numberOfPeriods" : 1,
+            "paymentMode" : "payUpFront",
+            "subscriptionPeriod" : "P6M"
+          },
+          "localizations" : [
+            {
+              "description" : "Access all premium features for 6 months.",
+              "displayName" : "PDF Pro · New Advanced 6 Mos.",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_advanced_6months.001",
+          "recurringSubscriptionPeriod" : "P6M",
+          "referenceName" : "4_devices_all_access_pack_new_6months",
+          "subscriptionGroupID" : "20403872",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+            {
+              "displayPrice" : "19.99",
+              "internalID" : "264775DC",
+              "isEligible" : true,
+              "numberOfPeriods" : 1,
+              "offerID" : "basic.month.winback.6monthsdiscount01.19.99",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "Discount for 6 months 01 - $19.99",
+              "subscriptionPeriod" : "P6M"
+            },
+            {
+              "displayPrice" : "29.99",
+              "internalID" : "E090F77B",
+              "isEligible" : true,
+              "numberOfPeriods" : 1,
+              "offerID" : "basic.month.winback.6monthsdiscount03.29.99",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "Discount for 6 months 03 - $29.99",
+              "subscriptionPeriod" : "P6M"
+            },
+            {
+              "displayPrice" : "39.99",
+              "internalID" : "956BE2C1",
+              "isEligible" : true,
+              "numberOfPeriods" : 1,
+              "offerID" : "test.winback.6monthsdiscount.39.99.",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "for test only - $39.99.",
+              "subscriptionPeriod" : "P6M"
+            },
+            {
+              "displayPrice" : "34.99",
+              "internalID" : "72E59421",
+              "isEligible" : true,
+              "numberOfPeriods" : 1,
+              "offerID" : "basic.month.winback.6monthsdiscount02.34.99",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "Discount for 6 months 02 - $34.99",
+              "subscriptionPeriod" : "P6M"
+            },
+            {
+              "displayPrice" : "24.99",
+              "internalID" : "9719A698",
+              "isEligible" : true,
+              "numberOfPeriods" : 1,
+              "offerID" : "basic.month.winback.6monthsdiscount04.24.99.",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "Discount for 6 months 04 - $24.99.",
+              "subscriptionPeriod" : "P6M"
+            },
+            {
+              "displayPrice" : "19.99",
+              "internalID" : "0EF8A0BF",
+              "isEligible" : true,
+              "numberOfPeriods" : 1,
+              "offerID" : "basic.month.winback.6monthsdiscount05.19.99",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "Discount for 6 months 05 - $19.99",
+              "subscriptionPeriod" : "P6M"
+            }
+          ]
+        },
+        {
+          "adHocOffers" : [
+            {
+              "displayPrice" : "41.99",
+              "internalID" : "C934961B",
+              "numberOfPeriods" : 1,
+              "offerID" : "all_access_pack_12months_202407260",
+              "paymentMode" : "payAsYouGo",
+              "referenceName" : "all_access_pack_12months_202407260",
+              "subscriptionPeriod" : "P1Y"
+            }
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "59.99",
+          "familyShareable" : false,
+          "groupNumber" : 1,
+          "internalID" : "6526471301",
+          "introductoryOffer" : null,
+          "localizations" : [
+            {
+              "description" : "Access all premium features in PDF Reader Pro",
+              "displayName" : "1-Year Plan",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_12months.001",
+          "recurringSubscriptionPeriod" : "P1Y",
+          "referenceName" : "all_access_pack_12months",
+          "subscriptionGroupID" : "20403872",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        },
+        {
+          "adHocOffers" : [
+
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "29.99",
+          "familyShareable" : false,
+          "groupNumber" : 3,
+          "internalID" : "1263343699",
+          "introductoryOffer" : null,
+          "localizations" : [
+            {
+              "description" : "Access all premium features in PDF Reader Pro",
+              "displayName" : "All Access Pack",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_6months.001",
+          "recurringSubscriptionPeriod" : "P6M",
+          "referenceName" : "all_access_pack_6months",
+          "subscriptionGroupID" : "20403872",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        },
+        {
+          "adHocOffers" : [
+            {
+              "displayPrice" : "27.99",
+              "internalID" : "2F7F7D9F",
+              "numberOfPeriods" : 1,
+              "offerID" : "all_access_pack_new_6months_202407260",
+              "paymentMode" : "payUpFront",
+              "referenceName" : "all_access_pack_new_6months_202407260",
+              "subscriptionPeriod" : "P6M"
+            }
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "29.99",
+          "familyShareable" : false,
+          "groupNumber" : 2,
+          "internalID" : "1466735814",
+          "introductoryOffer" : {
+            "internalID" : "171B2A8C",
+            "numberOfPeriods" : 1,
+            "paymentMode" : "free",
+            "subscriptionPeriod" : "P3D"
+          },
+          "localizations" : [
+            {
+              "description" : "Access all premium features in PDF Reader Pro",
+              "displayName" : "All Access Pack",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.all_access_pack_new_6months.001",
+          "recurringSubscriptionPeriod" : "P6M",
+          "referenceName" : "all_access_pack_new_6months",
+          "subscriptionGroupID" : "20403872",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        }
+      ]
+    },
+    {
+      "id" : "21572942",
+      "localizations" : [
+
+      ],
+      "name" : "Device Upgrade Pack",
+      "subscriptions" : [
+        {
+          "adHocOffers" : [
+
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "39.99",
+          "familyShareable" : false,
+          "groupNumber" : 3,
+          "internalID" : "6738075354",
+          "introductoryOffer" : null,
+          "localizations" : [
+            {
+              "description" : "Add 2 more devices subscription for one year.",
+              "displayName" : "Add 2-Device · Advanced Annual",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.advanced_add_2_devices_all_access_pack_advanced_annual.001",
+          "recurringSubscriptionPeriod" : "P1Y",
+          "referenceName" : "advanced_add_2_devices_all_access_pack_12months",
+          "subscriptionGroupID" : "21572942",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        },
+        {
+          "adHocOffers" : [
+
+          ],
+          "codeOffers" : [
+
+          ],
+          "displayPrice" : "49.99",
+          "familyShareable" : false,
+          "groupNumber" : 2,
+          "internalID" : "6738075288",
+          "introductoryOffer" : null,
+          "localizations" : [
+            {
+              "description" : "Extend your device subscription for one year.",
+              "displayName" : "Add Devices · Advanced Annual",
+              "locale" : "en_US"
+            }
+          ],
+          "productID" : "com.pdfreaderpro.mac_free.member.advanced_add_devices_all_access_pack_advanced_annual.001",
+          "recurringSubscriptionPeriod" : "P1Y",
+          "referenceName" : "advanced_add_devices_all_access_pack_12months",
+          "subscriptionGroupID" : "21572942",
+          "type" : "RecurringSubscription",
+          "winbackOffers" : [
+
+          ]
+        }
+      ]
+    }
+  ],
+  "version" : {
+    "major" : 4,
+    "minor" : 0
+  }
+}