├── .gitignore ├── BreatheReplica WatchKit App ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── Base.lproj │ └── Interface.storyboard └── Info.plist ├── BreatheReplica WatchKit Extension ├── Assets.xcassets │ ├── Complication.complicationset │ │ ├── Circular.imageset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Extra Large.imageset │ │ │ └── Contents.json │ │ ├── Graphic Bezel.imageset │ │ │ └── Contents.json │ │ ├── Graphic Circular.imageset │ │ │ └── Contents.json │ │ ├── Graphic Corner.imageset │ │ │ └── Contents.json │ │ ├── Graphic Large Rectangular.imageset │ │ │ └── Contents.json │ │ ├── Modular.imageset │ │ │ └── Contents.json │ │ └── Utilitarian.imageset │ │ │ └── Contents.json │ └── Contents.json ├── ContentView.swift ├── ExtensionDelegate.swift ├── HostingController.swift ├── Info.plist └── Preview Content │ └── Preview Assets.xcassets │ └── Contents.json ├── BreatheReplica.xcodeproj └── project.pbxproj ├── LICENSE ├── README.md └── demo.gif /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | __MACOSX 3 | *.pbxuser 4 | !default.pbxuser 5 | *.mode1v3 6 | !default.mode1v3 7 | *.mode2v3 8 | !default.mode2v3 9 | *.perspectivev3 10 | !default.perspectivev3 11 | *.xcworkspace 12 | !default.xcworkspace 13 | xcuserdata 14 | profile 15 | *.moved-aside 16 | DerivedData 17 | .idea/ 18 | Crashlytics.sh 19 | generatechangelog.sh 20 | Pods/ 21 | Carthage 22 | Provisioning 23 | Crashlytics.sh -------------------------------------------------------------------------------- /BreatheReplica WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "role" : "notificationCenter", 6 | "scale" : "2x", 7 | "size" : "24x24", 8 | "subtype" : "38mm" 9 | }, 10 | { 11 | "idiom" : "watch", 12 | "role" : "notificationCenter", 13 | "scale" : "2x", 14 | "size" : "27.5x27.5", 15 | "subtype" : "42mm" 16 | }, 17 | { 18 | "idiom" : "watch", 19 | "role" : "companionSettings", 20 | "scale" : "2x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "watch", 25 | "role" : "companionSettings", 26 | "scale" : "3x", 27 | "size" : "29x29" 28 | }, 29 | { 30 | "idiom" : "watch", 31 | "role" : "appLauncher", 32 | "scale" : "2x", 33 | "size" : "40x40", 34 | "subtype" : "38mm" 35 | }, 36 | { 37 | "idiom" : "watch", 38 | "role" : "appLauncher", 39 | "scale" : "2x", 40 | "size" : "44x44", 41 | "subtype" : "40mm" 42 | }, 43 | { 44 | "idiom" : "watch", 45 | "role" : "appLauncher", 46 | "scale" : "2x", 47 | "size" : "50x50", 48 | "subtype" : "44mm" 49 | }, 50 | { 51 | "idiom" : "watch", 52 | "role" : "quickLook", 53 | "scale" : "2x", 54 | "size" : "86x86", 55 | "subtype" : "38mm" 56 | }, 57 | { 58 | "idiom" : "watch", 59 | "role" : "quickLook", 60 | "scale" : "2x", 61 | "size" : "98x98", 62 | "subtype" : "42mm" 63 | }, 64 | { 65 | "idiom" : "watch", 66 | "role" : "quickLook", 67 | "scale" : "2x", 68 | "size" : "108x108", 69 | "subtype" : "44mm" 70 | }, 71 | { 72 | "idiom" : "watch-marketing", 73 | "scale" : "1x", 74 | "size" : "1024x1024" 75 | } 76 | ], 77 | "info" : { 78 | "author" : "xcode", 79 | "version" : 1 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit App/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit App/Base.lproj/Interface.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit App/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | BreatheReplica WatchKit App 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | UISupportedInterfaceOrientations 24 | 25 | UIInterfaceOrientationPortrait 26 | UIInterfaceOrientationPortraitUpsideDown 27 | 28 | WKWatchKitApp 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets" : [ 3 | { 4 | "filename" : "Circular.imageset", 5 | "idiom" : "watch", 6 | "role" : "circular" 7 | }, 8 | { 9 | "filename" : "Extra Large.imageset", 10 | "idiom" : "watch", 11 | "role" : "extra-large" 12 | }, 13 | { 14 | "filename" : "Graphic Bezel.imageset", 15 | "idiom" : "watch", 16 | "role" : "graphic-bezel" 17 | }, 18 | { 19 | "filename" : "Graphic Circular.imageset", 20 | "idiom" : "watch", 21 | "role" : "graphic-circular" 22 | }, 23 | { 24 | "filename" : "Graphic Corner.imageset", 25 | "idiom" : "watch", 26 | "role" : "graphic-corner" 27 | }, 28 | { 29 | "filename" : "Graphic Large Rectangular.imageset", 30 | "idiom" : "watch", 31 | "role" : "graphic-large-rectangular" 32 | }, 33 | { 34 | "filename" : "Modular.imageset", 35 | "idiom" : "watch", 36 | "role" : "modular" 37 | }, 38 | { 39 | "filename" : "Utilitarian.imageset", 40 | "idiom" : "watch", 41 | "role" : "utilitarian" 42 | } 43 | ], 44 | "info" : { 45 | "author" : "xcode", 46 | "version" : 1 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "watch", 5 | "scale" : "2x", 6 | "screen-width" : "<=145" 7 | }, 8 | { 9 | "idiom" : "watch", 10 | "scale" : "2x", 11 | "screen-width" : ">161" 12 | }, 13 | { 14 | "idiom" : "watch", 15 | "scale" : "2x", 16 | "screen-width" : ">145" 17 | }, 18 | { 19 | "idiom" : "watch", 20 | "scale" : "2x", 21 | "screen-width" : ">183" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // BreatheReplica WatchKit Extension 4 | // 5 | // Created by Guilherme Rambo on 02/03/20. 6 | // Copyright © 2020 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | extension Color { 12 | static let petalColor1 = Color(red: 125/255, green: 218/255, blue: 160/255) 13 | static let petalColor2 = Color(red: 84/255, green: 161/255, blue: 176/255) 14 | } 15 | 16 | extension Animation { 17 | static let breathe = Animation.easeInOut(duration: 5.4).repeatForever(autoreverses: true) 18 | } 19 | 20 | struct PetalView: View { 21 | let width: CGFloat = 93 22 | let geo: GeometryProxy 23 | let index: Double 24 | 25 | @State private var isContracted = true 26 | 27 | var body: some View { 28 | Circle() 29 | .fill(LinearGradient(gradient: Gradient(colors: [.petalColor1, .petalColor2]), startPoint: .top, endPoint: .bottom)) 30 | .frame(width: width, height: width) 31 | .position(x: isContracted ? geo.size.width/2 : width/2, y: isContracted ? geo.size.width/2 : width/2) 32 | .opacity(0.7) 33 | .blendMode(.plusLighter) 34 | .onAppear { 35 | withAnimation(.breathe, { 36 | self.isContracted.toggle() 37 | }) 38 | } 39 | } 40 | } 41 | 42 | struct FlowerDimensionView: View { 43 | let petalCount: Int 44 | 45 | @State var isContracted = true 46 | 47 | var body: some View { 48 | Group { 49 | GeometryReader { geo in 50 | ForEach(0..) { 27 | // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one. 28 | for task in backgroundTasks { 29 | // Use a switch statement to check the task type 30 | switch task { 31 | case let backgroundTask as WKApplicationRefreshBackgroundTask: 32 | // Be sure to complete the background task once you’re done. 33 | backgroundTask.setTaskCompletedWithSnapshot(false) 34 | case let snapshotTask as WKSnapshotRefreshBackgroundTask: 35 | // Snapshot tasks have a unique completion call, make sure to set your expiration date 36 | snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil) 37 | case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask: 38 | // Be sure to complete the connectivity task once you’re done. 39 | connectivityTask.setTaskCompletedWithSnapshot(false) 40 | case let urlSessionTask as WKURLSessionRefreshBackgroundTask: 41 | // Be sure to complete the URL session task once you’re done. 42 | urlSessionTask.setTaskCompletedWithSnapshot(false) 43 | case let relevantShortcutTask as WKRelevantShortcutRefreshBackgroundTask: 44 | // Be sure to complete the relevant-shortcut task once you're done. 45 | relevantShortcutTask.setTaskCompletedWithSnapshot(false) 46 | case let intentDidRunTask as WKIntentDidRunRefreshBackgroundTask: 47 | // Be sure to complete the intent-did-run task once you're done. 48 | intentDidRunTask.setTaskCompletedWithSnapshot(false) 49 | default: 50 | // make sure to complete unhandled task types 51 | task.setTaskCompletedWithSnapshot(false) 52 | } 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/HostingController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HostingController.swift 3 | // BreatheReplica WatchKit Extension 4 | // 5 | // Created by Guilherme Rambo on 02/03/20. 6 | // Copyright © 2020 Guilherme Rambo. All rights reserved. 7 | // 8 | 9 | import WatchKit 10 | import Foundation 11 | import SwiftUI 12 | 13 | class HostingController: WKHostingController { 14 | override var body: ContentView { 15 | return ContentView() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | BreatheReplica WatchKit Extension 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | NSExtension 24 | 25 | NSExtensionAttributes 26 | 27 | WKAppBundleIdentifier 28 | codes.rambo.BreatheReplica.watchkitapp 29 | 30 | NSExtensionPointIdentifier 31 | com.apple.watchkit 32 | 33 | WKExtensionDelegateClassName 34 | $(PRODUCT_MODULE_NAME).ExtensionDelegate 35 | WKWatchOnly 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /BreatheReplica WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /BreatheReplica.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | DDD3F154240D604C0036B248 /* BreatheReplica WatchKit App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = DDD3F153240D604C0036B248 /* BreatheReplica WatchKit App.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 11 | DDD3F15A240D604C0036B248 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDD3F158240D604C0036B248 /* Interface.storyboard */; }; 12 | DDD3F15C240D604D0036B248 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDD3F15B240D604D0036B248 /* Assets.xcassets */; }; 13 | DDD3F163240D604D0036B248 /* BreatheReplica WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = DDD3F162240D604D0036B248 /* BreatheReplica WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 14 | DDD3F168240D604D0036B248 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD3F167240D604D0036B248 /* ContentView.swift */; }; 15 | DDD3F16A240D604D0036B248 /* HostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD3F169240D604D0036B248 /* HostingController.swift */; }; 16 | DDD3F16C240D604D0036B248 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD3F16B240D604D0036B248 /* ExtensionDelegate.swift */; }; 17 | DDD3F16E240D604E0036B248 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDD3F16D240D604E0036B248 /* Assets.xcassets */; }; 18 | DDD3F171240D604E0036B248 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDD3F170240D604E0036B248 /* Preview Assets.xcassets */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | DDD3F155240D604C0036B248 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = DDD3F149240D604C0036B248 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = DDD3F152240D604C0036B248; 27 | remoteInfo = "BreatheReplica WatchKit App"; 28 | }; 29 | DDD3F164240D604D0036B248 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = DDD3F149240D604C0036B248 /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = DDD3F161240D604D0036B248; 34 | remoteInfo = "BreatheReplica WatchKit Extension"; 35 | }; 36 | /* End PBXContainerItemProxy section */ 37 | 38 | /* Begin PBXCopyFilesBuildPhase section */ 39 | DDD3F178240D604E0036B248 /* Embed App Extensions */ = { 40 | isa = PBXCopyFilesBuildPhase; 41 | buildActionMask = 2147483647; 42 | dstPath = ""; 43 | dstSubfolderSpec = 13; 44 | files = ( 45 | DDD3F163240D604D0036B248 /* BreatheReplica WatchKit Extension.appex in Embed App Extensions */, 46 | ); 47 | name = "Embed App Extensions"; 48 | runOnlyForDeploymentPostprocessing = 0; 49 | }; 50 | DDD3F17C240D604E0036B248 /* Embed Watch Content */ = { 51 | isa = PBXCopyFilesBuildPhase; 52 | buildActionMask = 2147483647; 53 | dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; 54 | dstSubfolderSpec = 16; 55 | files = ( 56 | DDD3F154240D604C0036B248 /* BreatheReplica WatchKit App.app in Embed Watch Content */, 57 | ); 58 | name = "Embed Watch Content"; 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXCopyFilesBuildPhase section */ 62 | 63 | /* Begin PBXFileReference section */ 64 | DDD3F14F240D604C0036B248 /* BreatheReplica.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BreatheReplica.app; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | DDD3F153240D604C0036B248 /* BreatheReplica WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "BreatheReplica WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | DDD3F159240D604C0036B248 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; 67 | DDD3F15B240D604D0036B248 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 68 | DDD3F15D240D604D0036B248 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 69 | DDD3F162240D604D0036B248 /* BreatheReplica WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "BreatheReplica WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | DDD3F167240D604D0036B248 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 71 | DDD3F169240D604D0036B248 /* HostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostingController.swift; sourceTree = ""; }; 72 | DDD3F16B240D604D0036B248 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; 73 | DDD3F16D240D604E0036B248 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 74 | DDD3F170240D604E0036B248 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 75 | DDD3F172240D604E0036B248 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 76 | /* End PBXFileReference section */ 77 | 78 | /* Begin PBXFrameworksBuildPhase section */ 79 | DDD3F15F240D604D0036B248 /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | /* End PBXFrameworksBuildPhase section */ 87 | 88 | /* Begin PBXGroup section */ 89 | DDD3F148240D604C0036B248 = { 90 | isa = PBXGroup; 91 | children = ( 92 | DDD3F157240D604C0036B248 /* BreatheReplica WatchKit App */, 93 | DDD3F166240D604D0036B248 /* BreatheReplica WatchKit Extension */, 94 | DDD3F150240D604C0036B248 /* Products */, 95 | ); 96 | sourceTree = ""; 97 | }; 98 | DDD3F150240D604C0036B248 /* Products */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | DDD3F14F240D604C0036B248 /* BreatheReplica.app */, 102 | DDD3F153240D604C0036B248 /* BreatheReplica WatchKit App.app */, 103 | DDD3F162240D604D0036B248 /* BreatheReplica WatchKit Extension.appex */, 104 | ); 105 | name = Products; 106 | sourceTree = ""; 107 | }; 108 | DDD3F157240D604C0036B248 /* BreatheReplica WatchKit App */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | DDD3F158240D604C0036B248 /* Interface.storyboard */, 112 | DDD3F15B240D604D0036B248 /* Assets.xcassets */, 113 | DDD3F15D240D604D0036B248 /* Info.plist */, 114 | ); 115 | path = "BreatheReplica WatchKit App"; 116 | sourceTree = ""; 117 | }; 118 | DDD3F166240D604D0036B248 /* BreatheReplica WatchKit Extension */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | DDD3F167240D604D0036B248 /* ContentView.swift */, 122 | DDD3F169240D604D0036B248 /* HostingController.swift */, 123 | DDD3F16B240D604D0036B248 /* ExtensionDelegate.swift */, 124 | DDD3F16D240D604E0036B248 /* Assets.xcassets */, 125 | DDD3F172240D604E0036B248 /* Info.plist */, 126 | DDD3F16F240D604E0036B248 /* Preview Content */, 127 | ); 128 | path = "BreatheReplica WatchKit Extension"; 129 | sourceTree = ""; 130 | }; 131 | DDD3F16F240D604E0036B248 /* Preview Content */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | DDD3F170240D604E0036B248 /* Preview Assets.xcassets */, 135 | ); 136 | path = "Preview Content"; 137 | sourceTree = ""; 138 | }; 139 | /* End PBXGroup section */ 140 | 141 | /* Begin PBXNativeTarget section */ 142 | DDD3F14E240D604C0036B248 /* BreatheReplica */ = { 143 | isa = PBXNativeTarget; 144 | buildConfigurationList = DDD3F17D240D604E0036B248 /* Build configuration list for PBXNativeTarget "BreatheReplica" */; 145 | buildPhases = ( 146 | DDD3F14D240D604C0036B248 /* Resources */, 147 | DDD3F17C240D604E0036B248 /* Embed Watch Content */, 148 | ); 149 | buildRules = ( 150 | ); 151 | dependencies = ( 152 | DDD3F156240D604C0036B248 /* PBXTargetDependency */, 153 | ); 154 | name = BreatheReplica; 155 | productName = BreatheReplica; 156 | productReference = DDD3F14F240D604C0036B248 /* BreatheReplica.app */; 157 | productType = "com.apple.product-type.application.watchapp2-container"; 158 | }; 159 | DDD3F152240D604C0036B248 /* BreatheReplica WatchKit App */ = { 160 | isa = PBXNativeTarget; 161 | buildConfigurationList = DDD3F179240D604E0036B248 /* Build configuration list for PBXNativeTarget "BreatheReplica WatchKit App" */; 162 | buildPhases = ( 163 | DDD3F151240D604C0036B248 /* Resources */, 164 | DDD3F178240D604E0036B248 /* Embed App Extensions */, 165 | ); 166 | buildRules = ( 167 | ); 168 | dependencies = ( 169 | DDD3F165240D604D0036B248 /* PBXTargetDependency */, 170 | ); 171 | name = "BreatheReplica WatchKit App"; 172 | productName = "BreatheReplica WatchKit App"; 173 | productReference = DDD3F153240D604C0036B248 /* BreatheReplica WatchKit App.app */; 174 | productType = "com.apple.product-type.application.watchapp2"; 175 | }; 176 | DDD3F161240D604D0036B248 /* BreatheReplica WatchKit Extension */ = { 177 | isa = PBXNativeTarget; 178 | buildConfigurationList = DDD3F175240D604E0036B248 /* Build configuration list for PBXNativeTarget "BreatheReplica WatchKit Extension" */; 179 | buildPhases = ( 180 | DDD3F15E240D604D0036B248 /* Sources */, 181 | DDD3F15F240D604D0036B248 /* Frameworks */, 182 | DDD3F160240D604D0036B248 /* Resources */, 183 | ); 184 | buildRules = ( 185 | ); 186 | dependencies = ( 187 | ); 188 | name = "BreatheReplica WatchKit Extension"; 189 | productName = "BreatheReplica WatchKit Extension"; 190 | productReference = DDD3F162240D604D0036B248 /* BreatheReplica WatchKit Extension.appex */; 191 | productType = "com.apple.product-type.watchkit2-extension"; 192 | }; 193 | /* End PBXNativeTarget section */ 194 | 195 | /* Begin PBXProject section */ 196 | DDD3F149240D604C0036B248 /* Project object */ = { 197 | isa = PBXProject; 198 | attributes = { 199 | LastSwiftUpdateCheck = 1140; 200 | LastUpgradeCheck = 1140; 201 | ORGANIZATIONNAME = "Guilherme Rambo"; 202 | TargetAttributes = { 203 | DDD3F14E240D604C0036B248 = { 204 | CreatedOnToolsVersion = 11.4; 205 | }; 206 | DDD3F152240D604C0036B248 = { 207 | CreatedOnToolsVersion = 11.4; 208 | }; 209 | DDD3F161240D604D0036B248 = { 210 | CreatedOnToolsVersion = 11.4; 211 | }; 212 | }; 213 | }; 214 | buildConfigurationList = DDD3F14C240D604C0036B248 /* Build configuration list for PBXProject "BreatheReplica" */; 215 | compatibilityVersion = "Xcode 9.3"; 216 | developmentRegion = en; 217 | hasScannedForEncodings = 0; 218 | knownRegions = ( 219 | en, 220 | Base, 221 | ); 222 | mainGroup = DDD3F148240D604C0036B248; 223 | productRefGroup = DDD3F150240D604C0036B248 /* Products */; 224 | projectDirPath = ""; 225 | projectRoot = ""; 226 | targets = ( 227 | DDD3F14E240D604C0036B248 /* BreatheReplica */, 228 | DDD3F152240D604C0036B248 /* BreatheReplica WatchKit App */, 229 | DDD3F161240D604D0036B248 /* BreatheReplica WatchKit Extension */, 230 | ); 231 | }; 232 | /* End PBXProject section */ 233 | 234 | /* Begin PBXResourcesBuildPhase section */ 235 | DDD3F14D240D604C0036B248 /* Resources */ = { 236 | isa = PBXResourcesBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | DDD3F151240D604C0036B248 /* Resources */ = { 243 | isa = PBXResourcesBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | DDD3F15C240D604D0036B248 /* Assets.xcassets in Resources */, 247 | DDD3F15A240D604C0036B248 /* Interface.storyboard in Resources */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | DDD3F160240D604D0036B248 /* Resources */ = { 252 | isa = PBXResourcesBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | DDD3F171240D604E0036B248 /* Preview Assets.xcassets in Resources */, 256 | DDD3F16E240D604E0036B248 /* Assets.xcassets in Resources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXResourcesBuildPhase section */ 261 | 262 | /* Begin PBXSourcesBuildPhase section */ 263 | DDD3F15E240D604D0036B248 /* Sources */ = { 264 | isa = PBXSourcesBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | DDD3F16A240D604D0036B248 /* HostingController.swift in Sources */, 268 | DDD3F168240D604D0036B248 /* ContentView.swift in Sources */, 269 | DDD3F16C240D604D0036B248 /* ExtensionDelegate.swift in Sources */, 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | /* End PBXSourcesBuildPhase section */ 274 | 275 | /* Begin PBXTargetDependency section */ 276 | DDD3F156240D604C0036B248 /* PBXTargetDependency */ = { 277 | isa = PBXTargetDependency; 278 | target = DDD3F152240D604C0036B248 /* BreatheReplica WatchKit App */; 279 | targetProxy = DDD3F155240D604C0036B248 /* PBXContainerItemProxy */; 280 | }; 281 | DDD3F165240D604D0036B248 /* PBXTargetDependency */ = { 282 | isa = PBXTargetDependency; 283 | target = DDD3F161240D604D0036B248 /* BreatheReplica WatchKit Extension */; 284 | targetProxy = DDD3F164240D604D0036B248 /* PBXContainerItemProxy */; 285 | }; 286 | /* End PBXTargetDependency section */ 287 | 288 | /* Begin PBXVariantGroup section */ 289 | DDD3F158240D604C0036B248 /* Interface.storyboard */ = { 290 | isa = PBXVariantGroup; 291 | children = ( 292 | DDD3F159240D604C0036B248 /* Base */, 293 | ); 294 | name = Interface.storyboard; 295 | sourceTree = ""; 296 | }; 297 | /* End PBXVariantGroup section */ 298 | 299 | /* Begin XCBuildConfiguration section */ 300 | DDD3F173240D604E0036B248 /* Debug */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ALWAYS_SEARCH_USER_PATHS = NO; 304 | CLANG_ANALYZER_NONNULL = YES; 305 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 306 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 307 | CLANG_CXX_LIBRARY = "libc++"; 308 | CLANG_ENABLE_MODULES = YES; 309 | CLANG_ENABLE_OBJC_ARC = YES; 310 | CLANG_ENABLE_OBJC_WEAK = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 318 | CLANG_WARN_EMPTY_BODY = YES; 319 | CLANG_WARN_ENUM_CONVERSION = YES; 320 | CLANG_WARN_INFINITE_RECURSION = YES; 321 | CLANG_WARN_INT_CONVERSION = YES; 322 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 324 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 326 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 327 | CLANG_WARN_STRICT_PROTOTYPES = YES; 328 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 329 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 330 | CLANG_WARN_UNREACHABLE_CODE = YES; 331 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 332 | COPY_PHASE_STRIP = NO; 333 | DEBUG_INFORMATION_FORMAT = dwarf; 334 | ENABLE_STRICT_OBJC_MSGSEND = YES; 335 | ENABLE_TESTABILITY = YES; 336 | GCC_C_LANGUAGE_STANDARD = gnu11; 337 | GCC_DYNAMIC_NO_PIC = NO; 338 | GCC_NO_COMMON_BLOCKS = YES; 339 | GCC_OPTIMIZATION_LEVEL = 0; 340 | GCC_PREPROCESSOR_DEFINITIONS = ( 341 | "DEBUG=1", 342 | "$(inherited)", 343 | ); 344 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 345 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 346 | GCC_WARN_UNDECLARED_SELECTOR = YES; 347 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 348 | GCC_WARN_UNUSED_FUNCTION = YES; 349 | GCC_WARN_UNUSED_VARIABLE = YES; 350 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 351 | MTL_FAST_MATH = YES; 352 | ONLY_ACTIVE_ARCH = YES; 353 | SDKROOT = iphoneos; 354 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 355 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 356 | }; 357 | name = Debug; 358 | }; 359 | DDD3F174240D604E0036B248 /* Release */ = { 360 | isa = XCBuildConfiguration; 361 | buildSettings = { 362 | ALWAYS_SEARCH_USER_PATHS = NO; 363 | CLANG_ANALYZER_NONNULL = YES; 364 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 365 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 366 | CLANG_CXX_LIBRARY = "libc++"; 367 | CLANG_ENABLE_MODULES = YES; 368 | CLANG_ENABLE_OBJC_ARC = YES; 369 | CLANG_ENABLE_OBJC_WEAK = YES; 370 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 371 | CLANG_WARN_BOOL_CONVERSION = YES; 372 | CLANG_WARN_COMMA = YES; 373 | CLANG_WARN_CONSTANT_CONVERSION = YES; 374 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 375 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 376 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 377 | CLANG_WARN_EMPTY_BODY = YES; 378 | CLANG_WARN_ENUM_CONVERSION = YES; 379 | CLANG_WARN_INFINITE_RECURSION = YES; 380 | CLANG_WARN_INT_CONVERSION = YES; 381 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 382 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 383 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 384 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 385 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 386 | CLANG_WARN_STRICT_PROTOTYPES = YES; 387 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 388 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 389 | CLANG_WARN_UNREACHABLE_CODE = YES; 390 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 391 | COPY_PHASE_STRIP = NO; 392 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 393 | ENABLE_NS_ASSERTIONS = NO; 394 | ENABLE_STRICT_OBJC_MSGSEND = YES; 395 | GCC_C_LANGUAGE_STANDARD = gnu11; 396 | GCC_NO_COMMON_BLOCKS = YES; 397 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 398 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 399 | GCC_WARN_UNDECLARED_SELECTOR = YES; 400 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 401 | GCC_WARN_UNUSED_FUNCTION = YES; 402 | GCC_WARN_UNUSED_VARIABLE = YES; 403 | MTL_ENABLE_DEBUG_INFO = NO; 404 | MTL_FAST_MATH = YES; 405 | SDKROOT = iphoneos; 406 | SWIFT_COMPILATION_MODE = wholemodule; 407 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 408 | VALIDATE_PRODUCT = YES; 409 | }; 410 | name = Release; 411 | }; 412 | DDD3F176240D604E0036B248 /* Debug */ = { 413 | isa = XCBuildConfiguration; 414 | buildSettings = { 415 | ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; 416 | CODE_SIGN_STYLE = Automatic; 417 | DEVELOPMENT_ASSET_PATHS = "\"BreatheReplica WatchKit Extension/Preview Content\""; 418 | DEVELOPMENT_TEAM = 8C7439RJLG; 419 | ENABLE_PREVIEWS = YES; 420 | INFOPLIST_FILE = "BreatheReplica WatchKit Extension/Info.plist"; 421 | LD_RUNPATH_SEARCH_PATHS = ( 422 | "$(inherited)", 423 | "@executable_path/Frameworks", 424 | "@executable_path/../../Frameworks", 425 | ); 426 | PRODUCT_BUNDLE_IDENTIFIER = codes.rambo.BreatheReplica.watchkitapp.watchkitextension; 427 | PRODUCT_NAME = "${TARGET_NAME}"; 428 | SDKROOT = watchos; 429 | SKIP_INSTALL = YES; 430 | SWIFT_VERSION = 5.0; 431 | TARGETED_DEVICE_FAMILY = 4; 432 | WATCHOS_DEPLOYMENT_TARGET = 6.2; 433 | }; 434 | name = Debug; 435 | }; 436 | DDD3F177240D604E0036B248 /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; 440 | CODE_SIGN_STYLE = Automatic; 441 | DEVELOPMENT_ASSET_PATHS = "\"BreatheReplica WatchKit Extension/Preview Content\""; 442 | DEVELOPMENT_TEAM = 8C7439RJLG; 443 | ENABLE_PREVIEWS = YES; 444 | INFOPLIST_FILE = "BreatheReplica WatchKit Extension/Info.plist"; 445 | LD_RUNPATH_SEARCH_PATHS = ( 446 | "$(inherited)", 447 | "@executable_path/Frameworks", 448 | "@executable_path/../../Frameworks", 449 | ); 450 | PRODUCT_BUNDLE_IDENTIFIER = codes.rambo.BreatheReplica.watchkitapp.watchkitextension; 451 | PRODUCT_NAME = "${TARGET_NAME}"; 452 | SDKROOT = watchos; 453 | SKIP_INSTALL = YES; 454 | SWIFT_VERSION = 5.0; 455 | TARGETED_DEVICE_FAMILY = 4; 456 | WATCHOS_DEPLOYMENT_TARGET = 6.2; 457 | }; 458 | name = Release; 459 | }; 460 | DDD3F17A240D604E0036B248 /* Debug */ = { 461 | isa = XCBuildConfiguration; 462 | buildSettings = { 463 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 464 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 465 | CODE_SIGN_STYLE = Automatic; 466 | DEVELOPMENT_TEAM = 8C7439RJLG; 467 | IBSC_MODULE = BreatheReplica_WatchKit_Extension; 468 | INFOPLIST_FILE = "BreatheReplica WatchKit App/Info.plist"; 469 | PRODUCT_BUNDLE_IDENTIFIER = codes.rambo.BreatheReplica.watchkitapp; 470 | PRODUCT_NAME = "$(TARGET_NAME)"; 471 | SDKROOT = watchos; 472 | SKIP_INSTALL = YES; 473 | SWIFT_VERSION = 5.0; 474 | TARGETED_DEVICE_FAMILY = 4; 475 | WATCHOS_DEPLOYMENT_TARGET = 6.2; 476 | }; 477 | name = Debug; 478 | }; 479 | DDD3F17B240D604E0036B248 /* Release */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 483 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 484 | CODE_SIGN_STYLE = Automatic; 485 | DEVELOPMENT_TEAM = 8C7439RJLG; 486 | IBSC_MODULE = BreatheReplica_WatchKit_Extension; 487 | INFOPLIST_FILE = "BreatheReplica WatchKit App/Info.plist"; 488 | PRODUCT_BUNDLE_IDENTIFIER = codes.rambo.BreatheReplica.watchkitapp; 489 | PRODUCT_NAME = "$(TARGET_NAME)"; 490 | SDKROOT = watchos; 491 | SKIP_INSTALL = YES; 492 | SWIFT_VERSION = 5.0; 493 | TARGETED_DEVICE_FAMILY = 4; 494 | WATCHOS_DEPLOYMENT_TARGET = 6.2; 495 | }; 496 | name = Release; 497 | }; 498 | DDD3F17E240D604E0036B248 /* Debug */ = { 499 | isa = XCBuildConfiguration; 500 | buildSettings = { 501 | CODE_SIGN_STYLE = Automatic; 502 | CURRENT_PROJECT_VERSION = 1; 503 | DEVELOPMENT_TEAM = 8C7439RJLG; 504 | MARKETING_VERSION = 1.0; 505 | PRODUCT_BUNDLE_IDENTIFIER = codes.rambo.BreatheReplica; 506 | PRODUCT_NAME = "$(TARGET_NAME)"; 507 | SWIFT_VERSION = 5.0; 508 | }; 509 | name = Debug; 510 | }; 511 | DDD3F17F240D604E0036B248 /* Release */ = { 512 | isa = XCBuildConfiguration; 513 | buildSettings = { 514 | CODE_SIGN_STYLE = Automatic; 515 | CURRENT_PROJECT_VERSION = 1; 516 | DEVELOPMENT_TEAM = 8C7439RJLG; 517 | MARKETING_VERSION = 1.0; 518 | PRODUCT_BUNDLE_IDENTIFIER = codes.rambo.BreatheReplica; 519 | PRODUCT_NAME = "$(TARGET_NAME)"; 520 | SWIFT_VERSION = 5.0; 521 | }; 522 | name = Release; 523 | }; 524 | /* End XCBuildConfiguration section */ 525 | 526 | /* Begin XCConfigurationList section */ 527 | DDD3F14C240D604C0036B248 /* Build configuration list for PBXProject "BreatheReplica" */ = { 528 | isa = XCConfigurationList; 529 | buildConfigurations = ( 530 | DDD3F173240D604E0036B248 /* Debug */, 531 | DDD3F174240D604E0036B248 /* Release */, 532 | ); 533 | defaultConfigurationIsVisible = 0; 534 | defaultConfigurationName = Release; 535 | }; 536 | DDD3F175240D604E0036B248 /* Build configuration list for PBXNativeTarget "BreatheReplica WatchKit Extension" */ = { 537 | isa = XCConfigurationList; 538 | buildConfigurations = ( 539 | DDD3F176240D604E0036B248 /* Debug */, 540 | DDD3F177240D604E0036B248 /* Release */, 541 | ); 542 | defaultConfigurationIsVisible = 0; 543 | defaultConfigurationName = Release; 544 | }; 545 | DDD3F179240D604E0036B248 /* Build configuration list for PBXNativeTarget "BreatheReplica WatchKit App" */ = { 546 | isa = XCConfigurationList; 547 | buildConfigurations = ( 548 | DDD3F17A240D604E0036B248 /* Debug */, 549 | DDD3F17B240D604E0036B248 /* Release */, 550 | ); 551 | defaultConfigurationIsVisible = 0; 552 | defaultConfigurationName = Release; 553 | }; 554 | DDD3F17D240D604E0036B248 /* Build configuration list for PBXNativeTarget "BreatheReplica" */ = { 555 | isa = XCConfigurationList; 556 | buildConfigurations = ( 557 | DDD3F17E240D604E0036B248 /* Debug */, 558 | DDD3F17F240D604E0036B248 /* Release */, 559 | ); 560 | defaultConfigurationIsVisible = 0; 561 | defaultConfigurationName = Release; 562 | }; 563 | /* End XCConfigurationList section */ 564 | }; 565 | rootObject = DDD3F149240D604C0036B248 /* Project object */; 566 | } 567 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Guilherme Rambo 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are met: 5 | 6 | - Redistributions of source code must retain the above copyright notice, this 7 | list of conditions and the following disclaimer. 8 | 9 | - Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 14 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 17 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 20 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 21 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Breathe Replica 2 | 3 | A simple replica of the Apple Watch Breathe app animation written in SwiftUI, for the [Swift over Coffee challenge](https://twitter.com/swiftovercoffee/status/1234417974137802754). 4 | 5 | It could be more accurate, but I didn't have time to tweak it any further. 6 | 7 | ![demo](./demo.gif) -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidegui/BreatheReplica/59960fa822eb28d31508b4186d9aab80bb447bac/demo.gif --------------------------------------------------------------------------------