diff --git a/.gitignore b/.gitignore index 9b2c072..73d9ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -53,11 +53,12 @@ playground.xcworkspace # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ -# + +Pods/ +Podfile.lock + # Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace +*.xcworkspace # Carthage # diff --git a/Example App/Example App.xcodeproj/project.pbxproj b/Example App/Example App.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a437439 --- /dev/null +++ b/Example App/Example App.xcodeproj/project.pbxproj @@ -0,0 +1,445 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 1235C7B4E52BE0AC713466C7 /* Pods_Example_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F6FE637D51A3AF7D004AAC4 /* Pods_Example_App.framework */; }; + E16FA8852746FAF70047ABE6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16FA8842746FAF70047ABE6 /* AppDelegate.swift */; }; + E16FA8872746FAF70047ABE6 /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16FA8862746FAF70047ABE6 /* MainController.swift */; }; + E16FA88A2746FAF70047ABE6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E16FA8882746FAF70047ABE6 /* Main.storyboard */; }; + E16FA88C2746FAF80047ABE6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E16FA88B2746FAF80047ABE6 /* Assets.xcassets */; }; + E16FA88F2746FAF80047ABE6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E16FA88D2746FAF80047ABE6 /* LaunchScreen.storyboard */; }; + E16FA89A2746FBDD0047ABE6 /* TableItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16FA8992746FBDD0047ABE6 /* TableItem.swift */; }; + E16FA89C2746FBFD0047ABE6 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16FA89B2746FBFD0047ABE6 /* Constants.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5F6FE637D51A3AF7D004AAC4 /* Pods_Example_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C5E7C2348DC747E807B975D1 /* Pods-Example App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example App.release.xcconfig"; path = "Target Support Files/Pods-Example App/Pods-Example App.release.xcconfig"; sourceTree = ""; }; + E16FA8812746FAF70047ABE6 /* Example App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E16FA8842746FAF70047ABE6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E16FA8862746FAF70047ABE6 /* MainController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = ""; }; + E16FA8892746FAF70047ABE6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E16FA88B2746FAF80047ABE6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E16FA88E2746FAF80047ABE6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + E16FA8902746FAF80047ABE6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E16FA8992746FBDD0047ABE6 /* TableItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableItem.swift; sourceTree = ""; }; + E16FA89B2746FBFD0047ABE6 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + F14919F5B8D2B851EDD9E326 /* Pods-Example App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example App.debug.xcconfig"; path = "Target Support Files/Pods-Example App/Pods-Example App.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E16FA87E2746FAF70047ABE6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1235C7B4E52BE0AC713466C7 /* Pods_Example_App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 93B4C9430C2E258C24F63B69 /* Pods */ = { + isa = PBXGroup; + children = ( + F14919F5B8D2B851EDD9E326 /* Pods-Example App.debug.xcconfig */, + C5E7C2348DC747E807B975D1 /* Pods-Example App.release.xcconfig */, + ); + name = Pods; + path = ../Pods; + sourceTree = ""; + }; + C5323A384B02AFB2BD84A6BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5F6FE637D51A3AF7D004AAC4 /* Pods_Example_App.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E16FA8782746FAF70047ABE6 = { + isa = PBXGroup; + children = ( + E16FA8832746FAF70047ABE6 /* Example App */, + E16FA8822746FAF70047ABE6 /* Products */, + 93B4C9430C2E258C24F63B69 /* Pods */, + C5323A384B02AFB2BD84A6BC /* Frameworks */, + ); + sourceTree = ""; + }; + E16FA8822746FAF70047ABE6 /* Products */ = { + isa = PBXGroup; + children = ( + E16FA8812746FAF70047ABE6 /* Example App.app */, + ); + name = Products; + sourceTree = ""; + }; + E16FA8832746FAF70047ABE6 /* Example App */ = { + isa = PBXGroup; + children = ( + E16FA8962746FB830047ABE6 /* source */, + E16FA8972746FB990047ABE6 /* storyboard */, + E1B632BE2746FE3A008A3EE7 /* supporting */, + ); + path = "Example App"; + sourceTree = ""; + }; + E16FA8962746FB830047ABE6 /* source */ = { + isa = PBXGroup; + children = ( + E16FA8842746FAF70047ABE6 /* AppDelegate.swift */, + E16FA8862746FAF70047ABE6 /* MainController.swift */, + E16FA8992746FBDD0047ABE6 /* TableItem.swift */, + E16FA89B2746FBFD0047ABE6 /* Constants.swift */, + ); + path = source; + sourceTree = ""; + }; + E16FA8972746FB990047ABE6 /* storyboard */ = { + isa = PBXGroup; + children = ( + E16FA88D2746FAF80047ABE6 /* LaunchScreen.storyboard */, + E16FA8882746FAF70047ABE6 /* Main.storyboard */, + ); + path = storyboard; + sourceTree = ""; + }; + E1B632BE2746FE3A008A3EE7 /* supporting */ = { + isa = PBXGroup; + children = ( + E16FA8902746FAF80047ABE6 /* Info.plist */, + E16FA88B2746FAF80047ABE6 /* Assets.xcassets */, + ); + path = supporting; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E16FA8802746FAF70047ABE6 /* Example App */ = { + isa = PBXNativeTarget; + buildConfigurationList = E16FA8932746FAF80047ABE6 /* Build configuration list for PBXNativeTarget "Example App" */; + buildPhases = ( + 5C2EF1733013E352E6AC92DA /* [CP] Check Pods Manifest.lock */, + E16FA87D2746FAF70047ABE6 /* Sources */, + E16FA87E2746FAF70047ABE6 /* Frameworks */, + E16FA87F2746FAF70047ABE6 /* Resources */, + B349F01BC772DF95372CD928 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Example App"; + productName = "flowplayer-tvOS"; + productReference = E16FA8812746FAF70047ABE6 /* Example App.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E16FA8792746FAF70047ABE6 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1250; + LastUpgradeCheck = 1250; + TargetAttributes = { + E16FA8802746FAF70047ABE6 = { + CreatedOnToolsVersion = 12.5.1; + }; + }; + }; + buildConfigurationList = E16FA87C2746FAF70047ABE6 /* Build configuration list for PBXProject "Example App" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = E16FA8782746FAF70047ABE6; + productRefGroup = E16FA8822746FAF70047ABE6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E16FA8802746FAF70047ABE6 /* Example App */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E16FA87F2746FAF70047ABE6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E16FA88F2746FAF80047ABE6 /* LaunchScreen.storyboard in Resources */, + E16FA88C2746FAF80047ABE6 /* Assets.xcassets in Resources */, + E16FA88A2746FAF70047ABE6 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5C2EF1733013E352E6AC92DA /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Example App-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + B349F01BC772DF95372CD928 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example App/Pods-Example App-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example App/Pods-Example App-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example App/Pods-Example App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E16FA87D2746FAF70047ABE6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E16FA8872746FAF70047ABE6 /* MainController.swift in Sources */, + E16FA89A2746FBDD0047ABE6 /* TableItem.swift in Sources */, + E16FA8852746FAF70047ABE6 /* AppDelegate.swift in Sources */, + E16FA89C2746FBFD0047ABE6 /* Constants.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + E16FA8882746FAF70047ABE6 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E16FA8892746FAF70047ABE6 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + E16FA88D2746FAF80047ABE6 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E16FA88E2746FAF80047ABE6 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + E16FA8912746FAF80047ABE6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = appletvos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TVOS_DEPLOYMENT_TARGET = 14.5; + }; + name = Debug; + }; + E16FA8922746FAF80047ABE6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = appletvos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TVOS_DEPLOYMENT_TARGET = 14.5; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E16FA8942746FAF80047ABE6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F14919F5B8D2B851EDD9E326 /* Pods-Example App.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "$(SRCROOT)/Example App/supporting/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.flowplayer.test.flowplayer-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 12.1; + }; + name = Debug; + }; + E16FA8952746FAF80047ABE6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C5E7C2348DC747E807B975D1 /* Pods-Example App.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "$(SRCROOT)/Example App/supporting/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.flowplayer.test.flowplayer-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 12.1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E16FA87C2746FAF70047ABE6 /* Build configuration list for PBXProject "Example App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E16FA8912746FAF80047ABE6 /* Debug */, + E16FA8922746FAF80047ABE6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E16FA8932746FAF80047ABE6 /* Build configuration list for PBXNativeTarget "Example App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E16FA8942746FAF80047ABE6 /* Debug */, + E16FA8952746FAF80047ABE6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E16FA8792746FAF70047ABE6 /* Project object */; +} diff --git a/Example App/Example App.xcodeproj/xcshareddata/xcschemes/Example App.xcscheme b/Example App/Example App.xcodeproj/xcshareddata/xcschemes/Example App.xcscheme new file mode 100644 index 0000000..415281e --- /dev/null +++ b/Example App/Example App.xcodeproj/xcshareddata/xcschemes/Example App.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example App/Example App/source/AppDelegate.swift b/Example App/Example App/source/AppDelegate.swift new file mode 100644 index 0000000..f0b7067 --- /dev/null +++ b/Example App/Example App/source/AppDelegate.swift @@ -0,0 +1,30 @@ +// +// AppDelegate.swift +// flowplayer-tvOS +// +// Created by Mehdi on 18. 11. 2021.. +// + +import UIKit +import AVFoundation + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + let audioSession = AVAudioSession.sharedInstance() + + do { + // Required for audio & video playback on physical devices + try audioSession.setCategory(.playback, mode: .moviePlayback) + } catch { + print("Setting category to AVAudioSessionCategoryPlayback failed.") + } + + return true + } + +} + diff --git a/Example App/Example App/source/Constants.swift b/Example App/Example App/source/Constants.swift new file mode 100644 index 0000000..c58504f --- /dev/null +++ b/Example App/Example App/source/Constants.swift @@ -0,0 +1,26 @@ +// +// Constants.swift +// flowplayer-tvOS +// +// Created by Mehdi on 18. 11. 2021.. +// + +import Foundation + +struct Constants { + // - Videos + static let DEMO_MEDIA_ID = "69891ec1-2d90-423c-9892-5a9ee87b6d86" + static let DEMO_PLAYER_ID = "ac6dea7c-acf1-472a-bdab-efdd85f092f1" + static let DEMO_URL_HLS = "https://wowzaec2demo.streamlock.net/vod-multitrack/_definst_/smil:ElephantsDream/ElephantsDream.smil/playlist.m3u8" + static let DEMO_URL_MP4 = "https://edge.flowplayer.org/drive.mp4" + static let DEMO_URL_HLS_SUBTITLES = "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8" + static let DEMO_MEDIA_ID_SUBTITLES = "279a8421-2488-4698-b0bd-2df15b2fabfe" + static let DEMO_URL_VMAP = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpostpod&cmsid=496&vid=short_onecue&correlator=" + + // - Ads + static let DEMO_URL_AD_PREROLL = "https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&vad_type=linear&vpos=preroll&pod=1&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6376&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpostpod&url=&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0" + static let DEMO_URL_AD_MIDROLL1 = "https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&ppos=1&min_ad_duration=0&max_ad_duration=30000&vrid=6376&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpostpod&url=&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0" + static let DEMO_URL_AD_MIDROLL2 = "https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&ppos=2&min_ad_duration=0&max_ad_duration=30000&vrid=6376&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpostpod&url=&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0" + static let DEMO_URL_AD_MIDROLL3 = "https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&ppos=3&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6376&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpostpod&url=&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0" + static let DEMO_URL_AD_POSTROLL = "https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&vad_type=linear&vpos=postroll&pod=3&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6376&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpostpod&url=&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0" +} diff --git a/Example App/Example App/source/MainController.swift b/Example App/Example App/source/MainController.swift new file mode 100644 index 0000000..d6061ab --- /dev/null +++ b/Example App/Example App/source/MainController.swift @@ -0,0 +1,216 @@ +// +// MainController.swift +// flowplayer-tvOS +// +// Created by Mehdi on 18. 11. 2021.. +// + +import AVKit +import Flowplayer + +// - Identifiers +fileprivate let CELL_ID = "video-cell" + +class MainController: UIViewController { + + // - Views + @IBOutlet weak var tableView: UITableView! + + // - Props + private var flowplayer: FPFlowplayer! + private let player = AVPlayer() + private let playerController = AVPlayerViewController() + + override func viewDidLoad() { + super.viewDidLoad() + tableView.dataSource = self + tableView.delegate = self + + playerController.player = player + playerController.modalPresentationStyle = .fullScreen + playerController.delegate = self + flowplayer = FPFlowplayer(player: player, controller: playerController) + flowplayer.delegate = self + } + +} + +// MARK: - UITableViewDatasource +extension MainController: UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return tableData.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: CELL_ID, for: indexPath) + cell.textLabel?.text = tableData[indexPath.row].title + cell.accessoryType = .disclosureIndicator + return cell + } + +} + +// MARK: - UITableViewDelegate +extension MainController: UITableViewDelegate { + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let item = tableData[indexPath.row] + + present(playerController, animated: true) { [weak self] in + // INFO: For the ADs to load, media needs to be loaded after the controller has been presented + self?.onPlayControllerPresented(item: item) + } + } + +} + +// MARK: - Private +extension MainController { + + private func onPlayControllerPresented(item: TableItem) { + if let externalMedia = item.externalMedia { + self.flowplayer.load(external: externalMedia, autoStart: true) + } + + if let flowplayerMedia = item.flowplayerMedia { + self.flowplayer.load(flowplayer: flowplayerMedia, autoStart: true) + } + } + +} + +// MARK: - AVPlayer +extension MainController: AVPlayerViewControllerDelegate { + + func playerViewControllerWillBeginDismissalTransition(_ playerViewController: AVPlayerViewController) { + // Stop flowplayer playback + flowplayer.stop() + } + +} + +// MARK: - FPFlowplayerDelegate +extension MainController: FPFlowplayerDelegate { + + func onIdle(event: FPIdleEvent) { + print(#function) + print(event) + } + + func onReady(event: FPReadyEvent) { + print(#function) + print(event) + } + + func onPlay(event: FPPlayEvent) { + print(#function) + print(event) + } + + func onPause(event: FPPauseEvent) { + print(#function) + print(event) + } + + func onBuffer(event: FPBufferEvent) { + print(#function) + print(event) + } + + func onComplete(event: FPCompleteEvent) { + print(#function) + print(event) + } + + func onMute(event: FPMuteEvent) { + print(#function) + print(event) + } + + func onVolume(event: FPVolumeEvent) { + print(#function) + print(event) + } + + func onSpeed(event: FPSpeedEvent) { + print(#function) + print(event) + } + + func onAudioTracksLoaded(event: FPAudioTracksEvent) { + print(#function) + print(event) + } + + func onAudioTrackSelect(event: FPAudioTrackSelectEvent) { + print(#function) + print(event.audioTrack) + } + + func onSubtitleTrackSelect(event: FPSubtitleTrackSelectEvent) { + print(#function) + dump(event.subtitleTrack) + } + + func onSubtitleTracksLoaded(event: FPSubtitleTracksEvent) { + print(#function) + print(event) + } + + func onOvpMetadata(event: FPOvpMetadataEvent) { + print(#function) + print(event) + } + + func onError(event: FPErrorEvent) { + print(#function) + print(event) + } + + func onAdBreakStart(event: FPAdBreakStartEvent) { + print(#function) + print(event) + } + + func onAdBreakComplete(event: FPAdBreakCompleteEvent) { + print(#function) + print(event) + } + + func onAdStart(event: FPAdStartEvent) { + print(#function) + print(event) + } + + func onAdPause(event: FPAdPauseEvent) { + print(#function) + print(event) + } + + func onAdResume(event: FPAdResumeEvent) { + print(#function) + print(event) + } + + func onAdClick(event: FPAdClickEvent) { + print(#function) + print(event) + } + + func onAdSkip(event: FPAdSkipEvent) { + print(#function) + print(event) + } + + func onAdComplete(event: FPAdCompleteEvent) { + print(#function) + print(event) + } + + func onAdError(event: FPAdErrorEvent) { + print(#function) + print(event) + } + +} diff --git a/Example App/Example App/source/TableItem.swift b/Example App/Example App/source/TableItem.swift new file mode 100644 index 0000000..4100b73 --- /dev/null +++ b/Example App/Example App/source/TableItem.swift @@ -0,0 +1,52 @@ +// +// TableItem.swift +// flowplayer-tvOS +// +// Created by Mehdi on 18. 11. 2021.. +// + +import Foundation +import Flowplayer + +struct TableItem { + let title: String + let flowplayerMedia: FPFlowplayerMedia? + let externalMedia: FPExternalMedia? +} + +let tableData: [TableItem] = [ + .init( + title: "HLS with VMAP", + flowplayerMedia: nil, + externalMedia: FPExternalMedia(mediaUrl: URL(string: Constants.DEMO_URL_HLS)!, + adSchedule: FPAdSchedule(adScheduleUrl: Constants.DEMO_URL_VMAP)) + ), + .init( + title: "HLS with waterfall", + flowplayerMedia: nil, + externalMedia: FPExternalMedia(mediaUrl: URL(string: Constants.DEMO_URL_HLS)!, + adSchedule: FPAdSchedule( + adScheduleWaterfall: [ + FPAdBreak(adTag: Constants.DEMO_URL_AD_PREROLL, roll: .pre), + FPAdBreak(adTags: [Constants.DEMO_URL_AD_MIDROLL1, Constants.DEMO_URL_AD_MIDROLL2, Constants.DEMO_URL_AD_MIDROLL3], offset: 30), + FPAdBreak(adTag: Constants.DEMO_URL_AD_POSTROLL, roll: .post) + ]), + subtitles: []) + ), + .init( + title: "MP4", + flowplayerMedia: nil, + externalMedia: FPExternalMedia(mediaUrl: URL(string: Constants.DEMO_URL_MP4)!) + ), + .init( + title: "HLS with embedded subtitles", + flowplayerMedia: nil, + externalMedia: FPExternalMedia(mediaUrl: URL(string: Constants.DEMO_URL_HLS_SUBTITLES)!) + ), + .init( + title: "Flowplayer media with sideloaded subs", + flowplayerMedia: FPFlowplayerMedia(mediaId: Constants.DEMO_MEDIA_ID_SUBTITLES, + playerId: Constants.DEMO_PLAYER_ID), + externalMedia: nil + ), +] diff --git a/Example App/Example App/storyboard/Base.lproj/LaunchScreen.storyboard b/Example App/Example App/storyboard/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..660ba53 --- /dev/null +++ b/Example App/Example App/storyboard/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example App/Example App/storyboard/Base.lproj/Main.storyboard b/Example App/Example App/storyboard/Base.lproj/Main.storyboard new file mode 100644 index 0000000..c8593c6 --- /dev/null +++ b/Example App/Example App/storyboard/Base.lproj/Main.storyboard @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example App/Example App/supporting/Assets.xcassets/AccentColor.colorset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..2e00335 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,11 @@ +{ + "images" : [ + { + "idiom" : "tv" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json new file mode 100644 index 0000000..de59d88 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ] +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..2e00335 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,11 @@ +{ + "images" : [ + { + "idiom" : "tv" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..2e00335 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,11 @@ +{ + "images" : [ + { + "idiom" : "tv" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..795cce1 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json new file mode 100644 index 0000000..de59d88 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ] +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..795cce1 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 0000000..795cce1 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json new file mode 100644 index 0000000..f47ba43 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -0,0 +1,32 @@ +{ + "assets" : [ + { + "filename" : "App Icon - App Store.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "1280x768" + }, + { + "filename" : "App Icon.imagestack", + "idiom" : "tv", + "role" : "primary-app-icon", + "size" : "400x240" + }, + { + "filename" : "Top Shelf Image Wide.imageset", + "idiom" : "tv", + "role" : "top-shelf-image-wide", + "size" : "2320x720" + }, + { + "filename" : "Top Shelf Image.imageset", + "idiom" : "tv", + "role" : "top-shelf-image", + "size" : "1920x720" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json new file mode 100644 index 0000000..b65f0cd --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json new file mode 100644 index 0000000..b65f0cd --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + }, + { + "idiom" : "tv", + "scale" : "2x" + }, + { + "idiom" : "tv-marketing", + "scale" : "1x" + }, + { + "idiom" : "tv-marketing", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Assets.xcassets/Contents.json b/Example App/Example App/supporting/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example App/Example App/supporting/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example App/Example App/supporting/Info.plist b/Example App/Example App/supporting/Info.plist new file mode 100644 index 0000000..1eba55a --- /dev/null +++ b/Example App/Example App/supporting/Info.plist @@ -0,0 +1,36 @@ + + + + + FlowplayerAccessToken + YOUR_ACCESS_TOKEN + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UIUserInterfaceStyle + Automatic + + diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..03025a5 --- /dev/null +++ b/Podfile @@ -0,0 +1,13 @@ +use_frameworks! +inhibit_all_warnings! + +def tvos_pods + pod 'Flowplayer-tvOS', '~> 1.0.2' + pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.4.2' +end + +target 'Example App' do + project 'Example App/Example App.xcodeproj' + platform :tvos, '12.1' + tvos_pods +end diff --git a/README.md b/README.md index c7ccd42..424a903 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -Official Flowplayer SDK for tvOS. +# Official Repository + +Official Flowplayer repository of the Flowplayer tvOS SDK. ## **Installation** @@ -8,8 +10,8 @@ Use the package manager [CocoaPods](https://cocoapods.org/) to install Flowplaye ```bash # PodFile -pod 'Flowplayer-tvOS', '1.0.0' -pod 'GoogleAds-IMA-iOS-SDK', '4.4.2' +pod 'Flowplayer-tvOS', '~> 1.0.2' +pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.4.2' ``` and the run @@ -20,7 +22,7 @@ pod install ### Manual integration -Step 1: Download Flowplayer [here](https://github.com/flowplayer/flowplayer-tvos-sdk-public/releases). +Step 1: Download Flowplayer [here](https://github.com/flowplayer/flowplayer-tvos/releases). Step 2: Add Flowplayer to project.