├── .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 | --------------------------------------------------------------------------------