diff --git a/Aerial.xcodeproj/project.pbxproj b/Aerial.xcodeproj/project.pbxproj index b6be77c6..cc21f6d0 100644 --- a/Aerial.xcodeproj/project.pbxproj +++ b/Aerial.xcodeproj/project.pbxproj @@ -46,6 +46,9 @@ 03E8731121662AEB002B469B /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E8730E216501ED002B469B /* AsynchronousOperation.swift */; }; 03E8731321675FE0002B469B /* TimeManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E8731221675FE0002B469B /* TimeManagement.swift */; }; 03E87314216760B7002B469B /* TimeManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E8731221675FE0002B469B /* TimeManagement.swift */; }; + 1CE1414C7F559B453E61831F /* Pods_AerialApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA0922E026F9FAC43AF7A569 /* Pods_AerialApp.framework */; }; + 42813D561DB8096CC34CB535 /* Pods_Aerial_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E7FC91C9058F0A22FBCC762 /* Pods_Aerial_Tests.framework */; }; + 70CA722D8D5D59C803F3B81B /* Pods_Aerial.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C010F2542FCE112D8A6E5CA /* Pods_Aerial.framework */; }; AA7E2E5E1FC62E8B00E5F320 /* AerialPlayerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA7E2E5D1FC62E8B00E5F320 /* AerialPlayerItem.swift */; }; FA143CE61BDA3EEF0041A82B /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA143CE51BDA3EEF0041A82B /* AVKit.framework */; }; FA36BD3F1BE57F8E00D5E03B /* VideoDownload.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA36BD3E1BE57F8E00D5E03B /* VideoDownload.swift */; }; @@ -109,7 +112,16 @@ 03E8730B2165013C002B469B /* DownloadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadManager.swift; sourceTree = ""; }; 03E8730E216501ED002B469B /* AsynchronousOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; 03E8731221675FE0002B469B /* TimeManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeManagement.swift; sourceTree = ""; }; + 0C8FC8BFBDB12119C417B384 /* Pods-AerialApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AerialApp.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AerialApp/Pods-AerialApp.debug.xcconfig"; sourceTree = ""; }; + 16D0EAF0612223CDB1E938A3 /* Pods-Aerial.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Aerial.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Aerial/Pods-Aerial.debug.xcconfig"; sourceTree = ""; }; + 431164E9C62B702ED573DE22 /* Pods-Aerial.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Aerial.release.xcconfig"; path = "Pods/Target Support Files/Pods-Aerial/Pods-Aerial.release.xcconfig"; sourceTree = ""; }; + 6F861C9769B40A0B8FBDC0E6 /* Pods-Aerial Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Aerial Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Aerial Tests/Pods-Aerial Tests.debug.xcconfig"; sourceTree = ""; }; + 7E7FC91C9058F0A22FBCC762 /* Pods_Aerial_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Aerial_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8C010F2542FCE112D8A6E5CA /* Pods_Aerial.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Aerial.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AA7E2E5D1FC62E8B00E5F320 /* AerialPlayerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AerialPlayerItem.swift; sourceTree = ""; }; + C2789CB51C64430F9CDEABF1 /* Pods-Aerial Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Aerial Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Aerial Tests/Pods-Aerial Tests.release.xcconfig"; sourceTree = ""; }; + E783122BE370B662D207D98F /* Pods-AerialApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AerialApp.release.xcconfig"; path = "Pods/Target Support Files/Pods-AerialApp/Pods-AerialApp.release.xcconfig"; sourceTree = ""; }; + FA0922E026F9FAC43AF7A569 /* Pods_AerialApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AerialApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FA143CD61BDA3E880041A82B /* AerialApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AerialApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; FA143CE51BDA3EEF0041A82B /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; }; FA36BD3E1BE57F8E00D5E03B /* VideoDownload.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = VideoDownload.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; @@ -144,6 +156,7 @@ 03510C772185EF8F008F74F2 /* CoreLocation.framework in Frameworks */, 03510C6B21834EB2008F74F2 /* IOKit.framework in Frameworks */, FA143CE61BDA3EEF0041A82B /* AVKit.framework in Frameworks */, + 1CE1414C7F559B453E61831F /* Pods_AerialApp.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -151,6 +164,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 42813D561DB8096CC34CB535 /* Pods_Aerial_Tests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -160,6 +174,7 @@ files = ( 03510C732185EF76008F74F2 /* CoreLocation.framework in Frameworks */, 03510C6C21834EFF008F74F2 /* IOKit.framework in Frameworks */, + 70CA722D8D5D59C803F3B81B /* Pods_Aerial.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -195,12 +210,28 @@ path = Downloads; sourceTree = ""; }; + F1B1238D786BBB1C50CB8803 /* Pods */ = { + isa = PBXGroup; + children = ( + 16D0EAF0612223CDB1E938A3 /* Pods-Aerial.debug.xcconfig */, + 431164E9C62B702ED573DE22 /* Pods-Aerial.release.xcconfig */, + 6F861C9769B40A0B8FBDC0E6 /* Pods-Aerial Tests.debug.xcconfig */, + C2789CB51C64430F9CDEABF1 /* Pods-Aerial Tests.release.xcconfig */, + 0C8FC8BFBDB12119C417B384 /* Pods-AerialApp.debug.xcconfig */, + E783122BE370B662D207D98F /* Pods-AerialApp.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; FA2D7AA01BDD849E009EA54C /* Frameworks */ = { isa = PBXGroup; children = ( 03510C722185EF76008F74F2 /* CoreLocation.framework */, 03510C6A21834EB2008F74F2 /* IOKit.framework */, FA143CE51BDA3EEF0041A82B /* AVKit.framework */, + 8C010F2542FCE112D8A6E5CA /* Pods_Aerial.framework */, + 7E7FC91C9058F0A22FBCC762 /* Pods_Aerial_Tests.framework */, + FA0922E026F9FAC43AF7A569 /* Pods_AerialApp.framework */, ); name = Frameworks; sourceTree = ""; @@ -324,6 +355,7 @@ FA71996F1D94EC5A00FBC99B /* Tests */, FA2D7AA01BDD849E009EA54C /* Frameworks */, FACAF1A61BD9FC6000E539DC /* Products */, + F1B1238D786BBB1C50CB8803 /* Pods */, ); sourceTree = ""; }; @@ -355,10 +387,12 @@ isa = PBXNativeTarget; buildConfigurationList = FA143CE01BDA3E880041A82B /* Build configuration list for PBXNativeTarget "AerialApp" */; buildPhases = ( + B326E4EB5930FD08EEA5D212 /* [CP] Check Pods Manifest.lock */, FA74B8481D94DCE0004FE056 /* Run Script - Swiftlint */, FA143CD21BDA3E880041A82B /* Sources */, FA143CD31BDA3E880041A82B /* Frameworks */, FA143CD41BDA3E880041A82B /* Resources */, + 6F6791269A5D5F62796AE75A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -373,6 +407,7 @@ isa = PBXNativeTarget; buildConfigurationList = FA7199751D94EC5A00FBC99B /* Build configuration list for PBXNativeTarget "Aerial Tests" */; buildPhases = ( + 3B10443BE2EC7A75E1F031DF /* [CP] Check Pods Manifest.lock */, FA71996A1D94EC5A00FBC99B /* Sources */, FA71996B1D94EC5A00FBC99B /* Frameworks */, FA71996C1D94EC5A00FBC99B /* Resources */, @@ -391,11 +426,13 @@ isa = PBXNativeTarget; buildConfigurationList = FACAF1AF1BD9FC6000E539DC /* Build configuration list for PBXNativeTarget "Aerial" */; buildPhases = ( + 910394578D35CCEBAEE0D456 /* [CP] Check Pods Manifest.lock */, 7E9B50FB2187D302002895ED /* Run Script - Swiftlint */, FACAF1A01BD9FC6000E539DC /* Sources */, FACAF1A11BD9FC6000E539DC /* Frameworks */, FACAF1A21BD9FC6000E539DC /* Headers */, FACAF1A31BD9FC6000E539DC /* Resources */, + 030E8CFC21C2CC13008272B9 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -418,7 +455,9 @@ TargetAttributes = { FA143CD51BDA3E880041A82B = { CreatedOnToolsVersion = 7.0; + DevelopmentTeam = 3L54M5L5KK; LastSwiftMigration = 1000; + ProvisioningStyle = Automatic; }; FA71996D1D94EC5A00FBC99B = { CreatedOnToolsVersion = 8.0; @@ -428,7 +467,9 @@ }; FACAF1A41BD9FC6000E539DC = { CreatedOnToolsVersion = 7.0; + DevelopmentTeam = 3L54M5L5KK; LastSwiftMigration = 1000; + ProvisioningStyle = Automatic; }; }; }; @@ -499,6 +540,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 030E8CFC21C2CC13008272B9 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Aerial/Pods-Aerial-frameworks.sh", + "${PODS_ROOT}/Sparkle/Sparkle.framework", + "${PODS_ROOT}/Sparkle/Sparkle.framework.dSYM", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + ); + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sparkle.framework", + "${DWARF_DSYM_FOLDER_PATH}/Sparkle.framework.dSYM", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${SRCROOT}/Pods/Target Support Files/Pods-Aerial/Pods-Aerial-frameworks.sh\"\n"; + }; + 3B10443BE2EC7A75E1F031DF /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Aerial Tests-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; + }; + 6F6791269A5D5F62796AE75A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-AerialApp/Pods-AerialApp-frameworks.sh", + "${PODS_ROOT}/Sparkle/Sparkle.framework", + "${PODS_ROOT}/Sparkle/Sparkle.framework.dSYM", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sparkle.framework", + "${DWARF_DSYM_FOLDER_PATH}/Sparkle.framework.dSYM", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AerialApp/Pods-AerialApp-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 7E9B50FB2187D302002895ED /* Run Script - Swiftlint */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -511,7 +613,43 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if which swiftlint >/dev/null; then\n if [ -z \"$CI\" ]; then\n make --directory=${SRCROOT} xcode-lint\n fi\nelse\n echo \"warning: SwiftLint not installed, install using `brew install swiftlint`\"\nfi"; + shellScript = "if which swiftlint >/dev/null; then\n if [ -z \"$CI\" ]; then\n make --directory=${SRCROOT} xcode-lint\n fi\nelse\n echo \"warning: SwiftLint not installed, install using `brew install swiftlint`\"\nfi\n"; + }; + 910394578D35CCEBAEE0D456 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Aerial-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; + }; + B326E4EB5930FD08EEA5D212 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AerialApp-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; }; FA74B8481D94DCE0004FE056 /* Run Script - Swiftlint */ = { isa = PBXShellScriptBuildPhase; @@ -618,16 +756,20 @@ /* Begin XCBuildConfiguration section */ FA143CE11BDA3E880041A82B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0C8FC8BFBDB12119C417B384 /* Pods-AerialApp.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 3L54M5L5KK; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = Aerial/App/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_BUNDLE_IDENTIFIER = "com.johncoates.Aerial-Test"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Aerial/Source/Models/Time/Aerial-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; @@ -636,16 +778,20 @@ }; FA143CE21BDA3E880041A82B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E783122BE370B662D207D98F /* Pods-AerialApp.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = ""; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 3L54M5L5KK; ENABLE_TESTABILITY = YES; INFOPLIST_FILE = Aerial/App/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_BUNDLE_IDENTIFIER = "com.johncoates.Aerial-Test"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OBJC_BRIDGING_HEADER = "Aerial/Source/Models/Time/Aerial-Bridging-Header.h"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; @@ -654,6 +800,7 @@ }; FA7199761D94EC5A00FBC99B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 6F861C9769B40A0B8FBDC0E6 /* Pods-Aerial Tests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; @@ -675,6 +822,7 @@ }; FA7199771D94EC5A00FBC99B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C2789CB51C64430F9CDEABF1 /* Pods-Aerial Tests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; @@ -795,16 +943,22 @@ }; FACAF1B01BD9FC6000E539DC /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 16D0EAF0612223CDB1E938A3 /* Pods-Aerial.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 3L54M5L5KK; INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(HOME)/Library/Screen Savers"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.johncoates.Aerial; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Aerial/Source/Models/Time/Aerial-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; WRAPPER_EXTENSION = saver; @@ -813,16 +967,22 @@ }; FACAF1B11BD9FC6000E539DC /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 431164E9C62B702ED573DE22 /* Pods-Aerial.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 3L54M5L5KK; INFOPLIST_FILE = "$(SRCROOT)/Resources/Info.plist"; INSTALL_PATH = "$(HOME)/Library/Screen Savers"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.johncoates.Aerial; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Aerial/Source/Models/Time/Aerial-Bridging-Header.h"; WRAPPER_EXTENSION = saver; }; diff --git a/Aerial/App/Resources/Info.plist b/Aerial/App/Resources/Info.plist index cd19c776..182b3f9d 100644 --- a/Aerial/App/Resources/Info.plist +++ b/Aerial/App/Resources/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.4.6beta5 + 1.4.7beta2 CFBundleSignature ???? CFBundleVersion @@ -41,5 +41,9 @@ MainMenu NSPrincipalClass NSApplication + SUFeedURL + https://raw.githubusercontent.com/JohnCoates/Aerial/master/appcast.xml + SUPublicEDKey + fbiQGEFq55xl4bjwj2/SpIO4JMsKmEyhHEWlMMueyDY= diff --git a/Aerial/Source/Controllers/PreferencesWindowController.swift b/Aerial/Source/Controllers/PreferencesWindowController.swift index 9b0eebc0..fc33f78f 100644 --- a/Aerial/Source/Controllers/PreferencesWindowController.swift +++ b/Aerial/Source/Controllers/PreferencesWindowController.swift @@ -12,6 +12,7 @@ import AVFoundation import ScreenSaver import VideoToolbox import CoreLocation +import Sparkle final class TimeOfDay { let title: String @@ -187,6 +188,11 @@ final class PreferencesWindowController: NSWindowController, NSOutlineViewDataSo @IBOutlet var moveOldVideosButton: NSButton! @IBOutlet var trashOldVideosButton: NSButton! + + @IBOutlet var automaticallyCheckForUpdatesCheckbox: NSButton! + + @IBOutlet var lastCheckedSparkle: NSTextField! + var player: AVPlayer = AVPlayer() var videos: [AerialVideo]? @@ -205,6 +211,7 @@ final class PreferencesWindowController: NSWindowController, NSOutlineViewDataSo var savedBrightness: Float? var locationManager: CLLocationManager? + var sparkleUpdater: SUUpdater? public var appMode: Bool = false @@ -240,6 +247,7 @@ final class PreferencesWindowController: NSWindowController, NSOutlineViewDataSo // swiftlint:disable:next cyclomatic_complexity override func awakeFromNib() { super.awakeFromNib() + sparkleUpdater = SUUpdater.init(for: Bundle(for: PreferencesWindowController.self)) // tmp let tm = TimeManagement.sharedInstance @@ -534,6 +542,16 @@ final class PreferencesWindowController: NSWindowController, NSOutlineViewDataSo newVideosModePopup.selectItem(at: preferences.newVideosMode!) lastCheckedVideosLabel.stringValue = "Last checked on " + preferences.lastVideoCheck! + + // Format date + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + let sparkleDate = dateFormatter.string(from: sparkleUpdater!.lastUpdateCheckDate) + lastCheckedSparkle.stringValue = "Last checked on " + sparkleDate + if sparkleUpdater!.automaticallyChecksForUpdates { + automaticallyCheckForUpdatesCheckbox.state = .on + } + colorizeProjectPageLinks() if let cacheDirectory = VideoCache.cacheDirectory { @@ -1308,6 +1326,13 @@ final class PreferencesWindowController: NSWindowController, NSOutlineViewDataSo debugLog("UI dimInMinutes \(sender.stringValue)") } + // MARK: - Update panel + @IBAction func automaticallyCheckForUpdatesChange(_ button: NSButton) { + let onState = button.state == .on + sparkleUpdater!.automaticallyChecksForUpdates = onState + debugLog("UI automaticallyCheckForUpdatesChange: \(onState)") + } + // MARK: - Advanced panel @IBAction func logButtonClick(_ sender: NSButton) { @@ -1398,6 +1423,11 @@ final class PreferencesWindowController: NSWindowController, NSOutlineViewDataSo } + @IBAction func checkForUpdatesButton(_ sender: Any) { + debugLog("check for updates") + sparkleUpdater!.checkForUpdates(self) + } + @IBAction func trashOldVideosClick(_ sender: Any) { ManifestLoader.instance.trashOldVideos() diff --git a/Aerial/Source/Models/AerialVideo.swift b/Aerial/Source/Models/AerialVideo.swift index 064f4cde..d779b040 100644 --- a/Aerial/Source/Models/AerialVideo.swift +++ b/Aerial/Source/Models/AerialVideo.swift @@ -33,6 +33,9 @@ private let spaceVideos = [ "7719B48A-2005-4011-9280-2F64EEC6FD91", "63C042F0-90EF-4A95-B7CC-CC9A64BF8421", "B1B5DDC5-73C8-4920-8133-BACCE38A08DE", + "03EC0F5E-CCA8-4E0A-9FEC-5BD1CE151182", // 25/01 Antartica Aurora + "737E9E24-49BE-4104-9B72-F352DE1AD2BF", // North America Aurora + "E556BBC5-D0A0-4DB1-AC77-BC76E4A526F4", // Sahara and Italy ] private let timeInformation = [ @@ -52,6 +55,7 @@ private let timeInformation = [ "009BA758-7060-4479-8EE8-FB9B40C8FB97": "night", // Korean and Japan Night (v18) "78911B7E-3C69-47AD-B635-9C2486F6301D": "day", // New Zealand (sunrise...) "D60B4DDA-69EB-4841-9690-E8BAE7BC4F80": "day", // Sahara and Italy + "E556BBC5-D0A0-4DB1-AC77-BC76E4A526F4": "day", // Sahara and Italy "7719B48A-2005-4011-9280-2F64EEC6FD91": "day", // Southern California to Baja "63C042F0-90EF-4A95-B7CC-CC9A64BF8421": "day", // Western Africa to the Alps (sunset...) "BAF76353-3475-4855-B7E1-CE96CC9BC3A7": "night", // Dubai @@ -72,6 +76,8 @@ private let timeInformation = [ "F5804DD6-5963-40DA-9FA0-39C0C6E6DEF9": "night", // Downtown (LA) "640DFB00-FBB9-45DA-9444-9F663859F4BC": "night", // Lower Manhattan "44166C39-8566-4ECA-BD16-43159429B52F": "night", // Seventh Avenue + "03EC0F5E-CCA8-4E0A-9FEC-5BD1CE151182": "night", // Antartica Aurora + "737E9E24-49BE-4104-9B72-F352DE1AD2BF": "night", // North America Aurora ] final class AerialVideo: CustomStringConvertible, Equatable { diff --git a/Aerial/Source/Models/Cache/VideoCache.swift b/Aerial/Source/Models/Cache/VideoCache.swift index 8178136b..27452c0a 100644 --- a/Aerial/Source/Models/Cache/VideoCache.swift +++ b/Aerial/Source/Models/Cache/VideoCache.swift @@ -29,9 +29,16 @@ final class VideoCache { let preferences = Preferences.sharedInstance if let customCacheDirectory = preferences.customCacheDirectory { - // We may have overriden the cache directory - cacheDirectory = customCacheDirectory - } else { + // We may have overriden the cache directory, but it may no longer exist ! + if FileManager.default.fileExists(atPath: customCacheDirectory as String) { + cacheDirectory = customCacheDirectory + } else { + // If it doesn't we need to reset that preference + preferences.customCacheDirectory = nil + } + } + + if cacheDirectory == nil { let localCachePaths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .localDomainMask, true) diff --git a/Aerial/Source/Models/ErrorLog.swift b/Aerial/Source/Models/ErrorLog.swift index 7fe38f58..c2aa56e7 100644 --- a/Aerial/Source/Models/ErrorLog.swift +++ b/Aerial/Source/Models/ErrorLog.swift @@ -73,6 +73,7 @@ func Log(level: ErrorLevel, message: String) { } // We may log to disk, asyncly + // Comment the firt if to always log to disk if preferences.logToDisk { DispatchQueue.main.async { let dateFormatter = DateFormatter() @@ -80,6 +81,10 @@ func Log(level: ErrorLevel, message: String) { dateFormatter.timeStyle = .medium let string = dateFormatter.string(from: Date()) + " : " + message + "\n" //let string = message + "\n" + + // tmpOverride + //if var cacheFileUrl = try? FileManager.default.url(for: .desktopDirectory, in: .userDomainMask, appropriateFor: nil, create: false) { + if let cacheDirectory = VideoCache.cacheDirectory { var cacheFileUrl = URL(fileURLWithPath: cacheDirectory as String) cacheFileUrl.appendPathComponent("AerialLog.txt") @@ -115,6 +120,7 @@ func debugLog(_ message: String) { print("\(message)\n") #endif + // Comment the condition to always log debug mode let preferences = Preferences.sharedInstance if preferences.debugMode { Log(level: .debug, message: message) diff --git a/Aerial/Source/Models/ManifestLoader.swift b/Aerial/Source/Models/ManifestLoader.swift index 205e1a22..68f382fe 100644 --- a/Aerial/Source/Models/ManifestLoader.swift +++ b/Aerial/Source/Models/ManifestLoader.swift @@ -37,7 +37,8 @@ class ManifestLoader { "b9-1.mov", // Dupe of b2-2 (Hawaii, day) "b9-2.mov", // Dupe of b3-1 (London, night) "comp_LA_A005_C009_v05_t9_6M.mov", // Low quality version of Los Angeles day 687B36CB-BA5D-4434-BA99-2F2B8B6EC163 - "comp_LA_A009_C009_t9_6M_tag0.mov", ] // Low quality version of Los Angeles night 89B1643B-06DD-4DEC-B1B0-774493B0F7B7 + "comp_LA_A009_C009_t9_6M_tag0.mov", + ] // Low quality version of Los Angeles night 89B1643B-06DD-4DEC-B1B0-774493B0F7B7 // This is used for videos where URLs should be merged with different ID // This is used to dedupe old versions of videos @@ -56,6 +57,8 @@ class ManifestLoader { "802866E6-4AAF-4A69-96EA-C582651391F1": "3FFA2A97-7D28-49EA-AA39-5BC9051B2745", // Marina 2 "D34A7B19-EC33-4300-B4ED-0C8BC494C035": "3FFA2A97-7D28-49EA-AA39-5BC9051B2745", // Marina 2 "02EA5DBE-3A67-4DFA-8528-12901DFD6CC1": "00BA71CD-2C54-415A-A68A-8358E677D750", // Downtown + "AC9C09DD-1D97-4013-A09F-B0F5259E64C3": "876D51F4-3D78-4221-8AD2-F9E78C0FD9B9", // Sheikh Zayed Road (day) + "DFA399FA-620A-4517-94D6-BF78BF8C5E5A": "876D51F4-3D78-4221-8AD2-F9E78C0FD9B9", // Sheikh Zayed Road (day) "D388F00A-5A32-4431-A95C-38BF7FF7268D": "B8F204CE-6024-49AB-85F9-7CA2F6DCD226", // Nuusuaq Peninsula "E4ED0B22-EB81-4D4F-A29E-7E1EA6B6D980": "B8F204CE-6024-49AB-85F9-7CA2F6DCD226", // Nuusuaq Peninsula "30047FDA-3AE3-4E74-9575-3520AD77865B": "2F52E34C-39D4-4AB1-9025-8F7141FAA720", // Ilulissat Icefjord day @@ -90,6 +93,7 @@ class ManifestLoader { "b1-4": "3E94AE98-EAF2-4B09-96E3-452F46BC114E", // Bay bridge night "b9-3": "DE851E6D-C2BE-4D9F-AB54-0F9CE994DC51", // Bay and Golden Bridge "b7-3": "29BDF297-EB43-403A-8719-A78DA11A2948", // Fisherman's Wharf + "b3-3": "85CE77BF-3413-4A7B-9B0F-732E96229A73", // Embarcadero, Market Street ] // Extra info to be merged for a given ID, as of right now only one known video diff --git a/Aerial/Source/Views/AerialView.swift b/Aerial/Source/Views/AerialView.swift index 87449d66..1c02ec1f 100644 --- a/Aerial/Source/Views/AerialView.swift +++ b/Aerial/Source/Views/AerialView.swift @@ -10,6 +10,7 @@ import Foundation import ScreenSaver import AVFoundation import AVKit +import Sparkle @objc(AerialView) // swiftlint:disable:next type_body_length @@ -177,6 +178,9 @@ final class AerialView: ScreenSaverView { // swiftlint:disable:next cyclomatic_complexity func setup() { + // Initialize Sparkle updater + _ = SUUpdater.init(for: Bundle(for: AerialView.self)) + debugLog("\(self.description) AerialView setup init") let preferences = Preferences.sharedInstance let timeManagement = TimeManagement.sharedInstance diff --git a/Podfile b/Podfile new file mode 100644 index 00000000..43a9dcea --- /dev/null +++ b/Podfile @@ -0,0 +1,24 @@ +# Uncomment the next line to define a global platform for your project +platform :macos, '10.9' + +target 'Aerial' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + + # Pods for Aerial + pod 'Sparkle' + + target 'Aerial Tests' do + inherit! :search_paths + # Pods for testing + end + +end + +target 'AerialApp' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + + # Pods for AerialApp + pod 'Sparkle' +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 00000000..876bcdb7 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - Sparkle (1.21.0) + +DEPENDENCIES: + - Sparkle + +SPEC REPOS: + https://github.com/CocoaPods/Specs.git: + - Sparkle + +SPEC CHECKSUMS: + Sparkle: 24f10673813bf7c32d73ffa8a775590adefc40df + +PODFILE CHECKSUM: f168964208636ac1fde61a950654def91bc7ada9 + +COCOAPODS: 1.5.0 diff --git a/Resources/Community/en.json b/Resources/Community/en.json index 1bc3be16..5b45abf3 100644 --- a/Resources/Community/en.json +++ b/Resources/Community/en.json @@ -39,7 +39,7 @@ "name" : "Great Wall 3" }, { - "id" : "AC9C09DD-1D97-4013-A09F-B0F5259E64C3", + "id" : "876D51F4-3D78-4221-8AD2-F9E78C0FD9B9", "name" : "Sheikh Zayed Road" }, { @@ -312,7 +312,7 @@ } }, { - "id" : "b3-3", + "id" : "85CE77BF-3413-4A7B-9B0F-732E96229A73", "name" : "Embarcadero, Market Street", "pointsOfInterest" : { "0" : "Heading southwest over San Francisco Bay to the San Francisco Ferry Building", @@ -373,6 +373,10 @@ "10" : "Passing the Transamerica Pyramid", "50" : "Former Bank of America headquarters blotting out the sun" } + }, + { + "id" : "4AD99907-9E76-408D-A7FC-8429FF014201", + "name" : "Bay and Embarcadero" } ] } diff --git a/Resources/Community/missingvideos.json b/Resources/Community/missingvideos.json index 7529007d..c169b702 100644 --- a/Resources/Community/missingvideos.json +++ b/Resources/Community/missingvideos.json @@ -1,26 +1,5 @@ { "assets" : [ - { - "pointsOfInterest" : { - "285" : "A009_C001_10181A_285", - "245" : "A009_C001_10181A_245", - "310" : "A009_C001_10181A_310", - "0" : "A009_C001_10181A_0", - "30" : "A009_C001_10181A_30", - "195" : "A009_C001_10181A_195", - "110" : "A009_C001_10181A_110", - "230" : "A009_C001_10181A_230", - "155" : "A009_C001_10181A_155", - "210" : "A009_C001_10181A_210" - }, - "url-1080-H264" : "https:\/\/sylvan.apple.com\/Videos\/comp_A009_C001_010181A_v09_SDR_PS_FINAL_20180725_SDR_2K_AVC.mov", - "accessibilityLabel" : "Sahara and Italy", - "id" : "D60B4DDA-69EB-4841-9690-E8BAE7BC4F80", - "url-1080-HDR" : "https:\/\/sylvan.apple.com\/Aerials\/2x\/Videos\/comp_A009_C001_010181A_v09_HDR_PS_FINAL_20180725_HDR_2K_HEVC.mov", - "url-1080-SDR" : "https:\/\/sylvan.apple.com\/Aerials\/2x\/Videos\/comp_A009_C001_010181A_v09_SDR_PS_FINAL_20180725_SDR_2K_HEVC.mov", - "url-4K-SDR" : "https:\/\/sylvan.apple.com\/Aerials\/2x\/Videos\/comp_A009_C001_010181A_v09_SDR_PS_FINAL_20180725_SDR_4K_HEVC.mov", - "url-4K-HDR" : "https:\/\/sylvan.apple.com\/Aerials\/2x\/Videos\/comp_A009_C001_010181A_v09_HDR_PS_FINAL_20180725_HDR_4K_HEVC.mov" - }, { "pointsOfInterest" : { "0" : "HK_H004_C001_0" diff --git a/Resources/Info.plist b/Resources/Info.plist index 05c83be7..657d0463 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.4.6beta7 + 1.4.7beta2 CFBundleSignature ???? CFBundleVersion - 1.4.6beta7 + 1.4.7beta2 LSApplicationCategoryType LSMinimumSystemVersion @@ -35,5 +35,9 @@ Aerial uses location services to calculate Sunset and Sunrise times from your position NSPrincipalClass AerialView + SUFeedURL + https://raw.githubusercontent.com/JohnCoates/Aerial/master/appcast.xml + SUPublicEDKey + fbiQGEFq55xl4bjwj2/SpIO4JMsKmEyhHEWlMMueyDY= diff --git a/Resources/PreferencesWindow.xib b/Resources/PreferencesWindow.xib index 13f7e6d0..3f5f8b1f 100644 --- a/Resources/PreferencesWindow.xib +++ b/Resources/PreferencesWindow.xib @@ -10,6 +10,7 @@ + @@ -59,6 +60,7 @@ + @@ -447,7 +449,7 @@ is disabled - + @@ -1443,8 +1445,16 @@ Shift, but macOS 10.12.4 or above and a compatible Mac are required) + + + + + + + + - + @@ -1461,8 +1471,28 @@ Shift, but macOS 10.12.4 or above and a compatible Mac are required) + + + + + + + + + + - + @@ -1470,26 +1500,78 @@ Shift, but macOS 10.12.4 or above and a compatible Mac are required) - - + + - + - + + + + + + + + + + @@ -1498,6 +1580,48 @@ Shift, but macOS 10.12.4 or above and a compatible Mac are required) + + + + + + + + + + + + + + + Apple periodically updates its JSON, to either add new videos, or add new versions of existing videos. This will result, over time, in duplicate videos on your disk. You can use the settings below to put aside the old versions of videos or reclaim disk space. + + + + + + + + + + + + + + + + +