├── .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.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/insidegui/BreatheReplica/59960fa822eb28d31508b4186d9aab80bb447bac/demo.gif
--------------------------------------------------------------------------------