├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── Package.swift ├── README.md ├── Source └── StoreKitCompanion.swift ├── StoreKitCompanion Examples ├── .swiftlint.yml ├── Examples.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ ├── iOS Example.xcscheme │ │ └── macOS Example.xcscheme ├── iOS Example │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── ViewController.swift └── macOS Example │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Base.lproj │ └── Main.storyboard │ ├── Info.plist │ ├── ViewController.swift │ └── main.swift ├── StoreKitCompanion.podspec ├── StoreKitCompanion.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist └── StoreKitCompanion ├── .swiftlint.yml ├── StoreKitCompanion iOS ├── Info.plist ├── StoreKitCompanion iOS.h └── StoreKitCompanion.h ├── StoreKitCompanion iOSTests ├── Info.plist ├── StoreKitCompanionTests.swift └── StoreKitCompanion_iOSTests.swift ├── StoreKitCompanion macOS ├── Info.plist └── StoreKitCompanion macOS.h ├── StoreKitCompanion macOSTests ├── Info.plist └── StoreKitCompanion_macOSTests.swift └── StoreKitCompanion.xcodeproj ├── project.pbxproj └── xcshareddata └── xcschemes ├── StoreKitCompanion iOS.xcscheme └── StoreKitCompanion macOS.xcscheme /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | 6 | ## Build generated 7 | build/ 8 | DerivedData 9 | 10 | ## Various settings 11 | *.pbxuser 12 | !default.pbxuser 13 | *.mode1v3 14 | !default.mode1v3 15 | *.mode2v3 16 | !default.mode2v3 17 | *.perspectivev3 18 | !default.perspectivev3 19 | xcuserdata 20 | 21 | ## Other 22 | *.xccheckout 23 | *.moved-aside 24 | *.xcuserstate 25 | *.xcscmblueprint 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | .build/ 37 | 38 | # Carthage 39 | Carthage/Build -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode10.3 3 | notifications: 4 | email: false 5 | branches: 6 | only: 7 | - master 8 | env: 9 | global: 10 | - LC_CTYPE=en_US.UTF-8 11 | - LANG=en_US.UTF-8 12 | - WORKSPACE=StoreKitCompanion.xcworkspace 13 | - IOS_FRAMEWORK_SCHEME="StoreKitCompanion iOS" 14 | - MACOS_FRAMEWORK_SCHEME="StoreKitCompanion macOS" 15 | - IOS_SDK=iphonesimulator12.4 16 | - MACOS_SDK=macosx10.14 17 | - EXAMPLE_SCHEME="iOS Example" 18 | matrix: 19 | - DESTINATION="OS=12.4,name=iPhone Xʀ" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="YES" 20 | - DESTINATION="OS=12.4,name=iPhone Xs" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="YES" 21 | - DESTINATION="arch=x86_64" SCHEME="$MACOS_FRAMEWORK_SCHEME" SDK="$OSX_SDK" RUN_TESTS="YES" BUILD_EXAMPLE="NO" 22 | script: 23 | - set -o pipefail 24 | - xcodebuild -version 25 | - xcodebuild -showsdks 26 | 27 | # Build Framework in Debug and Run Tests if specified 28 | - if [ $RUN_TESTS == "YES" ]; then 29 | xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO test | xcpretty -c; 30 | else 31 | xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO build | xcpretty -c; 32 | fi 33 | 34 | # Build Framework in ReleaseTest and Run Tests if specified 35 | - if [ $RUN_TESTS == "YES" ]; then 36 | xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration ReleaseTest ONLY_ACTIVE_ARCH=NO test | xcpretty -c; 37 | else 38 | xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration ReleaseTest ONLY_ACTIVE_ARCH=NO build | xcpretty -c; 39 | fi 40 | 41 | # Build Example in Debug if specified 42 | - if [ $BUILD_EXAMPLE == "YES" ]; then 43 | xcodebuild -workspace "$WORKSPACE" -scheme "$EXAMPLE_SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO build | xcpretty -c; 44 | fi 45 | 46 | after_success: 47 | - sleep 5 # Workaround for https://github.com/travis-ci/travis-ci/issues/4725 48 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to the project will be documented in this file. 4 | 5 | --- 6 | 7 | ## Next 8 | 9 | ### API breaking changes 10 | 11 | N/A 12 | 13 | ### Enhancements 14 | 15 | N/A 16 | 17 | ### Bugfixes 18 | 19 | N/A 20 | 21 | ## [2.0.0](https://github.com/recisio/StoreKitCompanion/releases/tag/2.0.0) (05-03-2017) 22 | 23 | ### API breaking changes 24 | 25 | - Swift 3 support. README is up to date, please report if you find any diffs 26 | - Some APIs have been updated to be more swifty, check out the README for more information 27 | 28 | ## [1.0.1](https://github.com/recisio/StoreKitCompanion/releases/tag/1.0.1) (08-04-2016) 29 | 30 | ### Bugfixes 31 | 32 | - Fixed: store products to make payments possible. - [#4](https://github.com/recisio/StoreKitCompanion/pull/4) 33 | 34 | ## [1.0](https://github.com/recisio/StoreKitCompanion/releases/tag/1.0) (25-01-2016) 35 | 36 | First version -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Recisio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "StoreKitCompanion" 5 | ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # StoreKitCompanion 2 | 3 | A lightweight wrapper for Apple's StoreKit, written in Swift. 4 | 5 | [![CI Status](https://travis-ci.org/recisio/StoreKitCompanion.svg)](https://travis-ci.org/recisio/StoreKitCompanion) 6 | ![Language](https://img.shields.io/badge/language-Swift%203.0-orange.svg) 7 | [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/recisio/StoreKitCompanion.svg)](https://img.shields.io/cocoapods/v/StoreKitCompanion.svg) 8 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 9 | [![Platform](https://img.shields.io/cocoapods/p/StoreKitCompanion.svg?style=flat)](http://cocoadocs.org/docsets/StoreKitCompanion) 10 | [![License](https://img.shields.io/cocoapods/l/StoreKitCompanion.svg?style=flat)](http://cocoapods.org/pods/StoreKitCompanion) 11 | 12 | ## Installation 13 | 14 | ### CocoaPods 15 | 16 | Add `pod 'StoreKitCompanion'` to your Podfile and run `pod install`. 17 | 18 | ### Carthage 19 | 20 | Add `github "Recisio/StoreKitCompanion"` to your Cartfile. 21 | 22 | ### Swift Package Manager 23 | 24 | StoreKitCompanion is available on SPM. Just add the following to your Package file: 25 | 26 | ```swift 27 | import PackageDescription 28 | 29 | let package = Package( 30 | dependencies: [ 31 | .Package(url: "https://github.com/recisio/StoreKitCompanion.git", majorVersion: 1) 32 | ] 33 | ) 34 | ``` 35 | ### Manually 36 | 37 | Add `StoreKitCompanion.swift` to your project. 38 | 39 | ## Usage 40 | 41 | StoreKitCompanion lets you **fetch products**, **launch payment transactions** and **send App Store Receipt data over the network for validation** in a couple of lines of code. 42 | 43 | ### Fetching Products 44 | 45 | Fetching products is easy, call `fetchProductsWithIdentifiers(_:completion:)` and pass in a set of product identifiers. 46 | At a very minimum, also supply a completion closure to get the valid `SKProduct` objects returned. 47 | Optionally, supply a failure closure to handle errors. 48 | 49 | ```swift 50 | StoreKitCompanion.sharedInstance.fetchProductsWithIdentifiers(["com.mycompany.MyKillerProduct"], completion: { products, invalids in 51 | print("Got products", products) 52 | print("Got invalids", invalids) 53 | }) 54 | ``` 55 | 56 | ### Buying 57 | 58 | Before trying to buy something, you should check whether users are allowed to make payments. 59 | You can do so by calling `canMakePayments()`. 60 | 61 | ```swift 62 | StoreKitCompanion.sharedInstance.canMakePayments() 63 | ``` 64 | 65 | Payments are submitted to the default payment queue (`SKPaymentQueue.defaultQueue()`) and StoreKitCompanion observes it. 66 | Whenever something happen on it, StoreKitCompanion sends notifications, and calls closures that you set. 67 | 68 | ```swift 69 | // Provide a closure to be called when transactions are updated 70 | StoreKitCompanion.sharedInstance.transactionsUpdateHandler = { queue, transactions in 71 | // Process transactions.. 72 | } 73 | // Add a payment, quantity is 1 by default 74 | StoreKitCompanion.sharedInstance.addPaymentForProductIdentifier("com.mycompany.MyKillerProduct") 75 | ``` 76 | 77 | ### Restoring previous transactions 78 | 79 | You can restore completed transactions by calling `restoreCompletedTransactionsWithUsername(_:)`. 80 | You may also provide an optional username. 81 | Callbacks that you set are called in response to the restoration request. 82 | 83 | ```swift 84 | StoreKitCompanion.restoreCompletedTransactionsWithUsername() 85 | ``` 86 | 87 | ### Validating the App Store Receipt 88 | 89 | Details about App Store receipt validation can be found on [Apple's website](https://developer.apple.com/library/mac/releasenotes/General/ValidateAppStoreReceipt/Introduction.html). 90 | While StoreKitCompanion doesn't perform any local validation (yet?) of the receipt, it let's you send it to a server for validation. 91 | 92 | By default, StoreKitCompanion will send the data using a HTTP POST request, with a parameter named `receiptData`, but you can override those settings if you need to. 93 | 94 | 95 | ```swift 96 | // First supply a validation URL, StoreKitCompanion will use it 97 | StoreKitCompanion.sharedInstance.validationURLString = "http://myserver.com" 98 | // Send the data out 99 | StoreKitCompanion.sharedInstance.sendReceiptWithPOSTRequest() { responseData, error in 100 | print("Got response", responseData) 101 | print("Got error", error) 102 | } 103 | ``` 104 | 105 | To customize the way the receipt is sent, use `sendReceiptWithDescriptor(_:completion:)` and provide it with any object that adopts the `ReceiptValidationRequestDescriptor` protocol. 106 | Default values are already provided in a protocol extension, so override only what's needed. 107 | 108 | ```swift 109 | struct MyRequestDescriptor: ReceiptValidationRequestDescriptor { 110 | 111 | // Name parameters differently or add parameters 112 | func parametersWithReceiptData(receiptData: NSData) -> [String: AnyObject]? { 113 | return ["best_param_name": receiptData, "new_param": "new_param_value"] 114 | } 115 | 116 | } 117 | 118 | // Send the data out 119 | StoreKitCompanion.sharedInstance.sendReceiptWithDescriptor(MyRequestDescriptor()) { responseData, error in 120 | print("Got response", responseData) 121 | print("Got error", error) 122 | } 123 | ``` 124 | ## Other 125 | 126 | ### Notifications 127 | 128 | StoreKitCompanion watches the default payment queue and sends notifications : 129 | 130 | ```swift 131 | /** 132 | The name of the notification sent when the payment queue finished to restore completed transactions. 133 | User info dictionary contains a reference to the `SKPaymentQueue` object. 134 | */ 135 | public static let PaymentQueueDidFinishRestoringCompletedTransactions = "SKCPaymentQueueDidFinishRestoringCompletedTransactions" 136 | /** 137 | The name of the notification sent when transactions are updated. 138 | User info dictionary contains a reference to the `SKPaymentQueue` object and an array of `SKPaymentTransaction` objects. 139 | */ 140 | public static let PaymentQueueDidUpdateTransactions = "SKCPaymentQueueDidUpdateTransactions" 141 | /** 142 | The name of the notification sent when transactions are removed. 143 | User info dictionary contains a reference to the `SKPaymentQueue` object and an array of `SKPaymentTransaction` objects. 144 | */ 145 | public static let PaymentQueueDidRemoveTransactions = "SKCPaymentQueueDidRemoveTransactions" 146 | /** 147 | The name of the notification sent when downloads are updated 148 | User info dictionary contains a reference to the `SKPaymentQueue` object and an array of `SKDownload` objects. 149 | */ 150 | public static let PaymentQueueDidUpdateDownloads = "SKCPaymentQueueDidUpdateDownloads" 151 | /** 152 | The name of the notification sent when the payment queue fails to restore completed transactions. 153 | User info dictionary contains a reference to the `SKPaymentQueue` object and a reference to the `NSError` object. 154 | */ 155 | public static let PaymentQueueDidFailRestoringCompletedTransactions = "SKCPaymentQueueDidFailRestoringCompletedTransactions" 156 | ``` 157 | 158 | ### Callbacks 159 | 160 | Another way to handle payment queue events is to provide StoreKitCompanion with closures for those events : 161 | 162 | ```swift 163 | public typealias CompletedTransactionsRestoreCompletion = (SKPaymentQueue) -> Void 164 | public typealias CompletedTransactionsRestoreFailure = (SKPaymentQueue, NSError) -> Void 165 | public typealias DownloadsUpdateCompletion = (SKPaymentQueue, [SKDownload]) -> Void 166 | public typealias TransactionsUpdateCompletion = (SKPaymentQueue, [SKPaymentTransaction]) -> Void 167 | public typealias TransactionsRemovalCompletion = (SKPaymentQueue, [SKPaymentTransaction]) -> Void 168 | 169 | // .... 170 | 171 | /** 172 | Handles successful completed transactions restoration 173 | */ 174 | public var completedTransactionsRestorationSuccessHandler: CompletedTransactionsRestoreCompletion? 175 | /** 176 | Handles completed transaction restoration failure 177 | */ 178 | public var completedTransactionsRestorationFailureHandler: CompletedTransactionsRestoreFailure? 179 | /** 180 | Handles successful downloads restoration 181 | */ 182 | public var downloadsUpdateSuccessHandler: DownloadsUpdateCompletion? 183 | /** 184 | Handles transaction updates 185 | */ 186 | public var transactionsUpdateHandler: TransactionsUpdateCompletion? 187 | /** 188 | Handles transaction removals 189 | */ 190 | public var transactionsRemovalHandler: TransactionsRemovalCompletion? 191 | ``` 192 | 193 | ## What's next 194 | 195 | - Handling transaction restoration 196 | - Validating App Store Receipt locally 197 | 198 | ## Contribution 199 | 200 | - If you found a **bug**, open an **issue** 201 | - If you have a **feature request**, open an **issue** 202 | - If you want to **contribute**, submit a **pull request** 203 | 204 | ## License 205 | 206 | StoreKitCompanion is available under the MIT license. See the LICENSE file for more info. 207 | -------------------------------------------------------------------------------- /Source/StoreKitCompanion.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import Foundation 24 | import StoreKit 25 | 26 | // MARK: - Typealiases for StoreKitCompanion 27 | 28 | // swiftlint:disable file_length 29 | extension StoreKitCompanion { 30 | 31 | // MARK: Transaction Observer Callbacks 32 | 33 | public typealias CompletedTransactionsRestoreCompletion = (SKPaymentQueue) -> Void 34 | public typealias CompletedTransactionsRestoreFailure = (SKPaymentQueue, NSError) -> Void 35 | public typealias DownloadsUpdateCompletion = (SKPaymentQueue, [SKDownload]) -> Void 36 | public typealias TransactionsUpdateCompletion = (SKPaymentQueue, [SKPaymentTransaction]) -> Void 37 | public typealias TransactionsRemovalCompletion = (SKPaymentQueue, [SKPaymentTransaction]) -> Void 38 | 39 | // MARK: Request Failure 40 | 41 | public typealias Failure = (NSError?) -> Void 42 | 43 | // MARK: Products Fetch Callbacks 44 | 45 | public typealias ProductsResult = ([SKProduct]?, [String]?) -> Void 46 | 47 | } 48 | 49 | public class StoreKitCompanion: NSObject { 50 | 51 | /** 52 | The name of the notification sent when the payment queue finished to restore completed transactions. 53 | User info dictionary contains a reference to the `SKPaymentQueue` object. 54 | */ 55 | public static let PaymentQueueDidFinishRestoringCompletedTransactions = "SKCPaymentQueueDidFinishRestoringCompletedTransactions" 56 | 57 | /** 58 | The name of the notification sent when transactions are updated. 59 | User info dictionary contains a reference to the `SKPaymentQueue` object and an array of `SKPaymentTransaction` objects. 60 | */ 61 | public static let PaymentQueueDidUpdateTransactions = "SKCPaymentQueueDidUpdateTransactions" 62 | 63 | /** 64 | The name of the notification sent when transactions are removed. 65 | User info dictionary contains a reference to the `SKPaymentQueue` object and an array of `SKPaymentTransaction` objects. 66 | */ 67 | public static let PaymentQueueDidRemoveTransactions = "SKCPaymentQueueDidRemoveTransactions" 68 | 69 | /** 70 | The name of the notification sent when downloads are updated 71 | User info dictionary contains a reference to the `SKPaymentQueue` object and an array of `SKDownload` objects. 72 | */ 73 | public static let PaymentQueueDidUpdateDownloads = "SKCPaymentQueueDidUpdateDownloads" 74 | 75 | /** 76 | The name of the notification sent when the payment queue fails to restore completed transactions. 77 | User info dictionary contains a reference to the `SKPaymentQueue` object and a reference to the `NSError` object. 78 | */ 79 | public static let PaymentQueueDidFailRestoringCompletedTransactions = "SKCPaymentQueueDidFailRestoringCompletedTransactions" 80 | 81 | // MARK: User Info Keys 82 | 83 | /** 84 | The key for the payment queue (`SKPaymentQueue`) in user info dictionaries 85 | */ 86 | public static let PaymentQueueKey = "PaymentQueue" 87 | /** 88 | The key for an array of transactions (`SKPaymentTransaction`) in user info dictionaries 89 | */ 90 | public static let TransactionsKey = "Transactions" 91 | /** 92 | The key for an array of downloads (`SKDownload`) in user info dictionaries 93 | */ 94 | public static let DownloadsKey = "Downloads" 95 | /** 96 | The key for an error (`NSError`) in user info dictionaries 97 | */ 98 | public static let ErrorKey = "Error" 99 | 100 | // MARK: Error Domains 101 | 102 | public static let StoreKitCompanionErrorDomain = "com.recisio.StoreKitCompanion.ErrorDomain" 103 | 104 | // MARK: Error Codes 105 | 106 | public enum ErrorCodes: Int { 107 | case noReceiptData 108 | case noValidationURL 109 | } 110 | 111 | // MARK: Transaction Queue Observer callbacks 112 | 113 | /** 114 | Handles successful completed transactions restoration 115 | */ 116 | public var completedTransactionsRestorationSuccessHandler: CompletedTransactionsRestoreCompletion? 117 | /** 118 | Handles completed transaction restoration failure 119 | */ 120 | public var completedTransactionsRestorationFailureHandler: CompletedTransactionsRestoreFailure? 121 | /** 122 | Handles successful downloads restoration 123 | */ 124 | public var downloadsUpdateSuccessHandler: DownloadsUpdateCompletion? 125 | /** 126 | Handles transaction updates 127 | */ 128 | @objc 129 | public var transactionsUpdateHandler: TransactionsUpdateCompletion? 130 | /** 131 | Handles transaction removals 132 | */ 133 | public var transactionsRemovalHandler: TransactionsRemovalCompletion? 134 | 135 | /** 136 | The URL string for App Store Receipt validation 137 | */ 138 | public var validationURLString: String? 139 | 140 | // MARK: Singleton 141 | 142 | /** 143 | The shared store kit companion 144 | */ 145 | @objc public static let sharedInstance = StoreKitCompanion() 146 | 147 | // MARK: Lifecycle 148 | 149 | fileprivate override init() { 150 | super.init() 151 | SKPaymentQueue.default().add(self) 152 | } 153 | 154 | deinit { 155 | SKPaymentQueue.default().remove(self) 156 | } 157 | 158 | // MARK: Interacting with the Apple Store 159 | 160 | /** 161 | Starts a receipt refresh request. 162 | On OS X, checks if the receipt is avalable and exits with code 173 if not 163 | On iOS, starts a new `SKReceiptRefreshRequest` 164 | */ 165 | @objc 166 | public func refreshReceipt() { 167 | #if os(OSX) 168 | guard let appStoreReceiptURL = Bundle.main.appStoreReceiptURL else { 169 | return 170 | } 171 | do { 172 | guard try appStoreReceiptURL.checkResourceIsReachable() else { 173 | exit(173) 174 | } 175 | } catch { return } 176 | #elseif os(iOS) 177 | guard self.receiptRequest == nil else { 178 | return 179 | } 180 | self.receiptRequest = SKReceiptRefreshRequest(receiptProperties: nil) 181 | self.receiptRequest?.delegate = self 182 | self.receiptRequest?.start() 183 | #endif 184 | } 185 | 186 | /** 187 | Try fetching products with a given set of product identifiers. 188 | 189 | - parameter identifiers: The set of identifiers for the products to fetch 190 | - parameter completion: Called when the product request succeed 191 | - parameter failure: Called when the product request fail, if provided 192 | */ 193 | @objc 194 | public func fetchProductsWithIdentifiers(_ identifiers: Set, completion: @escaping ProductsResult, failure: Failure? = nil) { 195 | guard self.productsRequest == nil else { 196 | return 197 | } 198 | 199 | productsRequestCompletion = completion 200 | productsRequestFailure = failure 201 | 202 | self.productsRequest = SKProductsRequest(productIdentifiers: identifiers) 203 | self.productsRequest?.delegate = self 204 | self.productsRequest?.start() 205 | } 206 | 207 | // MARK: Making purchases 208 | 209 | /** 210 | Tells whether payments can be made. 211 | 212 | - returns: A Bool telling whether payments can be made 213 | */ 214 | public func canMakePayments() -> Bool { 215 | return SKPaymentQueue.canMakePayments() 216 | } 217 | 218 | /** 219 | Submits a payment to the default payment queue. 220 | 221 | - parameter productID: The identifier of the product to buy 222 | - parameter quantity: The quantity to buy, defaults to 1 223 | 224 | - returns: A Bool telling whether the payment is successfuly submitted to the queue 225 | */ 226 | public func addPaymentForProductIdentifier(_ productID: String, quantity: Int = 1) -> Bool { 227 | guard quantity > 0, let product = self.productWithIdentifier(productID) else { 228 | return false 229 | } 230 | 231 | // #if os(OSX) 232 | // guard let payment = SKMutablePayment.withProduct(product) as? SKMutablePayment else { 233 | // return false 234 | // } 235 | // #elseif os(iOS) 236 | let payment = SKMutablePayment(product: product) 237 | // #endif 238 | 239 | payment.quantity = quantity 240 | SKPaymentQueue.default().add(payment) 241 | return true 242 | } 243 | 244 | // MARK: Restoring purchases 245 | 246 | /** 247 | Asks the default payment queue to restore completed transactions 248 | 249 | - parameter username: An optional opaque identifier for the user's account, which is nil by default 250 | */ 251 | public func restoreCompletedTransactionsWithUsername(_ username: String? = nil) { 252 | if let user = username { 253 | SKPaymentQueue.default().restoreCompletedTransactions(withApplicationUsername: user) 254 | } else { 255 | SKPaymentQueue.default().restoreCompletedTransactions() 256 | } 257 | } 258 | 259 | // MARK: Validating receipts 260 | 261 | /** 262 | Returns App Store Receipt data as NSData if present or nil 263 | */ 264 | @objc 265 | public func appStoreReceiptData() -> Data? { 266 | if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL, let receiptData = try? Data(contentsOf: appStoreReceiptURL) { 267 | return receiptData 268 | } 269 | return nil 270 | } 271 | 272 | // /** 273 | // Sends the App Store Receipt data using a HTTP POST request asynchronously. 274 | // 275 | // - parameter completion: The closure to handle the request completion 276 | // */ 277 | // public func sendReceiptWithPOSTRequest(completion: (responseData: NSData?, error: NSError?) -> Void) { 278 | // self.sendReceiptWithDescriptor(self, completion: completion) 279 | // } 280 | 281 | // /** 282 | // Sends the App Store Receipt data using a HTTP request asynchronously. 283 | // 284 | // - parameter descriptor: An object used to provide parameters for the request 285 | // - parameter completion: The closure to handle the request completion 286 | // */ 287 | // public func sendReceiptWithDescriptor(descriptor: ReceiptValidationRequestDescriptor, completion: (responseData: NSData?, error: NSError?) -> Void) { 288 | // guard let receiptData = self.appStoreReceiptData() else { 289 | // let error = NSError(domain: StoreKitCompanion.StoreKitCompanionErrorDomain, code: ErrorCodes.NoReceiptData.rawValue, userInfo: nil) 290 | // completion(responseData: nil, error: error) 291 | // return 292 | // } 293 | // guard let urlString = descriptor.URL else { 294 | // let error = NSError(domain: StoreKitCompanion.StoreKitCompanionErrorDomain, code: ErrorCodes.NoValidationURL.rawValue, userInfo: nil) 295 | // completion(responseData: nil, error: error) 296 | // return 297 | // } 298 | // 299 | // swiftlint:disable:next line_length 300 | // Alamofire.request(descriptor.HTTPMethod, urlString, parameters: descriptor.parametersWithReceiptData(receiptData), encoding: descriptor.encoding, headers: descriptor.headers).response { _, _, data, error in 301 | // completion(responseData: data, error: error) 302 | // } 303 | // } 304 | 305 | // MARK: Private Stuff 306 | 307 | fileprivate var productsRequest: SKProductsRequest? 308 | fileprivate var products = [SKProduct]() 309 | fileprivate var productsRequestCompletion: ProductsResult? 310 | fileprivate var productsRequestFailure: Failure? 311 | 312 | #if os(iOS) 313 | fileprivate var receiptRequest: SKReceiptRefreshRequest? 314 | #endif 315 | 316 | // MARK: Helpers 317 | 318 | fileprivate func productWithIdentifier(_ productID: String) -> SKProduct? { 319 | return products.filter({ $0.productIdentifier == productID }).first 320 | } 321 | 322 | } 323 | 324 | /** 325 | Types adopting the `ReceiptValidationRequestDescriptor` protocol can be used to customize parameters for the validation request 326 | */ 327 | //public protocol ReceiptValidationRequestDescriptor { 328 | // 329 | // var HTTPMethod: Alamofire.Method { get } 330 | // var URL: String? { get } 331 | // var encoding: Alamofire.ParameterEncoding { get } 332 | // var headers: [String: String]? { get } 333 | // func parametersWithReceiptData(receiptData: NSData) -> [String: AnyObject]? 334 | // 335 | //} 336 | 337 | /** 338 | Default common values and implementation for `ReceiptValidationRequestDescriptor` 339 | */ 340 | //extension ReceiptValidationRequestDescriptor { 341 | // 342 | // /** 343 | // Sending receipt data through a POST request by default 344 | // */ 345 | // public var HTTPMethod: Alamofire.Method { 346 | // return .POST 347 | // } 348 | // 349 | // public var encoding: Alamofire.ParameterEncoding { 350 | // return .URL 351 | // } 352 | // 353 | // public var headers: [String: String]? { 354 | // return nil 355 | // } 356 | // 357 | // /** 358 | // The receipt data is transmitted with the 'receiptData' parameter name by default 359 | // */ 360 | // public func parametersWithReceiptData(receiptData: NSData) -> [String: AnyObject]? { 361 | // return ["receiptData": receiptData] 362 | // } 363 | //} 364 | 365 | /** 366 | `StoreKitCompanion` adopts `ReceiptValidationRequestDescriptor` 367 | */ 368 | //extension StoreKitCompanion: ReceiptValidationRequestDescriptor { 369 | // 370 | // public var URL: String? { 371 | // return self.validationURLString 372 | // } 373 | // 374 | //} 375 | 376 | // MARK: SKPaymentTransactionObserver 377 | 378 | extension StoreKitCompanion: SKPaymentTransactionObserver { 379 | 380 | public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { 381 | NotificationCenter.default.post(name: Notification.Name(rawValue: StoreKitCompanion.PaymentQueueDidFinishRestoringCompletedTransactions), object: self, userInfo: [ 382 | StoreKitCompanion.PaymentQueueKey: queue 383 | ]) 384 | if let handler = self.completedTransactionsRestorationSuccessHandler { 385 | handler(queue) 386 | } 387 | } 388 | 389 | public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 390 | NotificationCenter.default.post(name: Notification.Name(rawValue: StoreKitCompanion.PaymentQueueDidUpdateTransactions), object: self, userInfo: [ 391 | StoreKitCompanion.PaymentQueueKey: queue, 392 | StoreKitCompanion.TransactionsKey: transactions 393 | ]) 394 | if let handler = self.transactionsUpdateHandler { 395 | handler(queue, transactions) 396 | } 397 | } 398 | 399 | public func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { 400 | NotificationCenter.default.post(name: Notification.Name(rawValue: StoreKitCompanion.PaymentQueueDidRemoveTransactions), object: self, userInfo: [ 401 | StoreKitCompanion.PaymentQueueKey: queue, 402 | StoreKitCompanion.TransactionsKey: transactions 403 | ]) 404 | if let handler = self.transactionsRemovalHandler { 405 | handler(queue, transactions) 406 | } 407 | } 408 | 409 | public func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) { 410 | NotificationCenter.default.post(name: Notification.Name(rawValue: StoreKitCompanion.PaymentQueueDidUpdateDownloads), object: self, userInfo: [ 411 | StoreKitCompanion.PaymentQueueKey: queue, 412 | StoreKitCompanion.DownloadsKey: downloads 413 | ]) 414 | if let handler = self.downloadsUpdateSuccessHandler { 415 | handler(queue, downloads) 416 | } 417 | } 418 | 419 | public func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { 420 | NotificationCenter.default.post(name: Notification.Name(rawValue: StoreKitCompanion.PaymentQueueDidFailRestoringCompletedTransactions), object: self, userInfo: [ 421 | StoreKitCompanion.PaymentQueueKey: queue, 422 | StoreKitCompanion.ErrorKey: error 423 | ]) 424 | if let handler = self.completedTransactionsRestorationFailureHandler { 425 | handler(queue, error as NSError) 426 | } 427 | } 428 | 429 | } 430 | 431 | // MARK: SKRequestDelegate, SKProductsRequestDelegate 432 | 433 | extension StoreKitCompanion: SKRequestDelegate, SKProductsRequestDelegate { 434 | 435 | // MARK: SKProductsRequestDelegate 436 | 437 | public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 438 | defer { 439 | self.clearProductsRequestStuff() 440 | } 441 | guard let callback = self.productsRequestCompletion else { 442 | return 443 | } 444 | // #if os(OSX) 445 | // guard let products = response.products else { 446 | // return 447 | // } 448 | // #else 449 | let products = response.products 450 | // #endif 451 | 452 | self.products = products 453 | 454 | callback(response.products, response.invalidProductIdentifiers) 455 | } 456 | 457 | // MARK: SKRequestDelegate 458 | 459 | #if os(iOS) 460 | public func requestDidFinish(_ request: SKRequest) { 461 | if request == self.receiptRequest { 462 | self.clearReceiptRequestStuff() 463 | } 464 | } 465 | #endif 466 | 467 | #if os(OSX) 468 | public func request(_ request: SKRequest, didFailWithError error: Error) { 469 | defer { 470 | self.clearProductsRequestStuff() 471 | } 472 | guard let callback = self.productsRequestFailure else { 473 | return 474 | } 475 | callback(error as NSError?) 476 | } 477 | #elseif os(iOS) 478 | public func request(_ request: SKRequest, didFailWithError error: Error) { 479 | if request == self.productsRequest { 480 | defer { 481 | self.clearProductsRequestStuff() 482 | } 483 | guard let callback = self.productsRequestFailure else { 484 | return 485 | } 486 | callback(error as NSError?) 487 | } else if request == self.receiptRequest { 488 | self.clearReceiptRequestStuff() 489 | } else { 490 | print("Unknow request", request) 491 | } 492 | } 493 | #endif 494 | 495 | fileprivate func clearProductsRequestStuff() { 496 | self.productsRequest?.cancel() 497 | self.productsRequest = nil 498 | self.productsRequestCompletion = nil 499 | self.productsRequestFailure = nil 500 | } 501 | 502 | #if os(iOS) 503 | fileprivate func clearReceiptRequestStuff() { 504 | self.receiptRequest?.cancel() 505 | self.receiptRequest = nil 506 | } 507 | #endif 508 | } 509 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | identifier_name: 2 | min_length: 2 3 | excluded: 4 | - x 5 | 6 | type_name: 7 | excluded: 8 | - T 9 | 10 | line_length: 150 11 | file_length: 500 12 | number_separator: 13 | minimum_length: 5 14 | 15 | opt_in_rules: 16 | - closure_spacing 17 | - conditional_returns_on_newline 18 | - empty_count 19 | - explicit_init 20 | - overridden_super_call 21 | - redundant_nil_coalescing 22 | - nimble_operator 23 | - closure_end_indentation 24 | - first_where 25 | - attributes 26 | - operator_usage_whitespace 27 | - prohibited_super_call 28 | - number_separator 29 | - object_literal 30 | - fatal_error_message 31 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/Examples.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E2AC29FD1D847D1D004EC6AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC29F51D847D1D004EC6AC /* AppDelegate.swift */; }; 11 | E2AC29FE1D847D1D004EC6AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E2AC29F61D847D1D004EC6AC /* Assets.xcassets */; }; 12 | E2AC29FF1D847D1D004EC6AC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2AC29F71D847D1D004EC6AC /* LaunchScreen.storyboard */; }; 13 | E2AC2A001D847D1D004EC6AC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2AC29F91D847D1D004EC6AC /* Main.storyboard */; }; 14 | E2AC2A021D847D1D004EC6AC /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC29FC1D847D1D004EC6AC /* ViewController.swift */; }; 15 | E2AC2A0B1D847D30004EC6AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC2A041D847D30004EC6AC /* AppDelegate.swift */; }; 16 | E2AC2A0C1D847D30004EC6AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E2AC2A051D847D30004EC6AC /* Assets.xcassets */; }; 17 | E2AC2A0D1D847D30004EC6AC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E2AC2A061D847D30004EC6AC /* Main.storyboard */; }; 18 | E2AC2A0F1D847D30004EC6AC /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC2A091D847D30004EC6AC /* main.swift */; }; 19 | E2AC2A101D847D30004EC6AC /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC2A0A1D847D30004EC6AC /* ViewController.swift */; }; 20 | E2AC2A201D847D83004EC6AC /* StoreKitCompanion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2AC2A191D847D7F004EC6AC /* StoreKitCompanion.framework */; }; 21 | E2AC2A211D847D83004EC6AC /* StoreKitCompanion.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E2AC2A191D847D7F004EC6AC /* StoreKitCompanion.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 22 | E2AC2A251D847D88004EC6AC /* StoreKitCompanion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2AC2A1D1D847D7F004EC6AC /* StoreKitCompanion.framework */; }; 23 | E2AC2A261D847D88004EC6AC /* StoreKitCompanion.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E2AC2A1D1D847D7F004EC6AC /* StoreKitCompanion.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | E2AC2A181D847D7F004EC6AC /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 30 | proxyType = 2; 31 | remoteGlobalIDString = E2AC29B51D847C24004EC6AC; 32 | remoteInfo = "StoreKitCompanion iOS"; 33 | }; 34 | E2AC2A1A1D847D7F004EC6AC /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 37 | proxyType = 2; 38 | remoteGlobalIDString = E2AC29BD1D847C24004EC6AC; 39 | remoteInfo = "StoreKitCompanion iOSTests"; 40 | }; 41 | E2AC2A1C1D847D7F004EC6AC /* PBXContainerItemProxy */ = { 42 | isa = PBXContainerItemProxy; 43 | containerPortal = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 44 | proxyType = 2; 45 | remoteGlobalIDString = E2AC29D11D847C36004EC6AC; 46 | remoteInfo = "StoreKitCompanion macOS"; 47 | }; 48 | E2AC2A1E1D847D7F004EC6AC /* PBXContainerItemProxy */ = { 49 | isa = PBXContainerItemProxy; 50 | containerPortal = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 51 | proxyType = 2; 52 | remoteGlobalIDString = E2AC29D91D847C37004EC6AC; 53 | remoteInfo = "StoreKitCompanion macOSTests"; 54 | }; 55 | E2AC2A221D847D83004EC6AC /* PBXContainerItemProxy */ = { 56 | isa = PBXContainerItemProxy; 57 | containerPortal = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 58 | proxyType = 1; 59 | remoteGlobalIDString = E2AC29B41D847C24004EC6AC; 60 | remoteInfo = "StoreKitCompanion iOS"; 61 | }; 62 | E2AC2A271D847D88004EC6AC /* PBXContainerItemProxy */ = { 63 | isa = PBXContainerItemProxy; 64 | containerPortal = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 65 | proxyType = 1; 66 | remoteGlobalIDString = E2AC29D01D847C36004EC6AC; 67 | remoteInfo = "StoreKitCompanion macOS"; 68 | }; 69 | /* End PBXContainerItemProxy section */ 70 | 71 | /* Begin PBXCopyFilesBuildPhase section */ 72 | E2AC2A241D847D84004EC6AC /* Embed Frameworks */ = { 73 | isa = PBXCopyFilesBuildPhase; 74 | buildActionMask = 2147483647; 75 | dstPath = ""; 76 | dstSubfolderSpec = 10; 77 | files = ( 78 | E2AC2A211D847D83004EC6AC /* StoreKitCompanion.framework in Embed Frameworks */, 79 | ); 80 | name = "Embed Frameworks"; 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | E2AC2A291D847D89004EC6AC /* Embed Frameworks */ = { 84 | isa = PBXCopyFilesBuildPhase; 85 | buildActionMask = 2147483647; 86 | dstPath = ""; 87 | dstSubfolderSpec = 10; 88 | files = ( 89 | E2AC2A261D847D88004EC6AC /* StoreKitCompanion.framework in Embed Frameworks */, 90 | ); 91 | name = "Embed Frameworks"; 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | /* End PBXCopyFilesBuildPhase section */ 95 | 96 | /* Begin PBXFileReference section */ 97 | 61391E331C4FBE00002E35AC /* iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 98 | 61391E491C4FBE24002E35AC /* macOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "macOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 99 | E2AC29F51D847D1D004EC6AC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 100 | E2AC29F61D847D1D004EC6AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 101 | E2AC29F81D847D1D004EC6AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 102 | E2AC29FA1D847D1D004EC6AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 103 | E2AC29FB1D847D1D004EC6AC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 104 | E2AC29FC1D847D1D004EC6AC /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 105 | E2AC2A041D847D30004EC6AC /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 106 | E2AC2A051D847D30004EC6AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 107 | E2AC2A071D847D30004EC6AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 108 | E2AC2A081D847D30004EC6AC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 109 | E2AC2A091D847D30004EC6AC /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 110 | E2AC2A0A1D847D30004EC6AC /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 111 | E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = StoreKitCompanion.xcodeproj; path = ../StoreKitCompanion/StoreKitCompanion.xcodeproj; sourceTree = ""; }; 112 | /* End PBXFileReference section */ 113 | 114 | /* Begin PBXFrameworksBuildPhase section */ 115 | 61391E301C4FBE00002E35AC /* Frameworks */ = { 116 | isa = PBXFrameworksBuildPhase; 117 | buildActionMask = 2147483647; 118 | files = ( 119 | E2AC2A201D847D83004EC6AC /* StoreKitCompanion.framework in Frameworks */, 120 | ); 121 | runOnlyForDeploymentPostprocessing = 0; 122 | }; 123 | 61391E461C4FBE24002E35AC /* Frameworks */ = { 124 | isa = PBXFrameworksBuildPhase; 125 | buildActionMask = 2147483647; 126 | files = ( 127 | E2AC2A251D847D88004EC6AC /* StoreKitCompanion.framework in Frameworks */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXFrameworksBuildPhase section */ 132 | 133 | /* Begin PBXGroup section */ 134 | 61391E141C4FBD9A002E35AC = { 135 | isa = PBXGroup; 136 | children = ( 137 | E2AC29F41D847D1D004EC6AC /* iOS Example */, 138 | E2AC2A031D847D30004EC6AC /* macOS Example */, 139 | 61391E1E1C4FBD9A002E35AC /* Products */, 140 | E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */, 141 | ); 142 | sourceTree = ""; 143 | }; 144 | 61391E1E1C4FBD9A002E35AC /* Products */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 61391E331C4FBE00002E35AC /* iOS Example.app */, 148 | 61391E491C4FBE24002E35AC /* macOS Example.app */, 149 | ); 150 | name = Products; 151 | sourceTree = ""; 152 | }; 153 | E2AC29F41D847D1D004EC6AC /* iOS Example */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | E2AC29F51D847D1D004EC6AC /* AppDelegate.swift */, 157 | E2AC29F61D847D1D004EC6AC /* Assets.xcassets */, 158 | E2AC29F71D847D1D004EC6AC /* LaunchScreen.storyboard */, 159 | E2AC29F91D847D1D004EC6AC /* Main.storyboard */, 160 | E2AC29FB1D847D1D004EC6AC /* Info.plist */, 161 | E2AC29FC1D847D1D004EC6AC /* ViewController.swift */, 162 | ); 163 | path = "iOS Example"; 164 | sourceTree = ""; 165 | }; 166 | E2AC2A031D847D30004EC6AC /* macOS Example */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | E2AC2A041D847D30004EC6AC /* AppDelegate.swift */, 170 | E2AC2A051D847D30004EC6AC /* Assets.xcassets */, 171 | E2AC2A061D847D30004EC6AC /* Main.storyboard */, 172 | E2AC2A081D847D30004EC6AC /* Info.plist */, 173 | E2AC2A091D847D30004EC6AC /* main.swift */, 174 | E2AC2A0A1D847D30004EC6AC /* ViewController.swift */, 175 | ); 176 | path = "macOS Example"; 177 | sourceTree = ""; 178 | }; 179 | E2AC2A121D847D7F004EC6AC /* Products */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | E2AC2A191D847D7F004EC6AC /* StoreKitCompanion.framework */, 183 | E2AC2A1B1D847D7F004EC6AC /* StoreKitCompanion iOSTests.xctest */, 184 | E2AC2A1D1D847D7F004EC6AC /* StoreKitCompanion.framework */, 185 | E2AC2A1F1D847D7F004EC6AC /* StoreKitCompanion macOSTests.xctest */, 186 | ); 187 | name = Products; 188 | sourceTree = ""; 189 | }; 190 | /* End PBXGroup section */ 191 | 192 | /* Begin PBXNativeTarget section */ 193 | 61391E321C4FBE00002E35AC /* iOS Example */ = { 194 | isa = PBXNativeTarget; 195 | buildConfigurationList = 61391E421C4FBE00002E35AC /* Build configuration list for PBXNativeTarget "iOS Example" */; 196 | buildPhases = ( 197 | 61391E2F1C4FBE00002E35AC /* Sources */, 198 | 61391E301C4FBE00002E35AC /* Frameworks */, 199 | 61391E311C4FBE00002E35AC /* Resources */, 200 | E2AC2A241D847D84004EC6AC /* Embed Frameworks */, 201 | E2AC2A2C1D847EFE004EC6AC /* Run Script - ⚠️ SwiftLint */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | E2AC2A231D847D83004EC6AC /* PBXTargetDependency */, 207 | ); 208 | name = "iOS Example"; 209 | productName = "StoreKitCompanionDemo iOS"; 210 | productReference = 61391E331C4FBE00002E35AC /* iOS Example.app */; 211 | productType = "com.apple.product-type.application"; 212 | }; 213 | 61391E481C4FBE24002E35AC /* macOS Example */ = { 214 | isa = PBXNativeTarget; 215 | buildConfigurationList = 61391E551C4FBE24002E35AC /* Build configuration list for PBXNativeTarget "macOS Example" */; 216 | buildPhases = ( 217 | 61391E451C4FBE24002E35AC /* Sources */, 218 | 61391E461C4FBE24002E35AC /* Frameworks */, 219 | 61391E471C4FBE24002E35AC /* Resources */, 220 | E2AC2A291D847D89004EC6AC /* Embed Frameworks */, 221 | E2AC2A2D1D847F06004EC6AC /* Run Script - ⚠️ SwiftLint */, 222 | ); 223 | buildRules = ( 224 | ); 225 | dependencies = ( 226 | E2AC2A281D847D88004EC6AC /* PBXTargetDependency */, 227 | ); 228 | name = "macOS Example"; 229 | productName = "StoreKitCompanionDemo OSX"; 230 | productReference = 61391E491C4FBE24002E35AC /* macOS Example.app */; 231 | productType = "com.apple.product-type.application"; 232 | }; 233 | /* End PBXNativeTarget section */ 234 | 235 | /* Begin PBXProject section */ 236 | 61391E151C4FBD9A002E35AC /* Project object */ = { 237 | isa = PBXProject; 238 | attributes = { 239 | LastSwiftUpdateCheck = 0720; 240 | LastUpgradeCheck = 1020; 241 | ORGANIZATIONNAME = Recisio; 242 | TargetAttributes = { 243 | 61391E321C4FBE00002E35AC = { 244 | CreatedOnToolsVersion = 7.2; 245 | LastSwiftMigration = 0800; 246 | }; 247 | 61391E481C4FBE24002E35AC = { 248 | CreatedOnToolsVersion = 7.2; 249 | DevelopmentTeam = TNVENL2JX3; 250 | LastSwiftMigration = 0800; 251 | }; 252 | }; 253 | }; 254 | buildConfigurationList = 61391E181C4FBD9A002E35AC /* Build configuration list for PBXProject "Examples" */; 255 | compatibilityVersion = "Xcode 3.2"; 256 | developmentRegion = en; 257 | hasScannedForEncodings = 0; 258 | knownRegions = ( 259 | en, 260 | Base, 261 | ); 262 | mainGroup = 61391E141C4FBD9A002E35AC; 263 | productRefGroup = 61391E1E1C4FBD9A002E35AC /* Products */; 264 | projectDirPath = ""; 265 | projectReferences = ( 266 | { 267 | ProductGroup = E2AC2A121D847D7F004EC6AC /* Products */; 268 | ProjectRef = E2AC2A111D847D7F004EC6AC /* StoreKitCompanion.xcodeproj */; 269 | }, 270 | ); 271 | projectRoot = ""; 272 | targets = ( 273 | 61391E321C4FBE00002E35AC /* iOS Example */, 274 | 61391E481C4FBE24002E35AC /* macOS Example */, 275 | ); 276 | }; 277 | /* End PBXProject section */ 278 | 279 | /* Begin PBXReferenceProxy section */ 280 | E2AC2A191D847D7F004EC6AC /* StoreKitCompanion.framework */ = { 281 | isa = PBXReferenceProxy; 282 | fileType = wrapper.framework; 283 | path = StoreKitCompanion.framework; 284 | remoteRef = E2AC2A181D847D7F004EC6AC /* PBXContainerItemProxy */; 285 | sourceTree = BUILT_PRODUCTS_DIR; 286 | }; 287 | E2AC2A1B1D847D7F004EC6AC /* StoreKitCompanion iOSTests.xctest */ = { 288 | isa = PBXReferenceProxy; 289 | fileType = wrapper.cfbundle; 290 | path = "StoreKitCompanion iOSTests.xctest"; 291 | remoteRef = E2AC2A1A1D847D7F004EC6AC /* PBXContainerItemProxy */; 292 | sourceTree = BUILT_PRODUCTS_DIR; 293 | }; 294 | E2AC2A1D1D847D7F004EC6AC /* StoreKitCompanion.framework */ = { 295 | isa = PBXReferenceProxy; 296 | fileType = wrapper.framework; 297 | path = StoreKitCompanion.framework; 298 | remoteRef = E2AC2A1C1D847D7F004EC6AC /* PBXContainerItemProxy */; 299 | sourceTree = BUILT_PRODUCTS_DIR; 300 | }; 301 | E2AC2A1F1D847D7F004EC6AC /* StoreKitCompanion macOSTests.xctest */ = { 302 | isa = PBXReferenceProxy; 303 | fileType = wrapper.cfbundle; 304 | path = "StoreKitCompanion macOSTests.xctest"; 305 | remoteRef = E2AC2A1E1D847D7F004EC6AC /* PBXContainerItemProxy */; 306 | sourceTree = BUILT_PRODUCTS_DIR; 307 | }; 308 | /* End PBXReferenceProxy section */ 309 | 310 | /* Begin PBXResourcesBuildPhase section */ 311 | 61391E311C4FBE00002E35AC /* Resources */ = { 312 | isa = PBXResourcesBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | E2AC2A001D847D1D004EC6AC /* Main.storyboard in Resources */, 316 | E2AC29FE1D847D1D004EC6AC /* Assets.xcassets in Resources */, 317 | E2AC29FF1D847D1D004EC6AC /* LaunchScreen.storyboard in Resources */, 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | 61391E471C4FBE24002E35AC /* Resources */ = { 322 | isa = PBXResourcesBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | E2AC2A0C1D847D30004EC6AC /* Assets.xcassets in Resources */, 326 | E2AC2A0D1D847D30004EC6AC /* Main.storyboard in Resources */, 327 | ); 328 | runOnlyForDeploymentPostprocessing = 0; 329 | }; 330 | /* End PBXResourcesBuildPhase section */ 331 | 332 | /* Begin PBXShellScriptBuildPhase section */ 333 | E2AC2A2C1D847EFE004EC6AC /* Run Script - ⚠️ SwiftLint */ = { 334 | isa = PBXShellScriptBuildPhase; 335 | buildActionMask = 2147483647; 336 | files = ( 337 | ); 338 | inputPaths = ( 339 | ); 340 | name = "Run Script - ⚠️ SwiftLint"; 341 | outputPaths = ( 342 | ); 343 | runOnlyForDeploymentPostprocessing = 0; 344 | shellPath = /bin/sh; 345 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; 346 | }; 347 | E2AC2A2D1D847F06004EC6AC /* Run Script - ⚠️ SwiftLint */ = { 348 | isa = PBXShellScriptBuildPhase; 349 | buildActionMask = 2147483647; 350 | files = ( 351 | ); 352 | inputPaths = ( 353 | ); 354 | name = "Run Script - ⚠️ SwiftLint"; 355 | outputPaths = ( 356 | ); 357 | runOnlyForDeploymentPostprocessing = 0; 358 | shellPath = /bin/sh; 359 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; 360 | }; 361 | /* End PBXShellScriptBuildPhase section */ 362 | 363 | /* Begin PBXSourcesBuildPhase section */ 364 | 61391E2F1C4FBE00002E35AC /* Sources */ = { 365 | isa = PBXSourcesBuildPhase; 366 | buildActionMask = 2147483647; 367 | files = ( 368 | E2AC2A021D847D1D004EC6AC /* ViewController.swift in Sources */, 369 | E2AC29FD1D847D1D004EC6AC /* AppDelegate.swift in Sources */, 370 | ); 371 | runOnlyForDeploymentPostprocessing = 0; 372 | }; 373 | 61391E451C4FBE24002E35AC /* Sources */ = { 374 | isa = PBXSourcesBuildPhase; 375 | buildActionMask = 2147483647; 376 | files = ( 377 | E2AC2A101D847D30004EC6AC /* ViewController.swift in Sources */, 378 | E2AC2A0F1D847D30004EC6AC /* main.swift in Sources */, 379 | E2AC2A0B1D847D30004EC6AC /* AppDelegate.swift in Sources */, 380 | ); 381 | runOnlyForDeploymentPostprocessing = 0; 382 | }; 383 | /* End PBXSourcesBuildPhase section */ 384 | 385 | /* Begin PBXTargetDependency section */ 386 | E2AC2A231D847D83004EC6AC /* PBXTargetDependency */ = { 387 | isa = PBXTargetDependency; 388 | name = "StoreKitCompanion iOS"; 389 | targetProxy = E2AC2A221D847D83004EC6AC /* PBXContainerItemProxy */; 390 | }; 391 | E2AC2A281D847D88004EC6AC /* PBXTargetDependency */ = { 392 | isa = PBXTargetDependency; 393 | name = "StoreKitCompanion macOS"; 394 | targetProxy = E2AC2A271D847D88004EC6AC /* PBXContainerItemProxy */; 395 | }; 396 | /* End PBXTargetDependency section */ 397 | 398 | /* Begin PBXVariantGroup section */ 399 | E2AC29F71D847D1D004EC6AC /* LaunchScreen.storyboard */ = { 400 | isa = PBXVariantGroup; 401 | children = ( 402 | E2AC29F81D847D1D004EC6AC /* Base */, 403 | ); 404 | name = LaunchScreen.storyboard; 405 | sourceTree = ""; 406 | }; 407 | E2AC29F91D847D1D004EC6AC /* Main.storyboard */ = { 408 | isa = PBXVariantGroup; 409 | children = ( 410 | E2AC29FA1D847D1D004EC6AC /* Base */, 411 | ); 412 | name = Main.storyboard; 413 | sourceTree = ""; 414 | }; 415 | E2AC2A061D847D30004EC6AC /* Main.storyboard */ = { 416 | isa = PBXVariantGroup; 417 | children = ( 418 | E2AC2A071D847D30004EC6AC /* Base */, 419 | ); 420 | name = Main.storyboard; 421 | sourceTree = ""; 422 | }; 423 | /* End PBXVariantGroup section */ 424 | 425 | /* Begin XCBuildConfiguration section */ 426 | 61391E2A1C4FBD9A002E35AC /* Debug */ = { 427 | isa = XCBuildConfiguration; 428 | buildSettings = { 429 | ALWAYS_SEARCH_USER_PATHS = NO; 430 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 431 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 432 | CLANG_CXX_LIBRARY = "libc++"; 433 | CLANG_ENABLE_MODULES = YES; 434 | CLANG_ENABLE_OBJC_ARC = YES; 435 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 436 | CLANG_WARN_BOOL_CONVERSION = YES; 437 | CLANG_WARN_COMMA = YES; 438 | CLANG_WARN_CONSTANT_CONVERSION = YES; 439 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 440 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 441 | CLANG_WARN_EMPTY_BODY = YES; 442 | CLANG_WARN_ENUM_CONVERSION = YES; 443 | CLANG_WARN_INFINITE_RECURSION = YES; 444 | CLANG_WARN_INT_CONVERSION = YES; 445 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 446 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 447 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 448 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 449 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 450 | CLANG_WARN_STRICT_PROTOTYPES = YES; 451 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 452 | CLANG_WARN_UNREACHABLE_CODE = YES; 453 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 454 | CODE_SIGN_IDENTITY = "-"; 455 | COPY_PHASE_STRIP = NO; 456 | DEBUG_INFORMATION_FORMAT = dwarf; 457 | ENABLE_STRICT_OBJC_MSGSEND = YES; 458 | ENABLE_TESTABILITY = YES; 459 | GCC_C_LANGUAGE_STANDARD = gnu99; 460 | GCC_DYNAMIC_NO_PIC = NO; 461 | GCC_NO_COMMON_BLOCKS = YES; 462 | GCC_OPTIMIZATION_LEVEL = 0; 463 | GCC_PREPROCESSOR_DEFINITIONS = ( 464 | "DEBUG=1", 465 | "$(inherited)", 466 | ); 467 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 468 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 469 | GCC_WARN_UNDECLARED_SELECTOR = YES; 470 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 471 | GCC_WARN_UNUSED_FUNCTION = YES; 472 | GCC_WARN_UNUSED_VARIABLE = YES; 473 | MACOSX_DEPLOYMENT_TARGET = 10.11; 474 | MTL_ENABLE_DEBUG_INFO = YES; 475 | ONLY_ACTIVE_ARCH = YES; 476 | SDKROOT = macosx; 477 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 478 | SWIFT_VERSION = 5.0; 479 | }; 480 | name = Debug; 481 | }; 482 | 61391E2B1C4FBD9A002E35AC /* Release */ = { 483 | isa = XCBuildConfiguration; 484 | buildSettings = { 485 | ALWAYS_SEARCH_USER_PATHS = NO; 486 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 487 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 488 | CLANG_CXX_LIBRARY = "libc++"; 489 | CLANG_ENABLE_MODULES = YES; 490 | CLANG_ENABLE_OBJC_ARC = YES; 491 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 492 | CLANG_WARN_BOOL_CONVERSION = YES; 493 | CLANG_WARN_COMMA = YES; 494 | CLANG_WARN_CONSTANT_CONVERSION = YES; 495 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 496 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 497 | CLANG_WARN_EMPTY_BODY = YES; 498 | CLANG_WARN_ENUM_CONVERSION = YES; 499 | CLANG_WARN_INFINITE_RECURSION = YES; 500 | CLANG_WARN_INT_CONVERSION = YES; 501 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 502 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 503 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 504 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 505 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 506 | CLANG_WARN_STRICT_PROTOTYPES = YES; 507 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 508 | CLANG_WARN_UNREACHABLE_CODE = YES; 509 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 510 | CODE_SIGN_IDENTITY = "-"; 511 | COPY_PHASE_STRIP = NO; 512 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 513 | ENABLE_NS_ASSERTIONS = NO; 514 | ENABLE_STRICT_OBJC_MSGSEND = YES; 515 | GCC_C_LANGUAGE_STANDARD = gnu99; 516 | GCC_NO_COMMON_BLOCKS = YES; 517 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 518 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 519 | GCC_WARN_UNDECLARED_SELECTOR = YES; 520 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 521 | GCC_WARN_UNUSED_FUNCTION = YES; 522 | GCC_WARN_UNUSED_VARIABLE = YES; 523 | MACOSX_DEPLOYMENT_TARGET = 10.11; 524 | MTL_ENABLE_DEBUG_INFO = NO; 525 | SDKROOT = macosx; 526 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 527 | SWIFT_VERSION = 5.0; 528 | }; 529 | name = Release; 530 | }; 531 | 61391E431C4FBE00002E35AC /* Debug */ = { 532 | isa = XCBuildConfiguration; 533 | buildSettings = { 534 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 535 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 536 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "-"; 537 | INFOPLIST_FILE = "$(SRCROOT)/iOS Example/Info.plist"; 538 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 539 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 540 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanionDemo-iOS"; 541 | PRODUCT_NAME = "$(TARGET_NAME)"; 542 | SDKROOT = iphoneos; 543 | SWIFT_VERSION = 5.0; 544 | TARGETED_DEVICE_FAMILY = "1,2"; 545 | }; 546 | name = Debug; 547 | }; 548 | 61391E441C4FBE00002E35AC /* Release */ = { 549 | isa = XCBuildConfiguration; 550 | buildSettings = { 551 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 552 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 553 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "-"; 554 | INFOPLIST_FILE = "$(SRCROOT)/iOS Example/Info.plist"; 555 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 556 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 557 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanionDemo-iOS"; 558 | PRODUCT_NAME = "$(TARGET_NAME)"; 559 | SDKROOT = iphoneos; 560 | SWIFT_VERSION = 5.0; 561 | TARGETED_DEVICE_FAMILY = "1,2"; 562 | VALIDATE_PRODUCT = YES; 563 | }; 564 | name = Release; 565 | }; 566 | 61391E561C4FBE24002E35AC /* Debug */ = { 567 | isa = XCBuildConfiguration; 568 | buildSettings = { 569 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 570 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 571 | CODE_SIGN_IDENTITY = "-"; 572 | COMBINE_HIDPI_IMAGES = YES; 573 | INFOPLIST_FILE = "$(SRCROOT)/macOS Example/Info.plist"; 574 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 575 | MACOSX_DEPLOYMENT_TARGET = 10.10; 576 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanionDemo-OSX"; 577 | PRODUCT_NAME = "$(TARGET_NAME)"; 578 | SWIFT_VERSION = 5.0; 579 | }; 580 | name = Debug; 581 | }; 582 | 61391E571C4FBE24002E35AC /* Release */ = { 583 | isa = XCBuildConfiguration; 584 | buildSettings = { 585 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 586 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 587 | CODE_SIGN_IDENTITY = "-"; 588 | COMBINE_HIDPI_IMAGES = YES; 589 | INFOPLIST_FILE = "$(SRCROOT)/macOS Example/Info.plist"; 590 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 591 | MACOSX_DEPLOYMENT_TARGET = 10.10; 592 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanionDemo-OSX"; 593 | PRODUCT_NAME = "$(TARGET_NAME)"; 594 | SWIFT_VERSION = 5.0; 595 | }; 596 | name = Release; 597 | }; 598 | /* End XCBuildConfiguration section */ 599 | 600 | /* Begin XCConfigurationList section */ 601 | 61391E181C4FBD9A002E35AC /* Build configuration list for PBXProject "Examples" */ = { 602 | isa = XCConfigurationList; 603 | buildConfigurations = ( 604 | 61391E2A1C4FBD9A002E35AC /* Debug */, 605 | 61391E2B1C4FBD9A002E35AC /* Release */, 606 | ); 607 | defaultConfigurationIsVisible = 0; 608 | defaultConfigurationName = Release; 609 | }; 610 | 61391E421C4FBE00002E35AC /* Build configuration list for PBXNativeTarget "iOS Example" */ = { 611 | isa = XCConfigurationList; 612 | buildConfigurations = ( 613 | 61391E431C4FBE00002E35AC /* Debug */, 614 | 61391E441C4FBE00002E35AC /* Release */, 615 | ); 616 | defaultConfigurationIsVisible = 0; 617 | defaultConfigurationName = Release; 618 | }; 619 | 61391E551C4FBE24002E35AC /* Build configuration list for PBXNativeTarget "macOS Example" */ = { 620 | isa = XCConfigurationList; 621 | buildConfigurations = ( 622 | 61391E561C4FBE24002E35AC /* Debug */, 623 | 61391E571C4FBE24002E35AC /* Release */, 624 | ); 625 | defaultConfigurationIsVisible = 0; 626 | defaultConfigurationName = Release; 627 | }; 628 | /* End XCConfigurationList section */ 629 | }; 630 | rootObject = 61391E151C4FBD9A002E35AC /* Project object */; 631 | } 632 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/Examples.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/Examples.xcodeproj/xcshareddata/xcschemes/macOS Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/iOS Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import UIKit 24 | 25 | @UIApplicationMain 26 | class AppDelegate: UIResponder, UIApplicationDelegate { 27 | 28 | var window: UIWindow? 29 | 30 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 31 | return true 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/iOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /StoreKitCompanion Examples/iOS Example/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/iOS Example/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/iOS Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/iOS Example/ViewController.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import UIKit 24 | 25 | class ViewController: UIViewController { 26 | 27 | override func viewDidLoad() { 28 | super.viewDidLoad() 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/macOS Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import Cocoa 24 | 25 | class AppDelegate: NSObject, NSApplicationDelegate { 26 | 27 | func applicationDidFinishLaunching(aNotification: NSNotification) { 28 | 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/macOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /StoreKitCompanion Examples/macOS Example/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | Default 510 | 511 | 512 | 513 | 514 | 515 | 516 | Left to Right 517 | 518 | 519 | 520 | 521 | 522 | 523 | Right to Left 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | Default 535 | 536 | 537 | 538 | 539 | 540 | 541 | Left to Right 542 | 543 | 544 | 545 | 546 | 547 | 548 | Right to Left 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/macOS Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2016 Recisio. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/macOS Example/ViewController.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import Cocoa 24 | 25 | class ViewController: NSViewController { 26 | 27 | override func viewDidLoad() { 28 | super.viewDidLoad() 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /StoreKitCompanion Examples/macOS Example/main.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import Cocoa 24 | import StoreKitCompanion 25 | 26 | StoreKitCompanion.sharedInstance.refreshReceipt() 27 | _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv) 28 | -------------------------------------------------------------------------------- /StoreKitCompanion.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 4 | 5 | s.name = "StoreKitCompanion" 6 | s.module_name = "StoreKitCompanion" 7 | s.version = "2.0.0" 8 | s.summary = "A lightweight wrapper for Apple's StoreKit, written in Swift." 9 | s.description = "A lightweight wrapper for Apple's StoreKit, written in Swift. For iOS and OS X" 10 | s.homepage = "https://github.com/recisio/StoreKitCompanion" 11 | s.license = { :type => "MIT", :file => "LICENSE" } 12 | s.author = { "Recisio" => "vincent@recisio.com" } 13 | s.source = { :git => "https://github.com/recisio/StoreKitCompanion.git", :tag => "#{s.version}" } 14 | 15 | # ――― Spec tech ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 16 | 17 | s.ios.deployment_target = '8.0' 18 | s.osx.deployment_target = '10.10' 19 | 20 | s.requires_arc = true 21 | s.source_files = 'Source/*.swift' 22 | 23 | end 24 | -------------------------------------------------------------------------------- /StoreKitCompanion.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /StoreKitCompanion.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /StoreKitCompanion/.swiftlint.yml: -------------------------------------------------------------------------------- 1 | line_length: 180 2 | disabled_rules: 3 | - identifier_name 4 | included: 5 | - ../Source 6 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion iOS/StoreKitCompanion iOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // StoreKitCompanion iOS.h 3 | // StoreKitCompanion iOS 4 | // 5 | // Created by Tom Baranes on 10/09/16. 6 | // Copyright © 2016 Recisio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for StoreKitCompanion iOS. 12 | FOUNDATION_EXPORT double StoreKitCompanion_iOSVersionNumber; 13 | 14 | //! Project version string for StoreKitCompanion iOS. 15 | FOUNDATION_EXPORT const unsigned char StoreKitCompanion_iOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion iOS/StoreKitCompanion.h: -------------------------------------------------------------------------------- 1 | // 2 | // StoreKitCompanion.h 3 | // StoreKitCompanion 4 | // 5 | // Created by Tom Baranes on 10/09/16. 6 | // Copyright © 2016 Recisio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for StoreKitCompanion. 12 | FOUNDATION_EXPORT double StoreKitCompanionVersionNumber; 13 | 14 | //! Project version string for StoreKitCompanion. 15 | FOUNDATION_EXPORT const unsigned char StoreKitCompanionVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion iOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion iOSTests/StoreKitCompanionTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreKitCompanionTests.swift 3 | // StoreKitCompanionTests 4 | // 5 | // Created by Tom Baranes on 10/09/16. 6 | // Copyright © 2016 Recisio. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import StoreKitCompanion 11 | 12 | class StoreKitCompanionTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion iOSTests/StoreKitCompanion_iOSTests.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import XCTest 24 | @testable import StoreKitCompanion 25 | 26 | class StoreKitCompanion_iOSTests: XCTestCase { 27 | 28 | override func setUp() { 29 | super.setUp() 30 | } 31 | 32 | override func tearDown() { 33 | super.tearDown() 34 | } 35 | 36 | func testExample() { 37 | XCTAssertTrue(true) 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2016 Recisio. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion macOS/StoreKitCompanion macOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // StoreKitCompanion macOS.h 3 | // StoreKitCompanion macOS 4 | // 5 | // Created by Tom Baranes on 10/09/16. 6 | // Copyright © 2016 Recisio. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for StoreKitCompanion macOS. 12 | FOUNDATION_EXPORT double StoreKitCompanion_macOSVersionNumber; 13 | 14 | //! Project version string for StoreKitCompanion macOS. 15 | FOUNDATION_EXPORT const unsigned char StoreKitCompanion_macOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion macOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion macOSTests/StoreKitCompanion_macOSTests.swift: -------------------------------------------------------------------------------- 1 | // StoreKitCompanion.swift 2 | // 3 | // Copyright (c) 2016 Recisio (http://www.recisio.com) 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | import XCTest 24 | @testable import StoreKitCompanion 25 | 26 | class StoreKitCompanion_macOSTests: XCTestCase { 27 | 28 | override func setUp() { 29 | super.setUp() 30 | } 31 | 32 | override func tearDown() { 33 | super.tearDown() 34 | } 35 | 36 | func testExample() { 37 | XCTAssertTrue(true) 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E2AC29BE1D847C24004EC6AC /* StoreKitCompanion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2AC29B51D847C24004EC6AC /* StoreKitCompanion.framework */; }; 11 | E2AC29C31D847C24004EC6AC /* StoreKitCompanion_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC29C21D847C24004EC6AC /* StoreKitCompanion_iOSTests.swift */; }; 12 | E2AC29C51D847C24004EC6AC /* StoreKitCompanion iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = E2AC29B71D847C24004EC6AC /* StoreKitCompanion iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | E2AC29DA1D847C37004EC6AC /* StoreKitCompanion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2AC29D11D847C36004EC6AC /* StoreKitCompanion.framework */; }; 14 | E2AC29DF1D847C37004EC6AC /* StoreKitCompanion_macOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC29DE1D847C37004EC6AC /* StoreKitCompanion_macOSTests.swift */; }; 15 | E2AC29E11D847C37004EC6AC /* StoreKitCompanion macOS.h in Headers */ = {isa = PBXBuildFile; fileRef = E2AC29D31D847C37004EC6AC /* StoreKitCompanion macOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | E2AC29ED1D847C7F004EC6AC /* StoreKitCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC29EC1D847C7F004EC6AC /* StoreKitCompanion.swift */; }; 17 | E2AC29EE1D847C7F004EC6AC /* StoreKitCompanion.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2AC29EC1D847C7F004EC6AC /* StoreKitCompanion.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | E2AC29BF1D847C24004EC6AC /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = E2AC298D1D847BD6004EC6AC /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = E2AC29B41D847C24004EC6AC; 26 | remoteInfo = "StoreKitCompanion iOS"; 27 | }; 28 | E2AC29DB1D847C37004EC6AC /* PBXContainerItemProxy */ = { 29 | isa = PBXContainerItemProxy; 30 | containerPortal = E2AC298D1D847BD6004EC6AC /* Project object */; 31 | proxyType = 1; 32 | remoteGlobalIDString = E2AC29D01D847C36004EC6AC; 33 | remoteInfo = "StoreKitCompanion macOS"; 34 | }; 35 | /* End PBXContainerItemProxy section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | E2AC29B51D847C24004EC6AC /* StoreKitCompanion.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StoreKitCompanion.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | E2AC29B71D847C24004EC6AC /* StoreKitCompanion iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StoreKitCompanion iOS.h"; sourceTree = ""; }; 40 | E2AC29B81D847C24004EC6AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | E2AC29BD1D847C24004EC6AC /* StoreKitCompanion iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "StoreKitCompanion iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | E2AC29C21D847C24004EC6AC /* StoreKitCompanion_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreKitCompanion_iOSTests.swift; sourceTree = ""; }; 43 | E2AC29C41D847C24004EC6AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 44 | E2AC29D11D847C36004EC6AC /* StoreKitCompanion.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StoreKitCompanion.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | E2AC29D31D847C37004EC6AC /* StoreKitCompanion macOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StoreKitCompanion macOS.h"; sourceTree = ""; }; 46 | E2AC29D41D847C37004EC6AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | E2AC29D91D847C37004EC6AC /* StoreKitCompanion macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "StoreKitCompanion macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | E2AC29DE1D847C37004EC6AC /* StoreKitCompanion_macOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreKitCompanion_macOSTests.swift; sourceTree = ""; }; 49 | E2AC29E01D847C37004EC6AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50 | E2AC29EC1D847C7F004EC6AC /* StoreKitCompanion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreKitCompanion.swift; sourceTree = ""; }; 51 | /* End PBXFileReference section */ 52 | 53 | /* Begin PBXFrameworksBuildPhase section */ 54 | E2AC29B11D847C24004EC6AC /* Frameworks */ = { 55 | isa = PBXFrameworksBuildPhase; 56 | buildActionMask = 2147483647; 57 | files = ( 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | E2AC29BA1D847C24004EC6AC /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | E2AC29BE1D847C24004EC6AC /* StoreKitCompanion.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | E2AC29CD1D847C36004EC6AC /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | E2AC29D61D847C37004EC6AC /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | E2AC29DA1D847C37004EC6AC /* StoreKitCompanion.framework in Frameworks */, 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | /* End PBXFrameworksBuildPhase section */ 85 | 86 | /* Begin PBXGroup section */ 87 | E2AC298C1D847BD6004EC6AC = { 88 | isa = PBXGroup; 89 | children = ( 90 | E2AC29EB1D847C7F004EC6AC /* Source */, 91 | E2AC29B61D847C24004EC6AC /* StoreKitCompanion iOS */, 92 | E2AC29D21D847C37004EC6AC /* StoreKitCompanion macOS */, 93 | E2AC29E81D847C4C004EC6AC /* Tests */, 94 | E2AC29971D847BD6004EC6AC /* Products */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | E2AC29971D847BD6004EC6AC /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | E2AC29B51D847C24004EC6AC /* StoreKitCompanion.framework */, 102 | E2AC29BD1D847C24004EC6AC /* StoreKitCompanion iOSTests.xctest */, 103 | E2AC29D11D847C36004EC6AC /* StoreKitCompanion.framework */, 104 | E2AC29D91D847C37004EC6AC /* StoreKitCompanion macOSTests.xctest */, 105 | ); 106 | name = Products; 107 | sourceTree = ""; 108 | }; 109 | E2AC29B61D847C24004EC6AC /* StoreKitCompanion iOS */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | E2AC29B71D847C24004EC6AC /* StoreKitCompanion iOS.h */, 113 | E2AC29B81D847C24004EC6AC /* Info.plist */, 114 | ); 115 | path = "StoreKitCompanion iOS"; 116 | sourceTree = ""; 117 | }; 118 | E2AC29C11D847C24004EC6AC /* StoreKitCompanion iOSTests */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | E2AC29C21D847C24004EC6AC /* StoreKitCompanion_iOSTests.swift */, 122 | E2AC29C41D847C24004EC6AC /* Info.plist */, 123 | ); 124 | path = "StoreKitCompanion iOSTests"; 125 | sourceTree = SOURCE_ROOT; 126 | }; 127 | E2AC29D21D847C37004EC6AC /* StoreKitCompanion macOS */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | E2AC29D31D847C37004EC6AC /* StoreKitCompanion macOS.h */, 131 | E2AC29D41D847C37004EC6AC /* Info.plist */, 132 | ); 133 | path = "StoreKitCompanion macOS"; 134 | sourceTree = ""; 135 | }; 136 | E2AC29DD1D847C37004EC6AC /* StoreKitCompanion macOSTests */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | E2AC29DE1D847C37004EC6AC /* StoreKitCompanion_macOSTests.swift */, 140 | E2AC29E01D847C37004EC6AC /* Info.plist */, 141 | ); 142 | name = "StoreKitCompanion macOSTests"; 143 | path = "../StoreKitCompanion macOSTests"; 144 | sourceTree = ""; 145 | }; 146 | E2AC29E81D847C4C004EC6AC /* Tests */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | E2AC29C11D847C24004EC6AC /* StoreKitCompanion iOSTests */, 150 | E2AC29DD1D847C37004EC6AC /* StoreKitCompanion macOSTests */, 151 | ); 152 | name = Tests; 153 | path = "StoreKitCompanion iOS"; 154 | sourceTree = ""; 155 | }; 156 | E2AC29EB1D847C7F004EC6AC /* Source */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | E2AC29EC1D847C7F004EC6AC /* StoreKitCompanion.swift */, 160 | ); 161 | name = Source; 162 | path = ../Source; 163 | sourceTree = ""; 164 | }; 165 | /* End PBXGroup section */ 166 | 167 | /* Begin PBXHeadersBuildPhase section */ 168 | E2AC29B21D847C24004EC6AC /* Headers */ = { 169 | isa = PBXHeadersBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | E2AC29C51D847C24004EC6AC /* StoreKitCompanion iOS.h in Headers */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | E2AC29CE1D847C36004EC6AC /* Headers */ = { 177 | isa = PBXHeadersBuildPhase; 178 | buildActionMask = 2147483647; 179 | files = ( 180 | E2AC29E11D847C37004EC6AC /* StoreKitCompanion macOS.h in Headers */, 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | }; 184 | /* End PBXHeadersBuildPhase section */ 185 | 186 | /* Begin PBXNativeTarget section */ 187 | E2AC29B41D847C24004EC6AC /* StoreKitCompanion iOS */ = { 188 | isa = PBXNativeTarget; 189 | buildConfigurationList = E2AC29C61D847C24004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion iOS" */; 190 | buildPhases = ( 191 | E2AC29B01D847C24004EC6AC /* Sources */, 192 | E2AC29B11D847C24004EC6AC /* Frameworks */, 193 | E2AC29B21D847C24004EC6AC /* Headers */, 194 | E2AC29B31D847C24004EC6AC /* Resources */, 195 | E2AC2A2A1D847EDA004EC6AC /* Run Script - ⚠️ SwiftLint */, 196 | ); 197 | buildRules = ( 198 | ); 199 | dependencies = ( 200 | ); 201 | name = "StoreKitCompanion iOS"; 202 | productName = "StoreKitCompanion iOS"; 203 | productReference = E2AC29B51D847C24004EC6AC /* StoreKitCompanion.framework */; 204 | productType = "com.apple.product-type.framework"; 205 | }; 206 | E2AC29BC1D847C24004EC6AC /* StoreKitCompanion iOSTests */ = { 207 | isa = PBXNativeTarget; 208 | buildConfigurationList = E2AC29C91D847C24004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion iOSTests" */; 209 | buildPhases = ( 210 | E2AC29B91D847C24004EC6AC /* Sources */, 211 | E2AC29BA1D847C24004EC6AC /* Frameworks */, 212 | E2AC29BB1D847C24004EC6AC /* Resources */, 213 | ); 214 | buildRules = ( 215 | ); 216 | dependencies = ( 217 | E2AC29C01D847C24004EC6AC /* PBXTargetDependency */, 218 | ); 219 | name = "StoreKitCompanion iOSTests"; 220 | productName = "StoreKitCompanion iOSTests"; 221 | productReference = E2AC29BD1D847C24004EC6AC /* StoreKitCompanion iOSTests.xctest */; 222 | productType = "com.apple.product-type.bundle.unit-test"; 223 | }; 224 | E2AC29D01D847C36004EC6AC /* StoreKitCompanion macOS */ = { 225 | isa = PBXNativeTarget; 226 | buildConfigurationList = E2AC29E21D847C37004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion macOS" */; 227 | buildPhases = ( 228 | E2AC29CC1D847C36004EC6AC /* Sources */, 229 | E2AC29CD1D847C36004EC6AC /* Frameworks */, 230 | E2AC29CE1D847C36004EC6AC /* Headers */, 231 | E2AC29CF1D847C36004EC6AC /* Resources */, 232 | E2AC2A2B1D847EE0004EC6AC /* Run Script - ⚠️ SwiftLint */, 233 | ); 234 | buildRules = ( 235 | ); 236 | dependencies = ( 237 | ); 238 | name = "StoreKitCompanion macOS"; 239 | productName = "StoreKitCompanion macOS"; 240 | productReference = E2AC29D11D847C36004EC6AC /* StoreKitCompanion.framework */; 241 | productType = "com.apple.product-type.framework"; 242 | }; 243 | E2AC29D81D847C37004EC6AC /* StoreKitCompanion macOSTests */ = { 244 | isa = PBXNativeTarget; 245 | buildConfigurationList = E2AC29E51D847C37004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion macOSTests" */; 246 | buildPhases = ( 247 | E2AC29D51D847C37004EC6AC /* Sources */, 248 | E2AC29D61D847C37004EC6AC /* Frameworks */, 249 | E2AC29D71D847C37004EC6AC /* Resources */, 250 | ); 251 | buildRules = ( 252 | ); 253 | dependencies = ( 254 | E2AC29DC1D847C37004EC6AC /* PBXTargetDependency */, 255 | ); 256 | name = "StoreKitCompanion macOSTests"; 257 | productName = "StoreKitCompanion macOSTests"; 258 | productReference = E2AC29D91D847C37004EC6AC /* StoreKitCompanion macOSTests.xctest */; 259 | productType = "com.apple.product-type.bundle.unit-test"; 260 | }; 261 | /* End PBXNativeTarget section */ 262 | 263 | /* Begin PBXProject section */ 264 | E2AC298D1D847BD6004EC6AC /* Project object */ = { 265 | isa = PBXProject; 266 | attributes = { 267 | LastSwiftUpdateCheck = 0800; 268 | LastUpgradeCheck = 1020; 269 | ORGANIZATIONNAME = Recisio; 270 | TargetAttributes = { 271 | E2AC29B41D847C24004EC6AC = { 272 | CreatedOnToolsVersion = 8.0; 273 | LastSwiftMigration = 1020; 274 | ProvisioningStyle = Automatic; 275 | }; 276 | E2AC29BC1D847C24004EC6AC = { 277 | CreatedOnToolsVersion = 8.0; 278 | LastSwiftMigration = 1020; 279 | ProvisioningStyle = Automatic; 280 | }; 281 | E2AC29D01D847C36004EC6AC = { 282 | CreatedOnToolsVersion = 8.0; 283 | LastSwiftMigration = 1020; 284 | ProvisioningStyle = Automatic; 285 | }; 286 | E2AC29D81D847C37004EC6AC = { 287 | CreatedOnToolsVersion = 8.0; 288 | LastSwiftMigration = 1020; 289 | ProvisioningStyle = Automatic; 290 | }; 291 | }; 292 | }; 293 | buildConfigurationList = E2AC29901D847BD6004EC6AC /* Build configuration list for PBXProject "StoreKitCompanion" */; 294 | compatibilityVersion = "Xcode 3.2"; 295 | developmentRegion = en; 296 | hasScannedForEncodings = 0; 297 | knownRegions = ( 298 | en, 299 | Base, 300 | ); 301 | mainGroup = E2AC298C1D847BD6004EC6AC; 302 | productRefGroup = E2AC29971D847BD6004EC6AC /* Products */; 303 | projectDirPath = ""; 304 | projectRoot = ""; 305 | targets = ( 306 | E2AC29B41D847C24004EC6AC /* StoreKitCompanion iOS */, 307 | E2AC29BC1D847C24004EC6AC /* StoreKitCompanion iOSTests */, 308 | E2AC29D01D847C36004EC6AC /* StoreKitCompanion macOS */, 309 | E2AC29D81D847C37004EC6AC /* StoreKitCompanion macOSTests */, 310 | ); 311 | }; 312 | /* End PBXProject section */ 313 | 314 | /* Begin PBXResourcesBuildPhase section */ 315 | E2AC29B31D847C24004EC6AC /* Resources */ = { 316 | isa = PBXResourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | ); 320 | runOnlyForDeploymentPostprocessing = 0; 321 | }; 322 | E2AC29BB1D847C24004EC6AC /* Resources */ = { 323 | isa = PBXResourcesBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | ); 327 | runOnlyForDeploymentPostprocessing = 0; 328 | }; 329 | E2AC29CF1D847C36004EC6AC /* Resources */ = { 330 | isa = PBXResourcesBuildPhase; 331 | buildActionMask = 2147483647; 332 | files = ( 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | }; 336 | E2AC29D71D847C37004EC6AC /* Resources */ = { 337 | isa = PBXResourcesBuildPhase; 338 | buildActionMask = 2147483647; 339 | files = ( 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | }; 343 | /* End PBXResourcesBuildPhase section */ 344 | 345 | /* Begin PBXShellScriptBuildPhase section */ 346 | E2AC2A2A1D847EDA004EC6AC /* Run Script - ⚠️ SwiftLint */ = { 347 | isa = PBXShellScriptBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | ); 351 | inputPaths = ( 352 | ); 353 | name = "Run Script - ⚠️ SwiftLint"; 354 | outputPaths = ( 355 | ); 356 | runOnlyForDeploymentPostprocessing = 0; 357 | shellPath = /bin/sh; 358 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; 359 | }; 360 | E2AC2A2B1D847EE0004EC6AC /* Run Script - ⚠️ SwiftLint */ = { 361 | isa = PBXShellScriptBuildPhase; 362 | buildActionMask = 2147483647; 363 | files = ( 364 | ); 365 | inputPaths = ( 366 | ); 367 | name = "Run Script - ⚠️ SwiftLint"; 368 | outputPaths = ( 369 | ); 370 | runOnlyForDeploymentPostprocessing = 0; 371 | shellPath = /bin/sh; 372 | shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; 373 | }; 374 | /* End PBXShellScriptBuildPhase section */ 375 | 376 | /* Begin PBXSourcesBuildPhase section */ 377 | E2AC29B01D847C24004EC6AC /* Sources */ = { 378 | isa = PBXSourcesBuildPhase; 379 | buildActionMask = 2147483647; 380 | files = ( 381 | E2AC29ED1D847C7F004EC6AC /* StoreKitCompanion.swift in Sources */, 382 | ); 383 | runOnlyForDeploymentPostprocessing = 0; 384 | }; 385 | E2AC29B91D847C24004EC6AC /* Sources */ = { 386 | isa = PBXSourcesBuildPhase; 387 | buildActionMask = 2147483647; 388 | files = ( 389 | E2AC29C31D847C24004EC6AC /* StoreKitCompanion_iOSTests.swift in Sources */, 390 | ); 391 | runOnlyForDeploymentPostprocessing = 0; 392 | }; 393 | E2AC29CC1D847C36004EC6AC /* Sources */ = { 394 | isa = PBXSourcesBuildPhase; 395 | buildActionMask = 2147483647; 396 | files = ( 397 | E2AC29EE1D847C7F004EC6AC /* StoreKitCompanion.swift in Sources */, 398 | ); 399 | runOnlyForDeploymentPostprocessing = 0; 400 | }; 401 | E2AC29D51D847C37004EC6AC /* Sources */ = { 402 | isa = PBXSourcesBuildPhase; 403 | buildActionMask = 2147483647; 404 | files = ( 405 | E2AC29DF1D847C37004EC6AC /* StoreKitCompanion_macOSTests.swift in Sources */, 406 | ); 407 | runOnlyForDeploymentPostprocessing = 0; 408 | }; 409 | /* End PBXSourcesBuildPhase section */ 410 | 411 | /* Begin PBXTargetDependency section */ 412 | E2AC29C01D847C24004EC6AC /* PBXTargetDependency */ = { 413 | isa = PBXTargetDependency; 414 | target = E2AC29B41D847C24004EC6AC /* StoreKitCompanion iOS */; 415 | targetProxy = E2AC29BF1D847C24004EC6AC /* PBXContainerItemProxy */; 416 | }; 417 | E2AC29DC1D847C37004EC6AC /* PBXTargetDependency */ = { 418 | isa = PBXTargetDependency; 419 | target = E2AC29D01D847C36004EC6AC /* StoreKitCompanion macOS */; 420 | targetProxy = E2AC29DB1D847C37004EC6AC /* PBXContainerItemProxy */; 421 | }; 422 | /* End PBXTargetDependency section */ 423 | 424 | /* Begin XCBuildConfiguration section */ 425 | E2AC29A81D847BD6004EC6AC /* Debug */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ALWAYS_SEARCH_USER_PATHS = NO; 429 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 430 | CLANG_ANALYZER_NONNULL = YES; 431 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 432 | CLANG_CXX_LIBRARY = "libc++"; 433 | CLANG_ENABLE_MODULES = YES; 434 | CLANG_ENABLE_OBJC_ARC = YES; 435 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 436 | CLANG_WARN_BOOL_CONVERSION = YES; 437 | CLANG_WARN_COMMA = YES; 438 | CLANG_WARN_CONSTANT_CONVERSION = YES; 439 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 440 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 441 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 442 | CLANG_WARN_EMPTY_BODY = YES; 443 | CLANG_WARN_ENUM_CONVERSION = YES; 444 | CLANG_WARN_INFINITE_RECURSION = YES; 445 | CLANG_WARN_INT_CONVERSION = YES; 446 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 447 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 448 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 449 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 450 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 451 | CLANG_WARN_STRICT_PROTOTYPES = YES; 452 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 453 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 454 | CLANG_WARN_UNREACHABLE_CODE = YES; 455 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 456 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 457 | COPY_PHASE_STRIP = NO; 458 | CURRENT_PROJECT_VERSION = 1; 459 | DEBUG_INFORMATION_FORMAT = dwarf; 460 | ENABLE_STRICT_OBJC_MSGSEND = YES; 461 | ENABLE_TESTABILITY = YES; 462 | GCC_C_LANGUAGE_STANDARD = gnu99; 463 | GCC_DYNAMIC_NO_PIC = NO; 464 | GCC_NO_COMMON_BLOCKS = YES; 465 | GCC_OPTIMIZATION_LEVEL = 0; 466 | GCC_PREPROCESSOR_DEFINITIONS = ( 467 | "DEBUG=1", 468 | "$(inherited)", 469 | ); 470 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 471 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 472 | GCC_WARN_UNDECLARED_SELECTOR = YES; 473 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 474 | GCC_WARN_UNUSED_FUNCTION = YES; 475 | GCC_WARN_UNUSED_VARIABLE = YES; 476 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 477 | MACOSX_DEPLOYMENT_TARGET = 10.10; 478 | MTL_ENABLE_DEBUG_INFO = YES; 479 | ONLY_ACTIVE_ARCH = YES; 480 | SDKROOT = iphoneos; 481 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 482 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 483 | SWIFT_VERSION = 5.0; 484 | TARGETED_DEVICE_FAMILY = "1,2"; 485 | VERSIONING_SYSTEM = "apple-generic"; 486 | VERSION_INFO_PREFIX = ""; 487 | }; 488 | name = Debug; 489 | }; 490 | E2AC29A91D847BD6004EC6AC /* Release */ = { 491 | isa = XCBuildConfiguration; 492 | buildSettings = { 493 | ALWAYS_SEARCH_USER_PATHS = NO; 494 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 495 | CLANG_ANALYZER_NONNULL = YES; 496 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 497 | CLANG_CXX_LIBRARY = "libc++"; 498 | CLANG_ENABLE_MODULES = YES; 499 | CLANG_ENABLE_OBJC_ARC = YES; 500 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 501 | CLANG_WARN_BOOL_CONVERSION = YES; 502 | CLANG_WARN_COMMA = YES; 503 | CLANG_WARN_CONSTANT_CONVERSION = YES; 504 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 505 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 506 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 507 | CLANG_WARN_EMPTY_BODY = YES; 508 | CLANG_WARN_ENUM_CONVERSION = YES; 509 | CLANG_WARN_INFINITE_RECURSION = YES; 510 | CLANG_WARN_INT_CONVERSION = YES; 511 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 512 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 513 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 514 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 515 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 516 | CLANG_WARN_STRICT_PROTOTYPES = YES; 517 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 518 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 519 | CLANG_WARN_UNREACHABLE_CODE = YES; 520 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 521 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 522 | COPY_PHASE_STRIP = NO; 523 | CURRENT_PROJECT_VERSION = 1; 524 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 525 | ENABLE_NS_ASSERTIONS = NO; 526 | ENABLE_STRICT_OBJC_MSGSEND = YES; 527 | GCC_C_LANGUAGE_STANDARD = gnu99; 528 | GCC_NO_COMMON_BLOCKS = YES; 529 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 530 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 531 | GCC_WARN_UNDECLARED_SELECTOR = YES; 532 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 533 | GCC_WARN_UNUSED_FUNCTION = YES; 534 | GCC_WARN_UNUSED_VARIABLE = YES; 535 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 536 | MACOSX_DEPLOYMENT_TARGET = 10.10; 537 | MTL_ENABLE_DEBUG_INFO = NO; 538 | SDKROOT = iphoneos; 539 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 540 | SWIFT_VERSION = 5.0; 541 | TARGETED_DEVICE_FAMILY = "1,2"; 542 | VALIDATE_PRODUCT = YES; 543 | VERSIONING_SYSTEM = "apple-generic"; 544 | VERSION_INFO_PREFIX = ""; 545 | }; 546 | name = Release; 547 | }; 548 | E2AC29C71D847C24004EC6AC /* Debug */ = { 549 | isa = XCBuildConfiguration; 550 | buildSettings = { 551 | CODE_SIGN_IDENTITY = ""; 552 | DEFINES_MODULE = YES; 553 | DYLIB_COMPATIBILITY_VERSION = 1; 554 | DYLIB_CURRENT_VERSION = 1; 555 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 556 | INFOPLIST_FILE = "StoreKitCompanion iOS/Info.plist"; 557 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 558 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 559 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 560 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-iOS"; 561 | PRODUCT_NAME = StoreKitCompanion; 562 | SKIP_INSTALL = YES; 563 | SWIFT_VERSION = 5.0; 564 | }; 565 | name = Debug; 566 | }; 567 | E2AC29C81D847C24004EC6AC /* Release */ = { 568 | isa = XCBuildConfiguration; 569 | buildSettings = { 570 | CODE_SIGN_IDENTITY = ""; 571 | DEFINES_MODULE = YES; 572 | DYLIB_COMPATIBILITY_VERSION = 1; 573 | DYLIB_CURRENT_VERSION = 1; 574 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 575 | INFOPLIST_FILE = "StoreKitCompanion iOS/Info.plist"; 576 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 577 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 578 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 579 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-iOS"; 580 | PRODUCT_NAME = StoreKitCompanion; 581 | SKIP_INSTALL = YES; 582 | SWIFT_VERSION = 5.0; 583 | }; 584 | name = Release; 585 | }; 586 | E2AC29CA1D847C24004EC6AC /* Debug */ = { 587 | isa = XCBuildConfiguration; 588 | buildSettings = { 589 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 590 | INFOPLIST_FILE = "StoreKitCompanion iOSTests/Info.plist"; 591 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 592 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-iOSTests"; 593 | PRODUCT_NAME = "$(TARGET_NAME)"; 594 | SWIFT_VERSION = 5.0; 595 | }; 596 | name = Debug; 597 | }; 598 | E2AC29CB1D847C24004EC6AC /* Release */ = { 599 | isa = XCBuildConfiguration; 600 | buildSettings = { 601 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 602 | INFOPLIST_FILE = "StoreKitCompanion iOSTests/Info.plist"; 603 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 604 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-iOSTests"; 605 | PRODUCT_NAME = "$(TARGET_NAME)"; 606 | SWIFT_VERSION = 5.0; 607 | }; 608 | name = Release; 609 | }; 610 | E2AC29E31D847C37004EC6AC /* Debug */ = { 611 | isa = XCBuildConfiguration; 612 | buildSettings = { 613 | CODE_SIGN_IDENTITY = "-"; 614 | COMBINE_HIDPI_IMAGES = YES; 615 | DEFINES_MODULE = YES; 616 | DYLIB_COMPATIBILITY_VERSION = 1; 617 | DYLIB_CURRENT_VERSION = 1; 618 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 619 | FRAMEWORK_VERSION = A; 620 | INFOPLIST_FILE = "StoreKitCompanion macOS/Info.plist"; 621 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 622 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 623 | MACOSX_DEPLOYMENT_TARGET = 10.10; 624 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-macOS"; 625 | PRODUCT_NAME = StoreKitCompanion; 626 | SDKROOT = macosx; 627 | SKIP_INSTALL = YES; 628 | SWIFT_VERSION = 5.0; 629 | }; 630 | name = Debug; 631 | }; 632 | E2AC29E41D847C37004EC6AC /* Release */ = { 633 | isa = XCBuildConfiguration; 634 | buildSettings = { 635 | CODE_SIGN_IDENTITY = "-"; 636 | COMBINE_HIDPI_IMAGES = YES; 637 | DEFINES_MODULE = YES; 638 | DYLIB_COMPATIBILITY_VERSION = 1; 639 | DYLIB_CURRENT_VERSION = 1; 640 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 641 | FRAMEWORK_VERSION = A; 642 | INFOPLIST_FILE = "StoreKitCompanion macOS/Info.plist"; 643 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 644 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 645 | MACOSX_DEPLOYMENT_TARGET = 10.10; 646 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-macOS"; 647 | PRODUCT_NAME = StoreKitCompanion; 648 | SDKROOT = macosx; 649 | SKIP_INSTALL = YES; 650 | SWIFT_VERSION = 5.0; 651 | }; 652 | name = Release; 653 | }; 654 | E2AC29E61D847C37004EC6AC /* Debug */ = { 655 | isa = XCBuildConfiguration; 656 | buildSettings = { 657 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 658 | CODE_SIGN_IDENTITY = "-"; 659 | COMBINE_HIDPI_IMAGES = YES; 660 | INFOPLIST_FILE = "StoreKitCompanion macOSTests/Info.plist"; 661 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 662 | MACOSX_DEPLOYMENT_TARGET = 10.11; 663 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-macOSTests"; 664 | PRODUCT_NAME = "$(TARGET_NAME)"; 665 | SDKROOT = macosx; 666 | SWIFT_VERSION = 5.0; 667 | }; 668 | name = Debug; 669 | }; 670 | E2AC29E71D847C37004EC6AC /* Release */ = { 671 | isa = XCBuildConfiguration; 672 | buildSettings = { 673 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 674 | CODE_SIGN_IDENTITY = "-"; 675 | COMBINE_HIDPI_IMAGES = YES; 676 | INFOPLIST_FILE = "StoreKitCompanion macOSTests/Info.plist"; 677 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 678 | MACOSX_DEPLOYMENT_TARGET = 10.11; 679 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-macOSTests"; 680 | PRODUCT_NAME = "$(TARGET_NAME)"; 681 | SDKROOT = macosx; 682 | SWIFT_VERSION = 5.0; 683 | }; 684 | name = Release; 685 | }; 686 | E2AC29EF1D847CEC004EC6AC /* ReleaseTest */ = { 687 | isa = XCBuildConfiguration; 688 | buildSettings = { 689 | ALWAYS_SEARCH_USER_PATHS = NO; 690 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 691 | CLANG_ANALYZER_NONNULL = YES; 692 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 693 | CLANG_CXX_LIBRARY = "libc++"; 694 | CLANG_ENABLE_MODULES = YES; 695 | CLANG_ENABLE_OBJC_ARC = YES; 696 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 697 | CLANG_WARN_BOOL_CONVERSION = YES; 698 | CLANG_WARN_COMMA = YES; 699 | CLANG_WARN_CONSTANT_CONVERSION = YES; 700 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 701 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 702 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 703 | CLANG_WARN_EMPTY_BODY = YES; 704 | CLANG_WARN_ENUM_CONVERSION = YES; 705 | CLANG_WARN_INFINITE_RECURSION = YES; 706 | CLANG_WARN_INT_CONVERSION = YES; 707 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 708 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 709 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 710 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 711 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 712 | CLANG_WARN_STRICT_PROTOTYPES = YES; 713 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 714 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 715 | CLANG_WARN_UNREACHABLE_CODE = YES; 716 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 717 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 718 | COPY_PHASE_STRIP = NO; 719 | CURRENT_PROJECT_VERSION = 1; 720 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 721 | ENABLE_NS_ASSERTIONS = NO; 722 | ENABLE_STRICT_OBJC_MSGSEND = YES; 723 | ENABLE_TESTABILITY = YES; 724 | GCC_C_LANGUAGE_STANDARD = gnu99; 725 | GCC_NO_COMMON_BLOCKS = YES; 726 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 727 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 728 | GCC_WARN_UNDECLARED_SELECTOR = YES; 729 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 730 | GCC_WARN_UNUSED_FUNCTION = YES; 731 | GCC_WARN_UNUSED_VARIABLE = YES; 732 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 733 | MACOSX_DEPLOYMENT_TARGET = 10.10; 734 | MTL_ENABLE_DEBUG_INFO = NO; 735 | SDKROOT = iphoneos; 736 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 737 | SWIFT_VERSION = 5.0; 738 | TARGETED_DEVICE_FAMILY = "1,2"; 739 | VALIDATE_PRODUCT = YES; 740 | VERSIONING_SYSTEM = "apple-generic"; 741 | VERSION_INFO_PREFIX = ""; 742 | }; 743 | name = ReleaseTest; 744 | }; 745 | E2AC29F01D847CEC004EC6AC /* ReleaseTest */ = { 746 | isa = XCBuildConfiguration; 747 | buildSettings = { 748 | CODE_SIGN_IDENTITY = ""; 749 | DEFINES_MODULE = YES; 750 | DYLIB_COMPATIBILITY_VERSION = 1; 751 | DYLIB_CURRENT_VERSION = 1; 752 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 753 | INFOPLIST_FILE = "StoreKitCompanion iOS/Info.plist"; 754 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 755 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 756 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 757 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-iOS"; 758 | PRODUCT_NAME = StoreKitCompanion; 759 | SKIP_INSTALL = YES; 760 | SWIFT_VERSION = 5.0; 761 | }; 762 | name = ReleaseTest; 763 | }; 764 | E2AC29F11D847CEC004EC6AC /* ReleaseTest */ = { 765 | isa = XCBuildConfiguration; 766 | buildSettings = { 767 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 768 | INFOPLIST_FILE = "StoreKitCompanion iOSTests/Info.plist"; 769 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 770 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-iOSTests"; 771 | PRODUCT_NAME = "$(TARGET_NAME)"; 772 | SWIFT_VERSION = 5.0; 773 | }; 774 | name = ReleaseTest; 775 | }; 776 | E2AC29F21D847CEC004EC6AC /* ReleaseTest */ = { 777 | isa = XCBuildConfiguration; 778 | buildSettings = { 779 | CODE_SIGN_IDENTITY = "-"; 780 | COMBINE_HIDPI_IMAGES = YES; 781 | DEFINES_MODULE = YES; 782 | DYLIB_COMPATIBILITY_VERSION = 1; 783 | DYLIB_CURRENT_VERSION = 1; 784 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 785 | FRAMEWORK_VERSION = A; 786 | INFOPLIST_FILE = "StoreKitCompanion macOS/Info.plist"; 787 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 788 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 789 | MACOSX_DEPLOYMENT_TARGET = 10.10; 790 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-macOS"; 791 | PRODUCT_NAME = StoreKitCompanion; 792 | SDKROOT = macosx; 793 | SKIP_INSTALL = YES; 794 | SWIFT_VERSION = 5.0; 795 | }; 796 | name = ReleaseTest; 797 | }; 798 | E2AC29F31D847CEC004EC6AC /* ReleaseTest */ = { 799 | isa = XCBuildConfiguration; 800 | buildSettings = { 801 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 802 | CODE_SIGN_IDENTITY = "-"; 803 | COMBINE_HIDPI_IMAGES = YES; 804 | INFOPLIST_FILE = "StoreKitCompanion macOSTests/Info.plist"; 805 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 806 | MACOSX_DEPLOYMENT_TARGET = 10.11; 807 | PRODUCT_BUNDLE_IDENTIFIER = "com.recisio.StoreKitCompanion-macOSTests"; 808 | PRODUCT_NAME = "$(TARGET_NAME)"; 809 | SDKROOT = macosx; 810 | SWIFT_VERSION = 5.0; 811 | }; 812 | name = ReleaseTest; 813 | }; 814 | /* End XCBuildConfiguration section */ 815 | 816 | /* Begin XCConfigurationList section */ 817 | E2AC29901D847BD6004EC6AC /* Build configuration list for PBXProject "StoreKitCompanion" */ = { 818 | isa = XCConfigurationList; 819 | buildConfigurations = ( 820 | E2AC29A81D847BD6004EC6AC /* Debug */, 821 | E2AC29A91D847BD6004EC6AC /* Release */, 822 | E2AC29EF1D847CEC004EC6AC /* ReleaseTest */, 823 | ); 824 | defaultConfigurationIsVisible = 0; 825 | defaultConfigurationName = Release; 826 | }; 827 | E2AC29C61D847C24004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion iOS" */ = { 828 | isa = XCConfigurationList; 829 | buildConfigurations = ( 830 | E2AC29C71D847C24004EC6AC /* Debug */, 831 | E2AC29C81D847C24004EC6AC /* Release */, 832 | E2AC29F01D847CEC004EC6AC /* ReleaseTest */, 833 | ); 834 | defaultConfigurationIsVisible = 0; 835 | defaultConfigurationName = Release; 836 | }; 837 | E2AC29C91D847C24004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion iOSTests" */ = { 838 | isa = XCConfigurationList; 839 | buildConfigurations = ( 840 | E2AC29CA1D847C24004EC6AC /* Debug */, 841 | E2AC29CB1D847C24004EC6AC /* Release */, 842 | E2AC29F11D847CEC004EC6AC /* ReleaseTest */, 843 | ); 844 | defaultConfigurationIsVisible = 0; 845 | defaultConfigurationName = Release; 846 | }; 847 | E2AC29E21D847C37004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion macOS" */ = { 848 | isa = XCConfigurationList; 849 | buildConfigurations = ( 850 | E2AC29E31D847C37004EC6AC /* Debug */, 851 | E2AC29E41D847C37004EC6AC /* Release */, 852 | E2AC29F21D847CEC004EC6AC /* ReleaseTest */, 853 | ); 854 | defaultConfigurationIsVisible = 0; 855 | defaultConfigurationName = Release; 856 | }; 857 | E2AC29E51D847C37004EC6AC /* Build configuration list for PBXNativeTarget "StoreKitCompanion macOSTests" */ = { 858 | isa = XCConfigurationList; 859 | buildConfigurations = ( 860 | E2AC29E61D847C37004EC6AC /* Debug */, 861 | E2AC29E71D847C37004EC6AC /* Release */, 862 | E2AC29F31D847CEC004EC6AC /* ReleaseTest */, 863 | ); 864 | defaultConfigurationIsVisible = 0; 865 | defaultConfigurationName = Release; 866 | }; 867 | /* End XCConfigurationList section */ 868 | }; 869 | rootObject = E2AC298D1D847BD6004EC6AC /* Project object */; 870 | } 871 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion.xcodeproj/xcshareddata/xcschemes/StoreKitCompanion iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /StoreKitCompanion/StoreKitCompanion.xcodeproj/xcshareddata/xcschemes/StoreKitCompanion macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | --------------------------------------------------------------------------------