├── .gitattributes
├── reddot
├── Assets.xcassets
│ ├── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── imgonline-com-ua-resize-0z0l5nkgeDpRMkf.jpg
│ │ └── Contents.json
│ └── AccentColor.colorset
│ │ └── Contents.json
├── Preview Content
│ └── Preview Assets.xcassets
│ │ └── Contents.json
├── reddotApp.swift
├── ObjCHelper.m
├── ObjCHelper.h
└── ContentView.swift
├── reddot-Bridging-Header.h
├── entitlements.plist
├── .gitignore
└── reddot.xcodeproj
└── project.pbxproj
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/reddot/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/reddot/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/reddot-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
5 | #import "ObjCHelper.h"
6 |
--------------------------------------------------------------------------------
/reddot/Assets.xcassets/AppIcon.appiconset/imgonline-com-ua-resize-0z0l5nkgeDpRMkf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/s8ngyu/red-dot/HEAD/reddot/Assets.xcassets/AppIcon.appiconset/imgonline-com-ua-resize-0z0l5nkgeDpRMkf.jpg
--------------------------------------------------------------------------------
/reddot/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 |
--------------------------------------------------------------------------------
/reddot/reddotApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // reddotApp.swift
3 | // reddot
4 | //
5 | // Created by Soongyu Kwon on 9/12/22.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct reddotApp: App {
12 | var body: some Scene {
13 | WindowGroup {
14 | ContentView()
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/reddot/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "imgonline-com-ua-resize-0z0l5nkgeDpRMkf.jpg",
5 | "idiom" : "universal",
6 | "platform" : "ios",
7 | "size" : "1024x1024"
8 | }
9 | ],
10 | "info" : {
11 | "author" : "xcode",
12 | "version" : 1
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/reddot/ObjCHelper.m:
--------------------------------------------------------------------------------
1 | //
2 | // ObjCHelper.m
3 | // reddot
4 | //
5 | // Created by Soongyu Kwon on 9/12/22.
6 | //
7 |
8 | #import "ObjCHelper.h"
9 |
10 | #pragma clang diagnostic ignored "-Wincomplete-implementation"
11 | @implementation ObjCHelper
12 |
13 | - (void)imageToCPBitmap:(UIImage *)img path:(NSString *)path {
14 | [img writeToCPBitmapFile:path flags:1];
15 | }
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | platform-application
6 |
7 | com.apple.private.security.no-container
8 |
9 | com.apple.security.app-sandbox
10 |
11 |
12 |
--------------------------------------------------------------------------------
/reddot/ObjCHelper.h:
--------------------------------------------------------------------------------
1 | //
2 | // ObjCHelper.h
3 | // reddot
4 | //
5 | // Created by Soongyu Kwon on 9/12/22.
6 | //
7 |
8 | #import
9 | #import
10 | #import
11 | #import
12 |
13 | @interface UIImage (Private)
14 |
15 | - (BOOL)writeToCPBitmapFile:(NSString *)filename flags:(NSInteger)flags;
16 |
17 | @end
18 |
19 | NS_ASSUME_NONNULL_BEGIN
20 |
21 | @interface ObjCHelper : NSObject
22 | - (void)imageToCPBitmap:(UIImage *)img path:(NSString *)path;
23 | @end
24 |
25 | NS_ASSUME_NONNULL_END
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.toptal.com/developers/gitignore/api/macos,swift,xcode,cocoapods
2 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos,swift,xcode,cocoapods
3 |
4 | ### CocoaPods ###
5 | ## CocoaPods GitIgnore Template
6 |
7 | # CocoaPods - Only use to conserve bandwidth / Save time on Pushing
8 | # - Also handy if you have a large number of dependant pods
9 | # - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE
10 | Pods/
11 | build/
12 | .theos/
13 | ### macOS ###
14 | # General
15 | .DS_Store
16 | .AppleDouble
17 | .LSOverride
18 |
19 | # Icon must end with two \r
20 | Icon
21 |
22 |
23 | # Thumbnails
24 | ._*
25 |
26 | # Files that might appear in the root of a volume
27 | .DocumentRevisions-V100
28 | .fseventsd
29 | .Spotlight-V100
30 | .TemporaryItems
31 | .Trashes
32 | .VolumeIcon.icns
33 | .com.apple.timemachine.donotpresent
34 |
35 | # Directories potentially created on remote AFP share
36 | .AppleDB
37 | .AppleDesktop
38 | Network Trash Folder
39 | Temporary Items
40 | .apdisk
41 |
42 | ### macOS Patch ###
43 | # iCloud generated files
44 | *.icloud
45 |
46 | ### Swift ###
47 | # Xcode
48 | #
49 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
50 |
51 | ## User settings
52 | xcuserdata/
53 |
54 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
55 | *.xcscmblueprint
56 | *.xccheckout
57 |
58 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
59 | build/
60 | DerivedData/
61 | *.moved-aside
62 | *.pbxuser
63 | !default.pbxuser
64 | *.mode1v3
65 | !default.mode1v3
66 | *.mode2v3
67 | !default.mode2v3
68 | *.perspectivev3
69 | !default.perspectivev3
70 |
71 | ## Obj-C/Swift specific
72 | *.hmap
73 |
74 | ## App packaging
75 | *.ipa
76 | *.dSYM.zip
77 | *.dSYM
78 |
79 | ## Playgrounds
80 | timeline.xctimeline
81 | playground.xcworkspace
82 |
83 | # Swift Package Manager
84 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
85 | # Packages/
86 | # Package.pins
87 | # Package.resolved
88 | # *.xcodeproj
89 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
90 | # hence it is not needed unless you have added a package configuration file to your project
91 | # .swiftpm
92 |
93 | .build/
94 |
95 | # CocoaPods
96 | # We recommend against adding the Pods directory to your .gitignore. However
97 | # you should judge for yourself, the pros and cons are mentioned at:
98 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
99 | # Pods/
100 | # Add this line if you want to avoid checking in source code from the Xcode workspace
101 | # *.xcworkspace
102 |
103 | # Carthage
104 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
105 | # Carthage/Checkouts
106 |
107 | Carthage/Build/
108 |
109 | # Accio dependency management
110 | Dependencies/
111 | .accio/
112 |
113 | # fastlane
114 | # It is recommended to not store the screenshots in the git repo.
115 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
116 | # For more information about the recommended setup visit:
117 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
118 |
119 | fastlane/report.xml
120 | fastlane/Preview.html
121 | fastlane/screenshots/**/*.png
122 | fastlane/test_output
123 |
124 | # Code Injection
125 | # After new code Injection tools there's a generated folder /iOSInjectionProject
126 | # https://github.com/johnno1962/injectionforxcode
127 |
128 | iOSInjectionProject/
129 |
130 | ### Xcode ###
131 |
132 | ## Xcode 8 and earlier
133 |
134 | ### Xcode Patch ###
135 | *.xcodeproj/*
136 | !*.xcodeproj/project.pbxproj
137 | !*.xcodeproj/xcshareddata/
138 | !*.xcworkspace/contents.xcworkspacedata
139 | /*.gcno
140 | **/xcshareddata/WorkspaceSettings.xcsettings
141 |
142 | # End of https://www.toptal.com/developers/gitignore/api/macos,swift,xcode,cocoapods
--------------------------------------------------------------------------------
/reddot/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // reddot
4 | //
5 | // Created by Soongyu Kwon on 9/12/22.
6 | //
7 |
8 | import UIKit
9 | import SwiftUI
10 |
11 | struct ContentView: View {
12 | @State private var dotColour = Color.red
13 | @State private var showingAlert = false
14 | @State private var showingError = false
15 |
16 | var body: some View {
17 | VStack {
18 | Spacer()
19 | ZStack {
20 | Rectangle()
21 | .frame(width: 200, height: 100)
22 | .foregroundColor(Color(UIColor.systemGray6))
23 | .cornerRadius(20)
24 | ZStack(alignment: .topTrailing) {
25 | Text("Red Dot")
26 | .font(.largeTitle)
27 | .fontWeight(.bold)
28 | .padding(8)
29 | ZStack {
30 | Circle()
31 | .frame(width: 30)
32 | .foregroundColor(dotColour)
33 | Text("2")
34 | .foregroundColor(.white)
35 | }
36 | }.padding()
37 | .frame(width: 200, height: 100)
38 | }.frame(width: 200, height: 100)
39 |
40 | ColorPicker(selection: $dotColour) {
41 | Text("Badge colour")
42 | }.padding(.horizontal, 110)
43 |
44 | Spacer()
45 | if #available(iOS 15.0, *) {
46 | Text("made with ❤️ by Soongyu Kwon")
47 | .alert("Finished!", isPresented: $showingAlert
48 | ) {
49 | Button("Okay") {
50 | // handle retry action.
51 | }
52 | } message: {
53 | Text("Respring your device using TrollStore to apply changes.")
54 | }
55 | } else {
56 | Text("made with ❤️ by Soongyu Kwon")
57 | .alert(isPresented: $showingError) {
58 | Alert(title: Text("Error!"), message: Text("App is running in sandbox!\nPlease install it via TrollStore."), dismissButton: .default(Text("Dismiss")))
59 | }
60 | }
61 | HStack {
62 | Text("Follow me on")
63 | Link(destination: URL(string: "https://twitter.com/soongyu_kwon")!, label: {
64 | Text("Twitter")
65 | })
66 | Text("&")
67 | Link(destination: URL(string: "https://instagram.com/s8ngyu.kwon")!, label: {
68 | Text("Instagram")
69 | })
70 | }
71 | Spacer()
72 | .frame(height: 20)
73 | Button(action: {
74 | let fileManager = FileManager.default
75 | do {
76 | try fileManager.removeItem(atPath: "/var/mobile/Library/Caches/MappedImageCache/Persistent/SBIconBadgeView.BadgeBackground:26:26.cpbitmap")
77 | } catch {
78 | print("Failed to revert changes")
79 | }
80 | showingAlert.toggle()
81 | }) {
82 | Text("Revert changes")
83 | }.disabled(!isSandboxEscaped())
84 | if #available(iOS 15.0, *) {
85 | Button(action: {
86 | changeColour(colour: UIColor(dotColour))
87 | showingAlert.toggle()
88 | }) {
89 | Text("Apply")
90 | .frame(width: UIScreen.main.bounds.size.width-80)
91 | .padding()
92 | .foregroundColor(.white)
93 | }
94 | .background(Color.accentColor)
95 | .cornerRadius(25)
96 | .disabled(!isSandboxEscaped())
97 | .padding(.bottom)
98 | .alert("Finished!", isPresented: $showingAlert
99 | ) {
100 | Button("Okay") {
101 | // handle retry action.
102 | }
103 | } message: {
104 | Text("Respring your device using TrollStore to apply changes.")
105 | }
106 | } else {
107 | Button(action: {
108 | changeColour(colour: UIColor(dotColour))
109 | showingAlert.toggle()
110 | }) {
111 | Text("Apply")
112 | .frame(width: UIScreen.main.bounds.size.width-80)
113 | .padding()
114 | .foregroundColor(.white)
115 | }
116 | .background(Color.accentColor)
117 | .cornerRadius(25)
118 | .disabled(!isSandboxEscaped())
119 | .padding(.bottom)
120 | .alert(isPresented: $showingAlert) {
121 | Alert(title: Text("Finished!"), message: Text("Respring your device using TrollStore to apply changes."), dismissButton: .default(Text("Okay")))
122 | }
123 | }
124 | }
125 | .onAppear() {
126 | if !isSandboxEscaped() {
127 | showingError.toggle()
128 | }
129 | }
130 | }
131 | }
132 |
133 | func isSandboxEscaped() -> Bool {
134 | let fileManager = FileManager.default
135 | fileManager.createFile(atPath: "/var/mobile/me.soongyu.red-dot", contents: nil)
136 | if fileManager.fileExists(atPath: "/var/mobile/me.soongyu.red-dot") {
137 | do {
138 | try fileManager.removeItem(atPath: "/var/mobile/me.soongyu.red-dot")
139 | } catch {
140 | print("Failed to remove sandbox check file")
141 | }
142 | return true
143 | }
144 |
145 | return false
146 | }
147 |
148 | func changeColour(colour: UIColor) {
149 | var badge: UIImage = getRoundImage(12, 24, 24)!
150 |
151 | if UIDevice.current.userInterfaceIdiom == .pad {
152 | badge = getRoundImage(24, 48, 48)!
153 | }
154 |
155 | badge = changeImageColour(badge, colour)!
156 |
157 | let savePath = "/var/mobile/SBIconBadgeView.BadgeBackground:26:26.cpbitmap"
158 | let targetPath = "/var/mobile/Library/Caches/MappedImageCache/Persistent/SBIconBadgeView.BadgeBackground:26:26.cpbitmap"
159 |
160 | let helper = ObjCHelper()
161 | helper.image(toCPBitmap: badge, path: savePath)
162 |
163 | let fileManager = FileManager.default
164 | do {
165 | try fileManager.removeItem(atPath: targetPath)
166 | } catch {
167 | print("Failed to revert changes")
168 | }
169 | do {
170 | try fileManager.moveItem(atPath: savePath, toPath: targetPath)
171 | } catch {
172 | print("Failed to move item")
173 | }
174 | }
175 |
176 | func changeImageColour(_ src_image: UIImage?, _ color: UIColor?) -> UIImage? {
177 |
178 | let rect = CGRect(x: 0, y: 0, width: src_image?.size.width ?? 0.0, height: src_image?.size.height ?? 0.0)
179 | UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
180 | let context = UIGraphicsGetCurrentContext()
181 | if let CGImage = src_image?.cgImage {
182 | context?.clip(to: rect, mask: CGImage)
183 | }
184 | if let cgColor = color?.cgColor {
185 | context?.setFillColor(cgColor)
186 | }
187 | context?.fill(rect)
188 | let colorized_image = UIGraphicsGetImageFromCurrentImageContext()
189 | UIGraphicsEndImageContext()
190 |
191 | return colorized_image
192 | }
193 |
194 | func getRoundImage(_ radius: Int, _ width: Int, _ height: Int) -> UIImage? {
195 |
196 | let rect = CGRect(x: 0, y: 0, width: CGFloat(width), height: CGFloat(height))
197 | UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
198 | let context = UIGraphicsGetCurrentContext()
199 | context?.setFillColor(UIColor.black.cgColor)
200 | context?.fill(rect)
201 | let src_image = UIGraphicsGetImageFromCurrentImageContext()
202 | UIGraphicsEndImageContext()
203 |
204 | let image_layer = CALayer()
205 | image_layer.frame = CGRect(x: 0, y: 0, width: src_image?.size.width ?? 0.0, height: src_image?.size.height ?? 0.0)
206 | image_layer.contents = src_image?.cgImage
207 |
208 | image_layer.masksToBounds = true
209 | image_layer.cornerRadius = CGFloat(radius)
210 |
211 | UIGraphicsBeginImageContextWithOptions(src_image?.size ?? CGSize.zero, false, 0.0)
212 | if let aContext = UIGraphicsGetCurrentContext() {
213 | image_layer.render(in: aContext)
214 | }
215 | let rounded_image = UIGraphicsGetImageFromCurrentImageContext()
216 | UIGraphicsEndImageContext()
217 |
218 | return rounded_image
219 | }
220 |
221 | struct ContentView_Previews: PreviewProvider {
222 | static var previews: some View {
223 | ContentView()
224 | }
225 | }
226 |
--------------------------------------------------------------------------------
/reddot.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 8B0C622128CF088B00B6DF7C /* reddotApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0C622028CF088B00B6DF7C /* reddotApp.swift */; };
11 | 8B0C622328CF088B00B6DF7C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B0C622228CF088B00B6DF7C /* ContentView.swift */; };
12 | 8B0C622528CF088D00B6DF7C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8B0C622428CF088D00B6DF7C /* Assets.xcassets */; };
13 | 8B0C622828CF088D00B6DF7C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8B0C622728CF088D00B6DF7C /* Preview Assets.xcassets */; };
14 | 8B6542D428CF533C0081047A /* ObjCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6542D328CF533C0081047A /* ObjCHelper.m */; };
15 | /* End PBXBuildFile section */
16 |
17 | /* Begin PBXFileReference section */
18 | 8B0C621D28CF088B00B6DF7C /* reddot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = reddot.app; sourceTree = BUILT_PRODUCTS_DIR; };
19 | 8B0C622028CF088B00B6DF7C /* reddotApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = reddotApp.swift; sourceTree = ""; };
20 | 8B0C622228CF088B00B6DF7C /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
21 | 8B0C622428CF088D00B6DF7C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
22 | 8B0C622728CF088D00B6DF7C /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
23 | 8B6542D128CF533B0081047A /* reddot-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "reddot-Bridging-Header.h"; sourceTree = ""; };
24 | 8B6542D228CF533C0081047A /* ObjCHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ObjCHelper.h; sourceTree = ""; };
25 | 8B6542D328CF533C0081047A /* ObjCHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ObjCHelper.m; sourceTree = ""; };
26 | /* End PBXFileReference section */
27 |
28 | /* Begin PBXFrameworksBuildPhase section */
29 | 8B0C621A28CF088B00B6DF7C /* Frameworks */ = {
30 | isa = PBXFrameworksBuildPhase;
31 | buildActionMask = 2147483647;
32 | files = (
33 | );
34 | runOnlyForDeploymentPostprocessing = 0;
35 | };
36 | /* End PBXFrameworksBuildPhase section */
37 |
38 | /* Begin PBXGroup section */
39 | 8B0C621428CF088B00B6DF7C = {
40 | isa = PBXGroup;
41 | children = (
42 | 8B0C621F28CF088B00B6DF7C /* reddot */,
43 | 8B0C621E28CF088B00B6DF7C /* Products */,
44 | 8B6542D128CF533B0081047A /* reddot-Bridging-Header.h */,
45 | );
46 | sourceTree = "";
47 | };
48 | 8B0C621E28CF088B00B6DF7C /* Products */ = {
49 | isa = PBXGroup;
50 | children = (
51 | 8B0C621D28CF088B00B6DF7C /* reddot.app */,
52 | );
53 | name = Products;
54 | sourceTree = "";
55 | };
56 | 8B0C621F28CF088B00B6DF7C /* reddot */ = {
57 | isa = PBXGroup;
58 | children = (
59 | 8B0C622028CF088B00B6DF7C /* reddotApp.swift */,
60 | 8B6542D228CF533C0081047A /* ObjCHelper.h */,
61 | 8B6542D328CF533C0081047A /* ObjCHelper.m */,
62 | 8B0C622228CF088B00B6DF7C /* ContentView.swift */,
63 | 8B0C622428CF088D00B6DF7C /* Assets.xcassets */,
64 | 8B0C622628CF088D00B6DF7C /* Preview Content */,
65 | );
66 | path = reddot;
67 | sourceTree = "";
68 | };
69 | 8B0C622628CF088D00B6DF7C /* Preview Content */ = {
70 | isa = PBXGroup;
71 | children = (
72 | 8B0C622728CF088D00B6DF7C /* Preview Assets.xcassets */,
73 | );
74 | path = "Preview Content";
75 | sourceTree = "";
76 | };
77 | /* End PBXGroup section */
78 |
79 | /* Begin PBXNativeTarget section */
80 | 8B0C621C28CF088B00B6DF7C /* reddot */ = {
81 | isa = PBXNativeTarget;
82 | buildConfigurationList = 8B0C622B28CF088D00B6DF7C /* Build configuration list for PBXNativeTarget "reddot" */;
83 | buildPhases = (
84 | 8B0C621928CF088B00B6DF7C /* Sources */,
85 | 8B0C621A28CF088B00B6DF7C /* Frameworks */,
86 | 8B0C621B28CF088B00B6DF7C /* Resources */,
87 | );
88 | buildRules = (
89 | );
90 | dependencies = (
91 | );
92 | name = reddot;
93 | productName = reddot;
94 | productReference = 8B0C621D28CF088B00B6DF7C /* reddot.app */;
95 | productType = "com.apple.product-type.application";
96 | };
97 | /* End PBXNativeTarget section */
98 |
99 | /* Begin PBXProject section */
100 | 8B0C621528CF088B00B6DF7C /* Project object */ = {
101 | isa = PBXProject;
102 | attributes = {
103 | BuildIndependentTargetsInParallel = 1;
104 | LastSwiftUpdateCheck = 1400;
105 | LastUpgradeCheck = 1400;
106 | TargetAttributes = {
107 | 8B0C621C28CF088B00B6DF7C = {
108 | CreatedOnToolsVersion = 14.0;
109 | LastSwiftMigration = 1400;
110 | };
111 | };
112 | };
113 | buildConfigurationList = 8B0C621828CF088B00B6DF7C /* Build configuration list for PBXProject "reddot" */;
114 | compatibilityVersion = "Xcode 14.0";
115 | developmentRegion = en;
116 | hasScannedForEncodings = 0;
117 | knownRegions = (
118 | en,
119 | Base,
120 | );
121 | mainGroup = 8B0C621428CF088B00B6DF7C;
122 | productRefGroup = 8B0C621E28CF088B00B6DF7C /* Products */;
123 | projectDirPath = "";
124 | projectRoot = "";
125 | targets = (
126 | 8B0C621C28CF088B00B6DF7C /* reddot */,
127 | );
128 | };
129 | /* End PBXProject section */
130 |
131 | /* Begin PBXResourcesBuildPhase section */
132 | 8B0C621B28CF088B00B6DF7C /* Resources */ = {
133 | isa = PBXResourcesBuildPhase;
134 | buildActionMask = 2147483647;
135 | files = (
136 | 8B0C622828CF088D00B6DF7C /* Preview Assets.xcassets in Resources */,
137 | 8B0C622528CF088D00B6DF7C /* Assets.xcassets in Resources */,
138 | );
139 | runOnlyForDeploymentPostprocessing = 0;
140 | };
141 | /* End PBXResourcesBuildPhase section */
142 |
143 | /* Begin PBXSourcesBuildPhase section */
144 | 8B0C621928CF088B00B6DF7C /* Sources */ = {
145 | isa = PBXSourcesBuildPhase;
146 | buildActionMask = 2147483647;
147 | files = (
148 | 8B0C622328CF088B00B6DF7C /* ContentView.swift in Sources */,
149 | 8B6542D428CF533C0081047A /* ObjCHelper.m in Sources */,
150 | 8B0C622128CF088B00B6DF7C /* reddotApp.swift in Sources */,
151 | );
152 | runOnlyForDeploymentPostprocessing = 0;
153 | };
154 | /* End PBXSourcesBuildPhase section */
155 |
156 | /* Begin XCBuildConfiguration section */
157 | 8B0C622928CF088D00B6DF7C /* Debug */ = {
158 | isa = XCBuildConfiguration;
159 | buildSettings = {
160 | ALWAYS_SEARCH_USER_PATHS = NO;
161 | CLANG_ANALYZER_NONNULL = YES;
162 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
163 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
164 | CLANG_ENABLE_MODULES = YES;
165 | CLANG_ENABLE_OBJC_ARC = YES;
166 | CLANG_ENABLE_OBJC_WEAK = YES;
167 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
168 | CLANG_WARN_BOOL_CONVERSION = YES;
169 | CLANG_WARN_COMMA = YES;
170 | CLANG_WARN_CONSTANT_CONVERSION = YES;
171 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
172 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
173 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
174 | CLANG_WARN_EMPTY_BODY = YES;
175 | CLANG_WARN_ENUM_CONVERSION = YES;
176 | CLANG_WARN_INFINITE_RECURSION = YES;
177 | CLANG_WARN_INT_CONVERSION = YES;
178 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
179 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
180 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
181 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
182 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
183 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
184 | CLANG_WARN_STRICT_PROTOTYPES = YES;
185 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
186 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
187 | CLANG_WARN_UNREACHABLE_CODE = YES;
188 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
189 | COPY_PHASE_STRIP = NO;
190 | DEBUG_INFORMATION_FORMAT = dwarf;
191 | ENABLE_STRICT_OBJC_MSGSEND = YES;
192 | ENABLE_TESTABILITY = YES;
193 | GCC_C_LANGUAGE_STANDARD = gnu11;
194 | GCC_DYNAMIC_NO_PIC = NO;
195 | GCC_NO_COMMON_BLOCKS = YES;
196 | GCC_OPTIMIZATION_LEVEL = 0;
197 | GCC_PREPROCESSOR_DEFINITIONS = (
198 | "DEBUG=1",
199 | "$(inherited)",
200 | );
201 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
202 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
203 | GCC_WARN_UNDECLARED_SELECTOR = YES;
204 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
205 | GCC_WARN_UNUSED_FUNCTION = YES;
206 | GCC_WARN_UNUSED_VARIABLE = YES;
207 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
208 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
209 | MTL_FAST_MATH = YES;
210 | ONLY_ACTIVE_ARCH = YES;
211 | SDKROOT = iphoneos;
212 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
213 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
214 | };
215 | name = Debug;
216 | };
217 | 8B0C622A28CF088D00B6DF7C /* Release */ = {
218 | isa = XCBuildConfiguration;
219 | buildSettings = {
220 | ALWAYS_SEARCH_USER_PATHS = NO;
221 | CLANG_ANALYZER_NONNULL = YES;
222 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
223 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
224 | CLANG_ENABLE_MODULES = YES;
225 | CLANG_ENABLE_OBJC_ARC = YES;
226 | CLANG_ENABLE_OBJC_WEAK = YES;
227 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
228 | CLANG_WARN_BOOL_CONVERSION = YES;
229 | CLANG_WARN_COMMA = YES;
230 | CLANG_WARN_CONSTANT_CONVERSION = YES;
231 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
232 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
233 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
234 | CLANG_WARN_EMPTY_BODY = YES;
235 | CLANG_WARN_ENUM_CONVERSION = YES;
236 | CLANG_WARN_INFINITE_RECURSION = YES;
237 | CLANG_WARN_INT_CONVERSION = YES;
238 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
239 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
240 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
241 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
242 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
243 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
244 | CLANG_WARN_STRICT_PROTOTYPES = YES;
245 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
246 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
247 | CLANG_WARN_UNREACHABLE_CODE = YES;
248 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
249 | COPY_PHASE_STRIP = NO;
250 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
251 | ENABLE_NS_ASSERTIONS = NO;
252 | ENABLE_STRICT_OBJC_MSGSEND = YES;
253 | GCC_C_LANGUAGE_STANDARD = gnu11;
254 | GCC_NO_COMMON_BLOCKS = YES;
255 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
256 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
257 | GCC_WARN_UNDECLARED_SELECTOR = YES;
258 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
259 | GCC_WARN_UNUSED_FUNCTION = YES;
260 | GCC_WARN_UNUSED_VARIABLE = YES;
261 | IPHONEOS_DEPLOYMENT_TARGET = 14.0;
262 | MTL_ENABLE_DEBUG_INFO = NO;
263 | MTL_FAST_MATH = YES;
264 | SDKROOT = iphoneos;
265 | SWIFT_COMPILATION_MODE = wholemodule;
266 | SWIFT_OPTIMIZATION_LEVEL = "-O";
267 | VALIDATE_PRODUCT = YES;
268 | };
269 | name = Release;
270 | };
271 | 8B0C622C28CF088D00B6DF7C /* Debug */ = {
272 | isa = XCBuildConfiguration;
273 | buildSettings = {
274 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
275 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
276 | CLANG_ENABLE_MODULES = YES;
277 | CODE_SIGN_STYLE = Automatic;
278 | CURRENT_PROJECT_VERSION = 1;
279 | DEVELOPMENT_ASSET_PATHS = "\"reddot/Preview Content\"";
280 | DEVELOPMENT_TEAM = GK39GPB6KU;
281 | ENABLE_PREVIEWS = YES;
282 | GENERATE_INFOPLIST_FILE = YES;
283 | INFOPLIST_KEY_CFBundleDisplayName = "Red Dot";
284 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
285 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
286 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
287 | INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
288 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
289 | LD_RUNPATH_SEARCH_PATHS = (
290 | "$(inherited)",
291 | "@executable_path/Frameworks",
292 | );
293 | MARKETING_VERSION = 0.1;
294 | PRODUCT_BUNDLE_IDENTIFIER = me.soongyu.reddot;
295 | PRODUCT_NAME = "$(TARGET_NAME)";
296 | SWIFT_EMIT_LOC_STRINGS = YES;
297 | SWIFT_OBJC_BRIDGING_HEADER = "reddot-Bridging-Header.h";
298 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
299 | SWIFT_VERSION = 5.0;
300 | TARGETED_DEVICE_FAMILY = "1,2";
301 | };
302 | name = Debug;
303 | };
304 | 8B0C622D28CF088D00B6DF7C /* Release */ = {
305 | isa = XCBuildConfiguration;
306 | buildSettings = {
307 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
308 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
309 | CLANG_ENABLE_MODULES = YES;
310 | CODE_SIGN_STYLE = Automatic;
311 | CURRENT_PROJECT_VERSION = 1;
312 | DEVELOPMENT_ASSET_PATHS = "\"reddot/Preview Content\"";
313 | DEVELOPMENT_TEAM = GK39GPB6KU;
314 | ENABLE_PREVIEWS = YES;
315 | GENERATE_INFOPLIST_FILE = YES;
316 | INFOPLIST_KEY_CFBundleDisplayName = "Red Dot";
317 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
318 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
319 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
320 | INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
321 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
322 | LD_RUNPATH_SEARCH_PATHS = (
323 | "$(inherited)",
324 | "@executable_path/Frameworks",
325 | );
326 | MARKETING_VERSION = 0.1;
327 | PRODUCT_BUNDLE_IDENTIFIER = me.soongyu.reddot;
328 | PRODUCT_NAME = "$(TARGET_NAME)";
329 | SWIFT_EMIT_LOC_STRINGS = YES;
330 | SWIFT_OBJC_BRIDGING_HEADER = "reddot-Bridging-Header.h";
331 | SWIFT_VERSION = 5.0;
332 | TARGETED_DEVICE_FAMILY = "1,2";
333 | };
334 | name = Release;
335 | };
336 | /* End XCBuildConfiguration section */
337 |
338 | /* Begin XCConfigurationList section */
339 | 8B0C621828CF088B00B6DF7C /* Build configuration list for PBXProject "reddot" */ = {
340 | isa = XCConfigurationList;
341 | buildConfigurations = (
342 | 8B0C622928CF088D00B6DF7C /* Debug */,
343 | 8B0C622A28CF088D00B6DF7C /* Release */,
344 | );
345 | defaultConfigurationIsVisible = 0;
346 | defaultConfigurationName = Release;
347 | };
348 | 8B0C622B28CF088D00B6DF7C /* Build configuration list for PBXNativeTarget "reddot" */ = {
349 | isa = XCConfigurationList;
350 | buildConfigurations = (
351 | 8B0C622C28CF088D00B6DF7C /* Debug */,
352 | 8B0C622D28CF088D00B6DF7C /* Release */,
353 | );
354 | defaultConfigurationIsVisible = 0;
355 | defaultConfigurationName = Release;
356 | };
357 | /* End XCConfigurationList section */
358 | };
359 | rootObject = 8B0C621528CF088B00B6DF7C /* Project object */;
360 | }
361 |
--------------------------------------------------------------------------------