├── Assets
├── Assets.xcassets
│ ├── Contents.json
│ ├── cancelled.imageset
│ │ ├── cancelled.png
│ │ └── Contents.json
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── error.imageset
│ │ └── Contents.json
│ └── syntax highlight.colorset
│ │ └── Contents.json
└── TinyDTClient.entitlements
├── TinyDTClient.plist
├── TinyDTClient.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
├── xcshareddata
│ └── xcschemes
│ │ ├── TinyDTClient.xcscheme
│ │ └── PromptWriter.xcscheme
└── project.pbxproj
├── LICENSE
├── README.md
├── source
├── ContentView.swift
└── TinyDTClient.swift
└── .gitignore
/Assets/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Assets/Assets.xcassets/cancelled.imageset/cancelled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/S1D1T1/TinyDTClient/HEAD/Assets/Assets.xcassets/cancelled.imageset/cancelled.png
--------------------------------------------------------------------------------
/TinyDTClient.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/TinyDTClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Assets/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/TinyDTClient.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Assets/Assets.xcassets/error.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "scale" : "2x"
10 | },
11 | {
12 | "idiom" : "universal",
13 | "scale" : "3x"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/TinyDTClient.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "realhttp",
5 | "kind" : "remoteSourceControl",
6 | "location" : "https://github.com/immobiliare/RealHTTP.git",
7 | "state" : {
8 | "revision" : "c0ffb265eae8684da02ad20cfcc147c23463ad95",
9 | "version" : "1.8.3"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/Assets/Assets.xcassets/cancelled.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "cancelled.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Assets/TinyDTClient.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.assets.pictures.read-write
8 |
9 | com.apple.security.files.downloads.read-write
10 |
11 | com.apple.security.files.user-selected.read-write
12 |
13 | com.apple.security.network.client
14 |
15 | com.apple.security.personal-information.photos-library
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Assets/Assets.xcassets/syntax highlight.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "display-p3",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "0.644",
9 | "green" : "0.897",
10 | "red" : "1.000"
11 | }
12 | },
13 | "idiom" : "universal"
14 | },
15 | {
16 | "appearances" : [
17 | {
18 | "appearance" : "luminosity",
19 | "value" : "dark"
20 | }
21 | ],
22 | "color" : {
23 | "color-space" : "srgb",
24 | "components" : {
25 | "alpha" : "1.000",
26 | "blue" : "1.000",
27 | "green" : "1.000",
28 | "red" : "1.000"
29 | }
30 | },
31 | "idiom" : "universal"
32 | }
33 | ],
34 | "info" : {
35 | "author" : "xcode",
36 | "version" : 1
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 S1D1T1
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TinyDTClient
2 | A minimum client for Draw Things API
3 |
4 | TinyDTClient is a tiny MacOS SwiftUI Application demonstrating the basic functions for a client to the awesome Image generation app, [Draw Things](https://apps.apple.com/us/app/draw-things-ai-generation/id6444050820) (DT). It is extracted from the full-featured client, [PromptWriter](https://testflight.apple.com/join/Ln3tIMgp).
5 |
6 | Dependancy: TinyDTClient depends on the library [RealHTTP](https://github.com/immobiliare/RealHTTP) for the low level http client stuff. Thanks to Immobillaire
7 |
8 | The app attempts to connect to a DT server at its default address, and has no UI for configuring server info, so DT must be running on the same mac, with HTTP server on, at port 7860.
9 | The app makes image requests on the API, sending json with 3 parameters:
10 | {"prompt":"`your prompt`","negative_prompt":"", "seed":-1}
11 | \(prompt from the prompt field, blank negative prompt, random seed\)
12 |
13 | All other image settings are done directly in DT.
14 | There's no error handling or user feedback.
15 |
16 | To experiment with building a stable diffusion front end, start by adding to the UI here - such as a text field for negative prompt, or controls for # of steps, etc.
17 |
18 |
19 |
20 | TinyDTClient running alongside Draw Things
21 |
--------------------------------------------------------------------------------
/source/ContentView.swift:
--------------------------------------------------------------------------------
1 | /// A Super Simple client for Draw Things.
2 | /// by SoDoTo
3 |
4 |
5 | import SwiftUI
6 | import Foundation
7 |
8 | @main
9 | struct PictureThisApp: App {
10 | var body: some Scene {
11 | WindowGroup {
12 | ContentView()
13 | }
14 | }
15 | }
16 |
17 | struct ContentView: View {
18 | @State var prompt:String=""
19 | @ObservedObject var requester = simpleImageRequester.shared
20 |
21 | var body: some View {
22 | VStack {
23 | TextField("Prompt:", text: $prompt).onSubmit {
24 | requester.runPrompt(prompt)
25 | }
26 |
27 | if let image = requester.image {
28 | Image(nsImage:image)
29 | }
30 | }
31 | .padding()
32 | }
33 | }
34 |
35 | class simpleImageRequester : ObservableObject {
36 | static var shared = simpleImageRequester() // make it a global, so async routines can find me
37 | @Published var image:NSImage?
38 |
39 | func runPrompt(_ prompt:String){
40 | SimpleDTClient.shared.runPrompt(prompt)
41 | }
42 |
43 | func returnImage(_ imageData:Data){
44 | self.image = NSImage(data: imageData)
45 | }
46 |
47 |
48 | /// not currently used. you can save the image received
49 | func saveTmpImage(_ imageData:Data)->URL?
50 | {
51 | let tempDirectoryURL = FileManager.default.temporaryDirectory
52 | let tempFileURL = tempDirectoryURL.appendingPathComponent("tmpImage.png")
53 |
54 | do{
55 | try imageData.write(to: tempFileURL)
56 | }
57 | catch{return nil}
58 | return tempFileURL
59 | }
60 | }
61 |
62 |
63 | #Preview {
64 | ContentView()
65 | }
66 |
67 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
9 | *.xcscmblueprint
10 | *.xccheckout
11 |
12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
13 | build/
14 | DerivedData/
15 | *.moved-aside
16 | *.pbxuser
17 | !default.pbxuser
18 | *.mode1v3
19 | !default.mode1v3
20 | *.mode2v3
21 | !default.mode2v3
22 | *.perspectivev3
23 | !default.perspectivev3
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 |
28 | ## App packaging
29 | *.ipa
30 | *.dSYM.zip
31 | *.dSYM
32 |
33 | ## Playgrounds
34 | timeline.xctimeline
35 | playground.xcworkspace
36 |
37 | # Swift Package Manager
38 | #
39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
40 | # Packages/
41 | # Package.pins
42 | # Package.resolved
43 | # *.xcodeproj
44 | #
45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
46 | # hence it is not needed unless you have added a package configuration file to your project
47 | # .swiftpm
48 |
49 | .build/
50 |
51 | # CocoaPods
52 | #
53 | # We recommend against adding the Pods directory to your .gitignore. However
54 | # you should judge for yourself, the pros and cons are mentioned at:
55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
56 | #
57 | # Pods/
58 | #
59 | # Add this line if you want to avoid checking in source code from the Xcode workspace
60 | # *.xcworkspace
61 |
62 | # Carthage
63 | #
64 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
65 | # Carthage/Checkouts
66 |
67 | Carthage/Build/
68 |
69 | # Accio dependency management
70 | Dependencies/
71 | .accio/
72 |
73 | # fastlane
74 | #
75 | # It is recommended to not store the screenshots in the git repo.
76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
77 | # For more information about the recommended setup visit:
78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
79 |
80 | fastlane/report.xml
81 | fastlane/Preview.html
82 | fastlane/screenshots/**/*.png
83 | fastlane/test_output
84 |
85 | # Code Injection
86 | #
87 | # After new code Injection tools there's a generated folder /iOSInjectionProject
88 | # https://github.com/johnno1962/injectionforxcode
89 |
90 | iOSInjectionProject/
91 |
--------------------------------------------------------------------------------
/TinyDTClient.xcodeproj/xcshareddata/xcschemes/TinyDTClient.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
42 |
44 |
50 |
51 |
52 |
53 |
59 |
61 |
67 |
68 |
69 |
70 |
72 |
73 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/TinyDTClient.xcodeproj/xcshareddata/xcschemes/PromptWriter.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
35 |
41 |
42 |
43 |
44 |
45 |
55 |
57 |
63 |
64 |
65 |
66 |
72 |
74 |
80 |
81 |
82 |
83 |
85 |
86 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/source/TinyDTClient.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TinyDTClient.swift
3 | //
4 | // Created by SoDoTo on 1/11/24.
5 | // cloned and copied from PromptWriter Main
6 | //
7 | // Built on "RealHTTP" network client library
8 | // https://github.com/immobiliare/RealHTTP
9 |
10 | // This is bare bones - no error checking, or tracking of requests at all. It will send requests at any time, and
11 | // when a request succeeds, it simply stores the image in a globally accessible variable. So it doesn't
12 | // even track what image is in response to what request.
13 |
14 |
15 |
16 | import Foundation
17 | import RealHTTP
18 | import SwiftUI
19 |
20 | // server address, port and api path all hardcoded here
21 | let serverPath = "/sdapi/v1/txt2img"
22 | let defaultServerBaseURL = "localhost:7860"
23 | let defaultServerPrefix = "http://"
24 |
25 | // so a console can reflect change in status
26 | class SimpleDTClient : ObservableObject {
27 | enum serverStatus : Int {
28 | case unknown = 0,serverUp, serverDown
29 | }
30 | enum requestStatus : Int {
31 | case requestOK = 0, requestCancelled, requestError, requestServerDown
32 | }
33 |
34 | static var shared = SimpleDTClient()
35 | var status:serverStatus = .unknown
36 | var serverAddress:String=""
37 |
38 | init(thisDevice:Bool = true, address:String=""){
39 | // make initial connection
40 | if thisDevice {
41 | self.serverAddress = defaultServerBaseURL
42 | }
43 | else {
44 | self.serverAddress = address
45 | }
46 | status = getServerStatusAsync()
47 | }
48 |
49 | // send a prompt, and optional negative prompt, async. Doesn't return anything.
50 | // it inserts a -1 seed
51 | func runPrompt(_ posPrompt:String, negPrompt:String = ""){
52 |
53 | // make prompt into json
54 | let dictionary:[String:Any?] = ["prompt":posPrompt,"negative_prompt":negPrompt, "seed":-1]
55 |
56 | do {
57 | let myjson = try HTTPBody.json(dictionary)
58 | if let req = createJSONRequest(json:myjson) {
59 | runRequest(req)
60 | }
61 | }
62 | catch{
63 | return
64 | }
65 | }
66 |
67 | // this does 2 things : returns status and also updates.
68 | // functions shouldn't do 2 things.
69 | func getServerStatusAsync()->serverStatus {
70 | let req = HTTPRequest {
71 | $0.url = URL(string:defaultServerPrefix+serverAddress )
72 | if $0.url == nil {
73 | status = .serverDown
74 | return
75 | }
76 | $0.method = .head
77 | $0.timeout = 5
78 | $0.allowsCellularAccess = true
79 | }
80 | req.headers = HTTPHeaders( )
81 |
82 | Task.init {
83 | do {
84 | let response = try await req.fetch()
85 | let newStatus:serverStatus
86 |
87 | if response.statusCode != .none {
88 | newStatus = .serverUp
89 | }
90 | else {
91 | newStatus = .serverDown
92 | }
93 |
94 | // Server Status change - server status is observed. Changing it can trigger things.
95 | if status != newStatus {
96 | DispatchQueue.main.async {
97 | self.status = newStatus
98 | }
99 | }
100 | }
101 | catch {
102 | print("Error fetching request: \(error)")
103 | return serverStatus.serverDown
104 | }
105 | return self.status
106 | }
107 | return self.status
108 | }
109 |
110 | func createJSONRequest(json:HTTPBody)->HTTPRequest? {
111 | guard let url = URL(string:defaultServerPrefix+serverAddress+serverPath )
112 | else {return nil}
113 |
114 | let req = HTTPRequest {
115 | // Setup default params
116 | $0.url = url
117 | $0.method = .post
118 | $0.timeout = 10000 // this is needed, in seconds
119 | $0.allowsCellularAccess = true
120 | // Setup URL query params & body
121 | $0.body = json
122 | }
123 | if req.url == nil {return nil}
124 | req.headers = HTTPHeaders()
125 | return req
126 | }
127 |
128 | // asynchonous - send the request to the server. return immediately
129 | // when/ if the request succeeds, it will call simpleImageRequester.shared.returnImage
130 |
131 | func runRequest(_ req:HTTPRequest){
132 | struct jsonImageArray : Codable {
133 | var images:[Data]
134 | }
135 | Task.init {
136 | var response:HTTPResponse?
137 | do {
138 | response = try await req.fetch()
139 | }
140 | catch {
141 | print("Error fetching http request: \(error)")
142 | return
143 | }
144 |
145 | if response?.statusCode != .ok {
146 | return
147 | }
148 |
149 | if let rawResponse = response?.data {
150 | let decoder = JSONDecoder()
151 | let jsonimages = try decoder.decode(jsonImageArray.self, from: rawResponse)
152 |
153 | if jsonimages.images.isEmpty{
154 | }
155 | else { // images array is not empty
156 | if jsonimages.images.count > 1 {
157 | // [see deleted code in repo]
158 | } // End of Batch Handling
159 | else { // not a batch
160 |
161 | let imageData = jsonimages.images[0]
162 |
163 | /// SUCCESS
164 | // Simply jam this image data into a known place.
165 | DispatchQueue.main.async {
166 | simpleImageRequester.shared.returnImage(imageData)
167 | }
168 | }
169 | } // END of Else: Images Array not empty
170 | }
171 | }
172 | return
173 | }
174 | }
175 |
--------------------------------------------------------------------------------
/TinyDTClient.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 821363492B50746500691CB4 /* TinyDTClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821363482B50746500691CB4 /* TinyDTClient.swift */; };
11 | 8213634B2B5074A500691CB4 /* RealHTTP in Frameworks */ = {isa = PBXBuildFile; productRef = 8213634A2B5074A500691CB4 /* RealHTTP */; };
12 | 8269679E2B5070B00085C032 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8269679D2B5070B00085C032 /* ContentView.swift */; };
13 | /* End PBXBuildFile section */
14 |
15 | /* Begin PBXFileReference section */
16 | 821363482B50746500691CB4 /* TinyDTClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TinyDTClient.swift; sourceTree = ""; };
17 | 82292CFC2B2E43670042A1C6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
18 | 826967992B5070B00085C032 /* TinyDTClient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TinyDTClient.app; sourceTree = BUILT_PRODUCTS_DIR; };
19 | 8269679D2B5070B00085C032 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
20 | /* End PBXFileReference section */
21 |
22 | /* Begin PBXFrameworksBuildPhase section */
23 | 826967962B5070B00085C032 /* Frameworks */ = {
24 | isa = PBXFrameworksBuildPhase;
25 | buildActionMask = 2147483647;
26 | files = (
27 | 8213634B2B5074A500691CB4 /* RealHTTP in Frameworks */,
28 | );
29 | runOnlyForDeploymentPostprocessing = 0;
30 | };
31 | /* End PBXFrameworksBuildPhase section */
32 |
33 | /* Begin PBXGroup section */
34 | 82292CEC2B2E43660042A1C6 = {
35 | isa = PBXGroup;
36 | children = (
37 | 8269679A2B5070B00085C032 /* source */,
38 | 82292CF72B2E43660042A1C6 /* Assets */,
39 | 82292CF62B2E43660042A1C6 /* Products */,
40 | );
41 | sourceTree = "";
42 | };
43 | 82292CF62B2E43660042A1C6 /* Products */ = {
44 | isa = PBXGroup;
45 | children = (
46 | 826967992B5070B00085C032 /* TinyDTClient.app */,
47 | );
48 | name = Products;
49 | sourceTree = "";
50 | };
51 | 82292CF72B2E43660042A1C6 /* Assets */ = {
52 | isa = PBXGroup;
53 | children = (
54 | 82292CFC2B2E43670042A1C6 /* Assets.xcassets */,
55 | );
56 | path = Assets;
57 | sourceTree = "";
58 | };
59 | 8269679A2B5070B00085C032 /* source */ = {
60 | isa = PBXGroup;
61 | children = (
62 | 821363482B50746500691CB4 /* TinyDTClient.swift */,
63 | 8269679D2B5070B00085C032 /* ContentView.swift */,
64 | );
65 | path = source;
66 | sourceTree = "";
67 | };
68 | /* End PBXGroup section */
69 |
70 | /* Begin PBXNativeTarget section */
71 | 826967982B5070B00085C032 /* TinyDTClient */ = {
72 | isa = PBXNativeTarget;
73 | buildConfigurationList = 826967A52B5070B10085C032 /* Build configuration list for PBXNativeTarget "TinyDTClient" */;
74 | buildPhases = (
75 | 826967952B5070B00085C032 /* Sources */,
76 | 826967962B5070B00085C032 /* Frameworks */,
77 | 826967972B5070B00085C032 /* Resources */,
78 | );
79 | buildRules = (
80 | );
81 | dependencies = (
82 | );
83 | name = TinyDTClient;
84 | packageProductDependencies = (
85 | 8213634A2B5074A500691CB4 /* RealHTTP */,
86 | );
87 | productName = "Text Gateway";
88 | productReference = 826967992B5070B00085C032 /* TinyDTClient.app */;
89 | productType = "com.apple.product-type.application";
90 | };
91 | /* End PBXNativeTarget section */
92 |
93 | /* Begin PBXProject section */
94 | 82292CED2B2E43660042A1C6 /* Project object */ = {
95 | isa = PBXProject;
96 | attributes = {
97 | BuildIndependentTargetsInParallel = 1;
98 | KnownAssetTags = (
99 | New,
100 | );
101 | LastSwiftUpdateCheck = 1510;
102 | LastUpgradeCheck = 1520;
103 | TargetAttributes = {
104 | 826967982B5070B00085C032 = {
105 | CreatedOnToolsVersion = 15.1;
106 | };
107 | };
108 | };
109 | buildConfigurationList = 82292CF02B2E43660042A1C6 /* Build configuration list for PBXProject "TinyDTClient" */;
110 | compatibilityVersion = "Xcode 14.0";
111 | developmentRegion = en;
112 | hasScannedForEncodings = 0;
113 | knownRegions = (
114 | en,
115 | Base,
116 | de,
117 | nb,
118 | da,
119 | sv,
120 | );
121 | mainGroup = 82292CEC2B2E43660042A1C6;
122 | packageReferences = (
123 | 82292D072B2E439E0042A1C6 /* XCRemoteSwiftPackageReference "RealHTTP" */,
124 | );
125 | productRefGroup = 82292CF62B2E43660042A1C6 /* Products */;
126 | projectDirPath = "";
127 | projectRoot = "";
128 | targets = (
129 | 826967982B5070B00085C032 /* TinyDTClient */,
130 | );
131 | };
132 | /* End PBXProject section */
133 |
134 | /* Begin PBXResourcesBuildPhase section */
135 | 826967972B5070B00085C032 /* Resources */ = {
136 | isa = PBXResourcesBuildPhase;
137 | buildActionMask = 2147483647;
138 | files = (
139 | );
140 | runOnlyForDeploymentPostprocessing = 0;
141 | };
142 | /* End PBXResourcesBuildPhase section */
143 |
144 | /* Begin PBXSourcesBuildPhase section */
145 | 826967952B5070B00085C032 /* Sources */ = {
146 | isa = PBXSourcesBuildPhase;
147 | buildActionMask = 2147483647;
148 | files = (
149 | 8269679E2B5070B00085C032 /* ContentView.swift in Sources */,
150 | 821363492B50746500691CB4 /* TinyDTClient.swift in Sources */,
151 | );
152 | runOnlyForDeploymentPostprocessing = 0;
153 | };
154 | /* End PBXSourcesBuildPhase section */
155 |
156 | /* Begin XCBuildConfiguration section */
157 | 82292D022B2E43670042A1C6 /* Debug */ = {
158 | isa = XCBuildConfiguration;
159 | buildSettings = {
160 | ALWAYS_SEARCH_USER_PATHS = NO;
161 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
162 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
163 | CLANG_ANALYZER_NONNULL = YES;
164 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
165 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
166 | CLANG_ENABLE_MODULES = YES;
167 | CLANG_ENABLE_OBJC_ARC = YES;
168 | CLANG_ENABLE_OBJC_WEAK = YES;
169 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
170 | CLANG_WARN_BOOL_CONVERSION = YES;
171 | CLANG_WARN_COMMA = YES;
172 | CLANG_WARN_CONSTANT_CONVERSION = YES;
173 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
174 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
175 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
176 | CLANG_WARN_EMPTY_BODY = YES;
177 | CLANG_WARN_ENUM_CONVERSION = YES;
178 | CLANG_WARN_INFINITE_RECURSION = YES;
179 | CLANG_WARN_INT_CONVERSION = YES;
180 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
181 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
182 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
183 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
184 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
185 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
186 | CLANG_WARN_STRICT_PROTOTYPES = YES;
187 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
188 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
189 | CLANG_WARN_UNREACHABLE_CODE = YES;
190 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
191 | COPY_PHASE_STRIP = NO;
192 | DEAD_CODE_STRIPPING = YES;
193 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
194 | ENABLE_STRICT_OBJC_MSGSEND = YES;
195 | ENABLE_TESTABILITY = YES;
196 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
197 | GCC_C_LANGUAGE_STANDARD = gnu17;
198 | GCC_DYNAMIC_NO_PIC = NO;
199 | GCC_NO_COMMON_BLOCKS = YES;
200 | GCC_OPTIMIZATION_LEVEL = 0;
201 | GCC_PREPROCESSOR_DEFINITIONS = (
202 | "DEBUG=1",
203 | "$(inherited)",
204 | );
205 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
206 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
207 | GCC_WARN_UNDECLARED_SELECTOR = YES;
208 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
209 | GCC_WARN_UNUSED_FUNCTION = YES;
210 | GCC_WARN_UNUSED_VARIABLE = YES;
211 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
212 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
213 | MTL_FAST_MATH = YES;
214 | ONLY_ACTIVE_ARCH = YES;
215 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
216 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
217 | };
218 | name = Debug;
219 | };
220 | 82292D032B2E43670042A1C6 /* Release */ = {
221 | isa = XCBuildConfiguration;
222 | buildSettings = {
223 | ALWAYS_SEARCH_USER_PATHS = NO;
224 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
225 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
226 | CLANG_ANALYZER_NONNULL = YES;
227 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
228 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
229 | CLANG_ENABLE_MODULES = YES;
230 | CLANG_ENABLE_OBJC_ARC = YES;
231 | CLANG_ENABLE_OBJC_WEAK = YES;
232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
233 | CLANG_WARN_BOOL_CONVERSION = YES;
234 | CLANG_WARN_COMMA = YES;
235 | CLANG_WARN_CONSTANT_CONVERSION = YES;
236 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
239 | CLANG_WARN_EMPTY_BODY = YES;
240 | CLANG_WARN_ENUM_CONVERSION = YES;
241 | CLANG_WARN_INFINITE_RECURSION = YES;
242 | CLANG_WARN_INT_CONVERSION = YES;
243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
244 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
245 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
246 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
247 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
248 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
249 | CLANG_WARN_STRICT_PROTOTYPES = YES;
250 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
251 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
252 | CLANG_WARN_UNREACHABLE_CODE = YES;
253 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
254 | COPY_PHASE_STRIP = NO;
255 | DEAD_CODE_STRIPPING = YES;
256 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
257 | ENABLE_NS_ASSERTIONS = NO;
258 | ENABLE_STRICT_OBJC_MSGSEND = YES;
259 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
260 | GCC_C_LANGUAGE_STANDARD = gnu17;
261 | GCC_NO_COMMON_BLOCKS = YES;
262 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
263 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
264 | GCC_WARN_UNDECLARED_SELECTOR = YES;
265 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
266 | GCC_WARN_UNUSED_FUNCTION = YES;
267 | GCC_WARN_UNUSED_VARIABLE = YES;
268 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
269 | MTL_ENABLE_DEBUG_INFO = NO;
270 | MTL_FAST_MATH = YES;
271 | SWIFT_COMPILATION_MODE = wholemodule;
272 | };
273 | name = Release;
274 | };
275 | 826967A62B5070B10085C032 /* Debug */ = {
276 | isa = XCBuildConfiguration;
277 | buildSettings = {
278 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
279 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
280 | CODE_SIGN_ENTITLEMENTS = Assets/TinyDTClient.entitlements;
281 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
282 | CODE_SIGN_STYLE = Automatic;
283 | CURRENT_PROJECT_VERSION = 1;
284 | DEAD_CODE_STRIPPING = YES;
285 | DEBUG_INFORMATION_FORMAT = dwarf;
286 | DEVELOPMENT_ASSET_PATHS = "";
287 | DEVELOPMENT_TEAM = QBA62ZAWDB;
288 | ENABLE_HARDENED_RUNTIME = YES;
289 | "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
290 | ENABLE_PREVIEWS = YES;
291 | GENERATE_INFOPLIST_FILE = YES;
292 | INFOPLIST_FILE = TinyDTClient.plist;
293 | INFOPLIST_KEY_CFBundleDisplayName = "Tiny DTClient";
294 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.graphics-design";
295 | INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 tafkad";
296 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
297 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
298 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
299 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
300 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
301 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
302 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
303 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
304 | IPHONEOS_DEPLOYMENT_TARGET = 17.0;
305 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
306 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
307 | MACOSX_DEPLOYMENT_TARGET = 13.0;
308 | MARKETING_VERSION = 1.0;
309 | PRODUCT_BUNDLE_IDENTIFIER = com.tafkad.tinyDTClient;
310 | PRODUCT_NAME = "$(TARGET_NAME)";
311 | SDKROOT = auto;
312 | SUPPORTED_PLATFORMS = macosx;
313 | SUPPORTS_MACCATALYST = NO;
314 | SWIFT_EMIT_LOC_STRINGS = YES;
315 | SWIFT_VERSION = 5.0;
316 | };
317 | name = Debug;
318 | };
319 | 826967A72B5070B10085C032 /* Release */ = {
320 | isa = XCBuildConfiguration;
321 | buildSettings = {
322 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
323 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
324 | CODE_SIGN_ENTITLEMENTS = Assets/TinyDTClient.entitlements;
325 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
326 | CODE_SIGN_STYLE = Automatic;
327 | CURRENT_PROJECT_VERSION = 1;
328 | DEAD_CODE_STRIPPING = YES;
329 | DEVELOPMENT_ASSET_PATHS = "";
330 | DEVELOPMENT_TEAM = QBA62ZAWDB;
331 | ENABLE_HARDENED_RUNTIME = YES;
332 | "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
333 | ENABLE_PREVIEWS = YES;
334 | GENERATE_INFOPLIST_FILE = YES;
335 | INFOPLIST_FILE = TinyDTClient.plist;
336 | INFOPLIST_KEY_CFBundleDisplayName = "Tiny DTClient";
337 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.graphics-design";
338 | INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 tafkad";
339 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
340 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
341 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
342 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
343 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
344 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
345 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
346 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
347 | IPHONEOS_DEPLOYMENT_TARGET = 17.0;
348 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
349 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
350 | MACOSX_DEPLOYMENT_TARGET = 13.0;
351 | MARKETING_VERSION = 1.0;
352 | PRODUCT_BUNDLE_IDENTIFIER = com.tafkad.tinyDTClient;
353 | PRODUCT_NAME = "$(TARGET_NAME)";
354 | SDKROOT = auto;
355 | SUPPORTED_PLATFORMS = macosx;
356 | SUPPORTS_MACCATALYST = NO;
357 | SWIFT_EMIT_LOC_STRINGS = YES;
358 | SWIFT_VERSION = 5.0;
359 | };
360 | name = Release;
361 | };
362 | /* End XCBuildConfiguration section */
363 |
364 | /* Begin XCConfigurationList section */
365 | 82292CF02B2E43660042A1C6 /* Build configuration list for PBXProject "TinyDTClient" */ = {
366 | isa = XCConfigurationList;
367 | buildConfigurations = (
368 | 82292D022B2E43670042A1C6 /* Debug */,
369 | 82292D032B2E43670042A1C6 /* Release */,
370 | );
371 | defaultConfigurationIsVisible = 0;
372 | defaultConfigurationName = Release;
373 | };
374 | 826967A52B5070B10085C032 /* Build configuration list for PBXNativeTarget "TinyDTClient" */ = {
375 | isa = XCConfigurationList;
376 | buildConfigurations = (
377 | 826967A62B5070B10085C032 /* Debug */,
378 | 826967A72B5070B10085C032 /* Release */,
379 | );
380 | defaultConfigurationIsVisible = 0;
381 | defaultConfigurationName = Release;
382 | };
383 | /* End XCConfigurationList section */
384 |
385 | /* Begin XCRemoteSwiftPackageReference section */
386 | 82292D072B2E439E0042A1C6 /* XCRemoteSwiftPackageReference "RealHTTP" */ = {
387 | isa = XCRemoteSwiftPackageReference;
388 | repositoryURL = "https://github.com/immobiliare/RealHTTP.git";
389 | requirement = {
390 | kind = upToNextMajorVersion;
391 | minimumVersion = 1.8.3;
392 | };
393 | };
394 | /* End XCRemoteSwiftPackageReference section */
395 |
396 | /* Begin XCSwiftPackageProductDependency section */
397 | 8213634A2B5074A500691CB4 /* RealHTTP */ = {
398 | isa = XCSwiftPackageProductDependency;
399 | package = 82292D072B2E439E0042A1C6 /* XCRemoteSwiftPackageReference "RealHTTP" */;
400 | productName = RealHTTP;
401 | };
402 | /* End XCSwiftPackageProductDependency section */
403 | };
404 | rootObject = 82292CED2B2E43660042A1C6 /* Project object */;
405 | }
406 |
--------------------------------------------------------------------------------