Add storyboard and view controller code for tvOS demo

This commit is contained in:
Andrea Bizzotto
2017-03-15 22:52:20 +00:00
parent 6dd9920309
commit dec9bc389b
5 changed files with 395 additions and 29 deletions

View File

@@ -13,7 +13,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
@@ -41,6 +40,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}

View File

@@ -1,14 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder.AppleTV.Storyboard" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="AppleTV" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder.AppleTV.Storyboard" version="3.0" toolsVersion="11762" systemVersion="16A313a" targetRuntime="AppleTV" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="appleTV" orientation="landscape">
<adaptation id="light"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
<deployment identifier="tvOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="SwiftyStoreKit_tvOS_Demo" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
@@ -16,6 +20,80 @@
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="1920" height="1080"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0V2-Mg-12F">
<rect key="frame" x="876" y="106" width="170" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="info 1"/>
<connections>
<action selector="getInfo1" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="nHA-8L-kz5"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Fad-e7-Q2a">
<rect key="frame" x="873" y="227" width="176" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="info 2"/>
<connections>
<action selector="getInfo2" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="qYx-Ai-IvG"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lOy-18-mr9">
<rect key="frame" x="828" y="337" width="266" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="purchase 1"/>
<connections>
<action selector="purchase1" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="K3z-2d-B9r"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VG3-26-V8F">
<rect key="frame" x="825" y="447" width="271" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="purchase 2"/>
<connections>
<action selector="purchase2" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="C85-0E-sl9"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="984-qT-rjk">
<rect key="frame" x="860" y="557" width="202" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="restore"/>
<connections>
<action selector="restorePurchases" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="7nH-dy-bg5"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TE5-kT-3nP">
<rect key="frame" x="864" y="667" width="193" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="verify1"/>
<connections>
<action selector="verifyPurchase1" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="rJq-xw-YhW"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iYp-Z0-czh">
<rect key="frame" x="862" y="777" width="198" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="verify2"/>
<connections>
<action selector="verifyPurchase2" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="d3O-JX-afR"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hdi-nV-Cky">
<rect key="frame" x="860" y="887" width="200" height="86"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<inset key="contentEdgeInsets" minX="40" minY="20" maxX="40" maxY="20"/>
<state key="normal" title="receipt"/>
<connections>
<action selector="verifyReceipt" destination="BYZ-38-t0r" eventType="primaryActionTriggered" id="f73-g0-uzV"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>

View File

@@ -7,19 +7,277 @@
//
import UIKit
import StoreKit
import SwiftyStoreKit
enum RegisteredPurchase: String {
case purchase1
case purchase2
case nonConsumablePurchase
case consumablePurchase
case autoRenewablePurchase
case nonRenewingPurchase
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let appBundleId = "com.musevisions.tvOS.SwiftyStoreKit"
let purchase1Suffix = RegisteredPurchase.purchase1
let purchase2Suffix = RegisteredPurchase.autoRenewablePurchase
// MARK: actions
@IBAction func getInfo1() {
getInfo(purchase1Suffix)
}
@IBAction func purchase1() {
purchase(purchase1Suffix)
}
@IBAction func verifyPurchase1() {
verifyPurchase(purchase1Suffix)
}
@IBAction func getInfo2() {
getInfo(purchase2Suffix)
}
@IBAction func purchase2() {
purchase(purchase2Suffix)
}
@IBAction func verifyPurchase2() {
verifyPurchase(purchase2Suffix)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func getInfo(_ purchase: RegisteredPurchase) {
SwiftyStoreKit.retrieveProductsInfo([appBundleId + "." + purchase.rawValue]) { result in
self.showAlert(self.alertForProductRetrievalInfo(result))
}
}
func purchase(_ purchase: RegisteredPurchase) {
SwiftyStoreKit.purchaseProduct(appBundleId + "." + purchase.rawValue, atomically: true) { result in
if case .success(let product) = result {
// Deliver content from server, then:
if product.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(product.transaction)
}
}
if let alert = self.alertForPurchaseResult(result) {
self.showAlert(alert)
}
}
}
@IBAction func restorePurchases() {
SwiftyStoreKit.restorePurchases(atomically: true) { results in
for product in results.restoredProducts {
// Deliver content from server, then:
if product.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(product.transaction)
}
}
self.showAlert(self.alertForRestorePurchases(results))
}
}
@IBAction func verifyReceipt() {
let appleValidator = AppleReceiptValidator(service: .production)
SwiftyStoreKit.verifyReceipt(using: appleValidator, password: "your-shared-secret") { result in
self.showAlert(self.alertForVerifyReceipt(result))
if case .error(let error) = result {
if case .noReceiptData = error {
self.refreshReceipt()
}
}
}
}
func verifyPurchase(_ purchase: RegisteredPurchase) {
let appleValidator = AppleReceiptValidator(service: .production)
SwiftyStoreKit.verifyReceipt(using: appleValidator, password: "your-shared-secret") { result in
switch result {
case .success(let receipt):
let productId = self.appBundleId + "." + purchase.rawValue
switch purchase {
case .autoRenewablePurchase:
let purchaseResult = SwiftyStoreKit.verifySubscription(
type: .autoRenewable,
productId: productId,
inReceipt: receipt,
validUntil: Date()
)
self.showAlert(self.alertForVerifySubscription(purchaseResult))
case .nonRenewingPurchase:
let purchaseResult = SwiftyStoreKit.verifySubscription(
type: .nonRenewing(validDuration: 60),
productId: productId,
inReceipt: receipt,
validUntil: Date()
)
self.showAlert(self.alertForVerifySubscription(purchaseResult))
default:
let purchaseResult = SwiftyStoreKit.verifyPurchase(
productId: productId,
inReceipt: receipt
)
self.showAlert(self.alertForVerifyPurchase(purchaseResult))
}
case .error(let error):
self.showAlert(self.alertForVerifyReceipt(result))
if case .noReceiptData = error {
self.refreshReceipt()
}
}
}
}
func refreshReceipt() {
SwiftyStoreKit.refreshReceipt { result in
self.showAlert(self.alertForRefreshReceipt(result))
}
}
}
// MARK: User facing alerts
extension ViewController {
func alertWithTitle(_ title: String, message: String) -> UIAlertController {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
return alert
}
func showAlert(_ alert: UIAlertController) {
guard let _ = self.presentedViewController else {
self.present(alert, animated: true, completion: nil)
return
}
}
func alertForProductRetrievalInfo(_ result: RetrieveResults) -> UIAlertController {
if let product = result.retrievedProducts.first {
let priceString = product.localizedPrice!
return alertWithTitle(product.localizedTitle, message: "\(product.localizedDescription) - \(priceString)")
} else if let invalidProductId = result.invalidProductIDs.first {
return alertWithTitle("Could not retrieve product info", message: "Invalid product identifier: \(invalidProductId)")
} else {
let errorString = result.error?.localizedDescription ?? "Unknown error. Please contact support"
return alertWithTitle("Could not retrieve product info", message: errorString)
}
}
func alertForPurchaseResult(_ result: PurchaseResult) -> UIAlertController? {
switch result {
case .success(let product):
print("Purchase Success: \(product.productId)")
return alertWithTitle("Thank You", message: "Purchase completed")
case .error(let error):
print("Purchase Failed: \(error)")
switch error.code {
case .unknown: return alertWithTitle("Purchase failed", message: "Unknown error. Please contact support")
case .clientInvalid: // client is not allowed to issue the request, etc.
return alertWithTitle("Purchase failed", message: "Not allowed to make the payment")
case .paymentCancelled: // user cancelled the request, etc.
return nil
case .paymentInvalid: // purchase identifier was invalid, etc.
return alertWithTitle("Purchase failed", message: "The purchase identifier was invalid")
case .paymentNotAllowed: // this device is not allowed to make the payment
return alertWithTitle("Purchase failed", message: "The device is not allowed to make the payment")
case .storeProductNotAvailable: // Product is not available in the current storefront
return alertWithTitle("Purchase failed", message: "The product is not available in the current storefront")
case .cloudServicePermissionDenied: // user has not allowed access to cloud service information
return alertWithTitle("Purchase failed", message: "Access to cloud service information is not allowed")
case .cloudServiceNetworkConnectionFailed: // the device could not connect to the nework
return alertWithTitle("Purchase failed", message: "Could not connect to the network")
}
}
}
func alertForRestorePurchases(_ results: RestoreResults) -> UIAlertController {
if results.restoreFailedProducts.count > 0 {
print("Restore Failed: \(results.restoreFailedProducts)")
return alertWithTitle("Restore failed", message: "Unknown error. Please contact support")
} else if results.restoredProducts.count > 0 {
print("Restore Success: \(results.restoredProducts)")
return alertWithTitle("Purchases Restored", message: "All purchases have been restored")
} else {
print("Nothing to Restore")
return alertWithTitle("Nothing to restore", message: "No previous purchases were found")
}
}
func alertForVerifyReceipt(_ result: VerifyReceiptResult) -> UIAlertController {
switch result {
case .success(let receipt):
print("Verify receipt Success: \(receipt)")
return alertWithTitle("Receipt verified", message: "Receipt verified remotly")
case .error(let error):
print("Verify receipt Failed: \(error)")
switch error {
case .noReceiptData :
return alertWithTitle("Receipt verification", message: "No receipt data, application will try to get a new one. Try again.")
default:
return alertWithTitle("Receipt verification", message: "Receipt verification failed")
}
}
}
func alertForVerifySubscription(_ result: VerifySubscriptionResult) -> UIAlertController {
switch result {
case .purchased(let expiresDate):
print("Product is valid until \(expiresDate)")
return alertWithTitle("Product is purchased", message: "Product is valid until \(expiresDate)")
case .expired(let expiresDate):
print("Product is expired since \(expiresDate)")
return alertWithTitle("Product expired", message: "Product is expired since \(expiresDate)")
case .notPurchased:
print("This product has never been purchased")
return alertWithTitle("Not purchased", message: "This product has never been purchased")
}
}
func alertForVerifyPurchase(_ result: VerifyPurchaseResult) -> UIAlertController {
switch result {
case .purchased:
print("Product is purchased")
return alertWithTitle("Product is purchased", message: "Product will not expire")
case .notPurchased:
print("This product has never been purchased")
return alertWithTitle("Not purchased", message: "This product has never been purchased")
}
}
func alertForRefreshReceipt(_ result: RefreshReceiptResult) -> UIAlertController {
switch result {
case .success(let receiptData):
print("Receipt refresh Success: \(receiptData.base64EncodedString)")
return alertWithTitle("Receipt refreshed", message: "Receipt refreshed successfully")
case .error(let error):
print("Receipt refresh Failed: \(error)")
return alertWithTitle("Receipt refresh failed", message: "Receipt refresh failed")
}
}
}

View File

@@ -34,6 +34,8 @@
654287F31E79F5A000F61800 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654287F21E79F5A000F61800 /* ViewController.swift */; };
654287F61E79F5A000F61800 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 654287F41E79F5A000F61800 /* Main.storyboard */; };
654287F81E79F5A000F61800 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 654287F71E79F5A000F61800 /* Assets.xcassets */; };
654287FD1E79F75000F61800 /* SwiftyStoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54C0D52C1CF7404500F90BCE /* SwiftyStoreKit.framework */; };
654287FE1E79F75000F61800 /* SwiftyStoreKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 54C0D52C1CF7404500F90BCE /* SwiftyStoreKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
658A08371E2EC24E0074A98F /* PaymentQueueController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658A08361E2EC24E0074A98F /* PaymentQueueController.swift */; };
658A08381E2EC24E0074A98F /* PaymentQueueController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658A08361E2EC24E0074A98F /* PaymentQueueController.swift */; };
658A08391E2EC24E0074A98F /* PaymentQueueController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658A08361E2EC24E0074A98F /* PaymentQueueController.swift */; };
@@ -79,6 +81,13 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
654287FF1E79F75000F61800 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6502F5F61B985833004E342D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 54C0D52B1CF7404500F90BCE;
remoteInfo = SwiftyStoreKit_tvOS;
};
658A08441E2EC5120074A98F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6502F5F61B985833004E342D /* Project object */;
@@ -110,6 +119,17 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
654288011E79F75100F61800 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
654287FE1E79F75000F61800 /* SwiftyStoreKit.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
65F7DF921DCD524300835D30 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -146,7 +166,7 @@
650307F71E317BCF001332A4 /* CompleteTransactionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompleteTransactionsController.swift; sourceTree = "<group>"; };
650307FB1E33154F001332A4 /* ProductsInfoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProductsInfoController.swift; sourceTree = "<group>"; };
653722801DB8282600C8F944 /* SKProduct+LocalizedPrice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SKProduct+LocalizedPrice.swift"; sourceTree = "<group>"; };
654287EE1E79F5A000F61800 /* SwiftyStoreKit-tvOS-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftyStoreKit-tvOS-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
654287EE1E79F5A000F61800 /* SwiftyStoreKit-tvOSDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftyStoreKit-tvOSDemo.app"; sourceTree = BUILT_PRODUCTS_DIR; };
654287F01E79F5A000F61800 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
654287F21E79F5A000F61800 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
654287F51E79F5A000F61800 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
@@ -216,6 +236,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
654287FD1E79F75000F61800 /* SwiftyStoreKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -266,7 +287,7 @@
C4FD3A011C2954C10035CFF3 /* SwiftyStoreKit_macOSDemo.app */,
54C0D52C1CF7404500F90BCE /* SwiftyStoreKit.framework */,
658A083E1E2EC5120074A98F /* SwiftyStoreKitTests.xctest */,
654287EE1E79F5A000F61800 /* SwiftyStoreKit-tvOS-Demo.app */,
654287EE1E79F5A000F61800 /* SwiftyStoreKit-tvOSDemo.app */,
);
name = Products;
sourceTree = "<group>";
@@ -445,21 +466,23 @@
productReference = 6502F62D1B985C40004E342D /* SwiftyStoreKit.framework */;
productType = "com.apple.product-type.framework";
};
654287ED1E79F5A000F61800 /* SwiftyStoreKit-tvOS-Demo */ = {
654287ED1E79F5A000F61800 /* SwiftyStoreKit-tvOSDemo */ = {
isa = PBXNativeTarget;
buildConfigurationList = 654287FC1E79F5A000F61800 /* Build configuration list for PBXNativeTarget "SwiftyStoreKit-tvOS-Demo" */;
buildConfigurationList = 654287FC1E79F5A000F61800 /* Build configuration list for PBXNativeTarget "SwiftyStoreKit-tvOSDemo" */;
buildPhases = (
654287EA1E79F5A000F61800 /* Sources */,
654287EB1E79F5A000F61800 /* Frameworks */,
654287EC1E79F5A000F61800 /* Resources */,
654288011E79F75100F61800 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
654288001E79F75000F61800 /* PBXTargetDependency */,
);
name = "SwiftyStoreKit-tvOS-Demo";
name = "SwiftyStoreKit-tvOSDemo";
productName = "SwiftyStoreKit-tvOS-Demo";
productReference = 654287EE1E79F5A000F61800 /* SwiftyStoreKit-tvOS-Demo.app */;
productReference = 654287EE1E79F5A000F61800 /* SwiftyStoreKit-tvOSDemo.app */;
productType = "com.apple.product-type.application";
};
658A083D1E2EC5120074A98F /* SwiftyStoreKitTests */ = {
@@ -531,6 +554,7 @@
TargetAttributes = {
54C0D52B1CF7404500F90BCE = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = M54ZVB688G;
};
6502F5FD1B985833004E342D = {
CreatedOnToolsVersion = 7.0;
@@ -579,7 +603,7 @@
54C0D52B1CF7404500F90BCE /* SwiftyStoreKit_tvOS */,
6502F5FD1B985833004E342D /* SwiftyStoreKit_iOSDemo */,
C4FD3A001C2954C10035CFF3 /* SwiftyStoreKit_macOSDemo */,
654287ED1E79F5A000F61800 /* SwiftyStoreKit-tvOS-Demo */,
654287ED1E79F5A000F61800 /* SwiftyStoreKit-tvOSDemo */,
658A083D1E2EC5120074A98F /* SwiftyStoreKitTests */,
);
};
@@ -782,6 +806,11 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
654288001E79F75000F61800 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 54C0D52B1CF7404500F90BCE /* SwiftyStoreKit_tvOS */;
targetProxy = 654287FF1E79F75000F61800 /* PBXContainerItemProxy */;
};
658A08451E2EC5120074A98F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 6502F62C1B985C40004E342D /* SwiftyStoreKit_iOS */;
@@ -847,6 +876,7 @@
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = M54ZVB688G;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -871,6 +901,7 @@
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = M54ZVB688G;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -1063,6 +1094,7 @@
654287FA1E79F5A000F61800 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ANALYZER_NONNULL = YES;
@@ -1083,6 +1115,7 @@
654287FB1E79F5A000F61800 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ANALYZER_NONNULL = YES;
@@ -1253,7 +1286,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
654287FC1E79F5A000F61800 /* Build configuration list for PBXNativeTarget "SwiftyStoreKit-tvOS-Demo" */ = {
654287FC1E79F5A000F61800 /* Build configuration list for PBXNativeTarget "SwiftyStoreKit-tvOSDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
654287FA1E79F5A000F61800 /* Debug */,

View File

@@ -15,8 +15,8 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "654287ED1E79F5A000F61800"
BuildableName = "SwiftyStoreKit-tvOS-Demo.app"
BlueprintName = "SwiftyStoreKit-tvOS-Demo"
BuildableName = "SwiftyStoreKit-tvOSDemo.app"
BlueprintName = "SwiftyStoreKit-tvOSDemo"
ReferencedContainer = "container:SwiftyStoreKit.xcodeproj">
</BuildableReference>
</BuildActionEntry>
@@ -33,8 +33,8 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "654287ED1E79F5A000F61800"
BuildableName = "SwiftyStoreKit-tvOS-Demo.app"
BlueprintName = "SwiftyStoreKit-tvOS-Demo"
BuildableName = "SwiftyStoreKit-tvOSDemo.app"
BlueprintName = "SwiftyStoreKit-tvOSDemo"
ReferencedContainer = "container:SwiftyStoreKit.xcodeproj">
</BuildableReference>
</MacroExpansion>
@@ -56,8 +56,8 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "654287ED1E79F5A000F61800"
BuildableName = "SwiftyStoreKit-tvOS-Demo.app"
BlueprintName = "SwiftyStoreKit-tvOS-Demo"
BuildableName = "SwiftyStoreKit-tvOSDemo.app"
BlueprintName = "SwiftyStoreKit-tvOSDemo"
ReferencedContainer = "container:SwiftyStoreKit.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
@@ -75,8 +75,8 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "654287ED1E79F5A000F61800"
BuildableName = "SwiftyStoreKit-tvOS-Demo.app"
BlueprintName = "SwiftyStoreKit-tvOS-Demo"
BuildableName = "SwiftyStoreKit-tvOSDemo.app"
BlueprintName = "SwiftyStoreKit-tvOSDemo"
ReferencedContainer = "container:SwiftyStoreKit.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>