├── .gitignore ├── Example Projects ├── FDKeychain Mac Example.xcodeproj │ └── project.pbxproj ├── FDKeychain Mac Example │ ├── Classes │ │ ├── AppDelegate.h │ │ └── AppDelegate.m │ ├── Resources │ │ ├── Credits.rtf │ │ ├── Images.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── icon_1024.png │ │ │ │ ├── icon_128.png │ │ │ │ ├── icon_16.png │ │ │ │ ├── icon_256.png │ │ │ │ ├── icon_32.png │ │ │ │ ├── icon_512.png │ │ │ │ └── icon_64.png │ │ └── InfoPlist.strings │ ├── Supporting Files │ │ ├── Entitlements.entitlements │ │ ├── Info.plist │ │ ├── Prefix.pch │ │ └── main.m │ └── Views │ │ └── MainMenu.xib ├── FDKeychain iOS Example.xcodeproj │ └── project.pbxproj └── FDKeychain iOS Example │ ├── Classes │ ├── AppDelegate.h │ ├── AppDelegate.m │ └── Controllers │ │ ├── FDRootViewController.h │ │ └── FDRootViewController.m │ ├── Keychain Alpha │ ├── Resources │ │ ├── Images.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── icon_ipad.png │ │ │ │ ├── icon_ipad@2x.png │ │ │ │ ├── icon_iphone@2x.png │ │ │ │ ├── icon_settings.png │ │ │ │ ├── icon_settings@2x.png │ │ │ │ ├── icon_spotlight.png │ │ │ │ └── icon_spotlight@2x.png │ │ ├── InfoPlist.strings │ │ ├── iTunesArtwork │ │ └── iTunesArtwork@2x │ └── Supporting Files │ │ ├── Entitlements.entitlements │ │ └── Info-Alpha.plist │ ├── Keychain Omega │ ├── Resources │ │ ├── Images.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── icon_ipad.png │ │ │ │ ├── icon_ipad@2x.png │ │ │ │ ├── icon_iphone@2x.png │ │ │ │ ├── icon_settings.png │ │ │ │ ├── icon_settings@2x.png │ │ │ │ ├── icon_spotlight.png │ │ │ │ └── icon_spotlight@2x.png │ │ ├── InfoPlist.strings │ │ ├── iTunesArtwork │ │ └── iTunesArtwork@2x │ └── Supporting Files │ │ ├── Entitlements.entitlements │ │ └── Info-Omega.plist │ ├── Keychain Pi │ ├── Resources │ │ ├── Images.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── icon_ipad.png │ │ │ │ ├── icon_ipad@2x.png │ │ │ │ ├── icon_iphone@2x.png │ │ │ │ ├── icon_settings.png │ │ │ │ ├── icon_settings@2x.png │ │ │ │ ├── icon_spotlight.png │ │ │ │ └── icon_spotlight@2x.png │ │ ├── InfoPlist.strings │ │ ├── iTunesArtwork │ │ └── iTunesArtwork@2x │ └── Supporting Files │ │ ├── Entitlements.entitlements │ │ └── Info-Pi.plist │ ├── Resources │ └── Images.xcassets │ │ └── LaunchImage.launchimage │ │ ├── Contents.json │ │ ├── launch_ipad_landscape.png │ │ ├── launch_ipad_landscape@2x.png │ │ ├── launch_ipad_portrait.png │ │ ├── launch_ipad_portrait@2x.png │ │ ├── launch_iphone@2x.png │ │ └── launch_iphone_r4@2x.png │ └── Supporting Files │ ├── Prefix.pch │ └── main.m ├── FDKeychain.podspec ├── FDKeychain.xcworkspace └── contents.xcworkspacedata ├── FDKeychain ├── FDKeychain.h └── FDKeychain.m ├── Framework Project ├── FDKeychain Tests │ ├── Classes │ │ └── FDKeychainTests.m │ └── Supporting Files │ │ └── Info.plist ├── FDKeychain.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── FDKeychain OS X.xcscheme │ │ ├── FDKeychain iOS.xcscheme │ │ ├── FDKeychain tVOS.xcscheme │ │ └── FDKeychain watchOS.xcscheme ├── OS X Supporting Files │ └── Info.plist ├── iOS Supporting Files │ └── Info.plist ├── tvOS Supporting Files │ └── Info.plist └── watchOS Supporting Files │ └── Info.plist ├── LICENSE.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | ._* 4 | .Spotlight-V100 5 | .Trashes 6 | 7 | # Xcode 8 | project.xcworkspace/ 9 | xcuserdata/ 10 | *.xccheckout 11 | *.xcscmblueprint 12 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 278233B519B67C76004D04A7 /* FDKeychain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278233B219B67C4E004D04A7 /* FDKeychain.framework */; }; 11 | 27CC278619B644C4006588D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 27CC278519B644C4006588D1 /* main.m */; }; 12 | 27CC278B19B644C4006588D1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 27CC278A19B644C4006588D1 /* Images.xcassets */; }; 13 | 27CC278D19B644C4006588D1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 27CC278C19B644C4006588D1 /* InfoPlist.strings */; }; 14 | 27CC278F19B644C4006588D1 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 27CC278E19B644C4006588D1 /* Credits.rtf */; }; 15 | 27CC279219B644C4006588D1 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 27CC279119B644C4006588D1 /* MainMenu.xib */; }; 16 | 27CC27A019B644C4006588D1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 27CC279F19B644C4006588D1 /* AppDelegate.m */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXContainerItemProxy section */ 20 | 2737F43F1BA4BF6800A4BF30 /* PBXContainerItemProxy */ = { 21 | isa = PBXContainerItemProxy; 22 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 23 | proxyType = 2; 24 | remoteGlobalIDString = 27FCB40C19C212D700BB1123; 25 | remoteInfo = "FDKeychain iOS"; 26 | }; 27 | 278233B119B67C4E004D04A7 /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 30 | proxyType = 2; 31 | remoteGlobalIDString = 2739252619B662790045EA4B; 32 | remoteInfo = "FDKeychain OS X"; 33 | }; 34 | 278233B319B67C74004D04A7 /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 37 | proxyType = 1; 38 | remoteGlobalIDString = 2739252519B662790045EA4B; 39 | remoteInfo = "FDKeychain OS X"; 40 | }; 41 | 27DDC17E1E136C4C000E03BC /* PBXContainerItemProxy */ = { 42 | isa = PBXContainerItemProxy; 43 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 44 | proxyType = 2; 45 | remoteGlobalIDString = 2737F44C1BA4C17E00A4BF30; 46 | remoteInfo = "FDKeychain watchOS"; 47 | }; 48 | 27DDC1801E136C4C000E03BC /* PBXContainerItemProxy */ = { 49 | isa = PBXContainerItemProxy; 50 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 51 | proxyType = 2; 52 | remoteGlobalIDString = 276FF8901CE9171C00C4CFDE; 53 | remoteInfo = "FDKeychain tvOS"; 54 | }; 55 | 27DDC1821E136C4C000E03BC /* PBXContainerItemProxy */ = { 56 | isa = PBXContainerItemProxy; 57 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 58 | proxyType = 2; 59 | remoteGlobalIDString = 2737F4541BA4C21F00A4BF30; 60 | remoteInfo = "FDKeychain iOS Tests"; 61 | }; 62 | 27DDC1841E136C4C000E03BC /* PBXContainerItemProxy */ = { 63 | isa = PBXContainerItemProxy; 64 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 65 | proxyType = 2; 66 | remoteGlobalIDString = 2737F4631BA4C22600A4BF30; 67 | remoteInfo = "FDKeychain OS X Tests"; 68 | }; 69 | 27DDC1861E136C4C000E03BC /* PBXContainerItemProxy */ = { 70 | isa = PBXContainerItemProxy; 71 | containerPortal = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 72 | proxyType = 2; 73 | remoteGlobalIDString = 276FF8991CE9171C00C4CFDE; 74 | remoteInfo = "FDKeychain tvOS Tests"; 75 | }; 76 | /* End PBXContainerItemProxy section */ 77 | 78 | /* Begin PBXFileReference section */ 79 | 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = FDKeychain.xcodeproj; path = "../../Framework Project/FDKeychain.xcodeproj"; sourceTree = ""; }; 80 | 279CE4F819B654E200FDA91D /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 81 | 279CE4FB19B654E200FDA91D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 82 | 279CE4FC19B654E200FDA91D /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 83 | 279CE4FD19B654E200FDA91D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 84 | 279CE50D19B654E200FDA91D /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 85 | 27CC277F19B644C4006588D1 /* FDKeychain Mac Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FDKeychain Mac Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | 27CC278319B644C4006588D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 87 | 27CC278419B644C4006588D1 /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; 88 | 27CC278519B644C4006588D1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 89 | 27CC278719B644C4006588D1 /* Entitlements.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Entitlements.entitlements; sourceTree = ""; }; 90 | 27CC278A19B644C4006588D1 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 91 | 27CC278C19B644C4006588D1 /* InfoPlist.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = InfoPlist.strings; sourceTree = ""; }; 92 | 27CC278E19B644C4006588D1 /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 93 | 27CC279119B644C4006588D1 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 94 | 27CC279E19B644C4006588D1 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 95 | 27CC279F19B644C4006588D1 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 96 | /* End PBXFileReference section */ 97 | 98 | /* Begin PBXFrameworksBuildPhase section */ 99 | 27CC277C19B644C4006588D1 /* Frameworks */ = { 100 | isa = PBXFrameworksBuildPhase; 101 | buildActionMask = 2147483647; 102 | files = ( 103 | 278233B519B67C76004D04A7 /* FDKeychain.framework in Frameworks */, 104 | ); 105 | runOnlyForDeploymentPostprocessing = 0; 106 | }; 107 | /* End PBXFrameworksBuildPhase section */ 108 | 109 | /* Begin PBXGroup section */ 110 | 278233AB19B67C4E004D04A7 /* Products */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 2737F4401BA4BF6800A4BF30 /* FDKeychain.framework */, 114 | 27DDC17F1E136C4C000E03BC /* FDKeychain.framework */, 115 | 27DDC1811E136C4C000E03BC /* FDKeychain.framework */, 116 | 278233B219B67C4E004D04A7 /* FDKeychain.framework */, 117 | 27DDC1831E136C4C000E03BC /* FDKeychain iOS Tests.xctest */, 118 | 27DDC1851E136C4C000E03BC /* FDKeychain OS X Tests.xctest */, 119 | 27DDC1871E136C4C000E03BC /* FDKeychain tvOS Tests.xctest */, 120 | ); 121 | name = Products; 122 | sourceTree = ""; 123 | }; 124 | 279CE4F719B654E200FDA91D /* Frameworks */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 279CE4F819B654E200FDA91D /* Cocoa.framework */, 128 | 279CE50D19B654E200FDA91D /* XCTest.framework */, 129 | 279CE4FA19B654E200FDA91D /* Other Frameworks */, 130 | ); 131 | name = Frameworks; 132 | sourceTree = ""; 133 | }; 134 | 279CE4FA19B654E200FDA91D /* Other Frameworks */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 279CE4FB19B654E200FDA91D /* Foundation.framework */, 138 | 279CE4FC19B654E200FDA91D /* CoreData.framework */, 139 | 279CE4FD19B654E200FDA91D /* AppKit.framework */, 140 | ); 141 | name = "Other Frameworks"; 142 | sourceTree = ""; 143 | }; 144 | 27CC277619B644C4006588D1 = { 145 | isa = PBXGroup; 146 | children = ( 147 | 27CC278119B644C4006588D1 /* FDKeychain Mac Example */, 148 | 27CC278819B644C4006588D1 /* Vendors */, 149 | 279CE4F719B654E200FDA91D /* Frameworks */, 150 | 27CC278019B644C4006588D1 /* Products */, 151 | ); 152 | sourceTree = ""; 153 | usesTabs = 1; 154 | }; 155 | 27CC278019B644C4006588D1 /* Products */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 27CC277F19B644C4006588D1 /* FDKeychain Mac Example.app */, 159 | ); 160 | name = Products; 161 | sourceTree = ""; 162 | }; 163 | 27CC278119B644C4006588D1 /* FDKeychain Mac Example */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 27CC279519B644C4006588D1 /* Classes */, 167 | 27CC279019B644C4006588D1 /* Views */, 168 | 27CC278919B644C4006588D1 /* Resources */, 169 | 27CC278219B644C4006588D1 /* Supporting Files */, 170 | ); 171 | path = "FDKeychain Mac Example"; 172 | sourceTree = ""; 173 | }; 174 | 27CC278219B644C4006588D1 /* Supporting Files */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | 27CC278319B644C4006588D1 /* Info.plist */, 178 | 27CC278419B644C4006588D1 /* Prefix.pch */, 179 | 27CC278519B644C4006588D1 /* main.m */, 180 | 27CC278719B644C4006588D1 /* Entitlements.entitlements */, 181 | ); 182 | path = "Supporting Files"; 183 | sourceTree = ""; 184 | }; 185 | 27CC278819B644C4006588D1 /* Vendors */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */, 189 | ); 190 | name = Vendors; 191 | path = "FDKeychain Mac Example"; 192 | sourceTree = ""; 193 | }; 194 | 27CC278919B644C4006588D1 /* Resources */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | 27CC278A19B644C4006588D1 /* Images.xcassets */, 198 | 27CC278C19B644C4006588D1 /* InfoPlist.strings */, 199 | 27CC278E19B644C4006588D1 /* Credits.rtf */, 200 | ); 201 | path = Resources; 202 | sourceTree = ""; 203 | }; 204 | 27CC279019B644C4006588D1 /* Views */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | 27CC279119B644C4006588D1 /* MainMenu.xib */, 208 | ); 209 | path = Views; 210 | sourceTree = ""; 211 | }; 212 | 27CC279519B644C4006588D1 /* Classes */ = { 213 | isa = PBXGroup; 214 | children = ( 215 | 27CC279E19B644C4006588D1 /* AppDelegate.h */, 216 | 27CC279F19B644C4006588D1 /* AppDelegate.m */, 217 | ); 218 | path = Classes; 219 | sourceTree = ""; 220 | }; 221 | /* End PBXGroup section */ 222 | 223 | /* Begin PBXNativeTarget section */ 224 | 27CC277E19B644C4006588D1 /* FDKeychain Mac Example */ = { 225 | isa = PBXNativeTarget; 226 | buildConfigurationList = 27CC27A419B644C4006588D1 /* Build configuration list for PBXNativeTarget "FDKeychain Mac Example" */; 227 | buildPhases = ( 228 | 27CC277B19B644C4006588D1 /* Sources */, 229 | 27CC277C19B644C4006588D1 /* Frameworks */, 230 | 27CC277D19B644C4006588D1 /* Resources */, 231 | ); 232 | buildRules = ( 233 | ); 234 | dependencies = ( 235 | 278233B419B67C74004D04A7 /* PBXTargetDependency */, 236 | ); 237 | name = "FDKeychain Mac Example"; 238 | productName = "FDKeychain Mac Example"; 239 | productReference = 27CC277F19B644C4006588D1 /* FDKeychain Mac Example.app */; 240 | productType = "com.apple.product-type.application"; 241 | }; 242 | /* End PBXNativeTarget section */ 243 | 244 | /* Begin PBXProject section */ 245 | 27CC277719B644C4006588D1 /* Project object */ = { 246 | isa = PBXProject; 247 | attributes = { 248 | CLASSPREFIX = FD; 249 | LastUpgradeCheck = 0700; 250 | TargetAttributes = { 251 | 27CC277E19B644C4006588D1 = { 252 | DevelopmentTeam = 7VTD8EK7Z4; 253 | }; 254 | }; 255 | }; 256 | buildConfigurationList = 27CC277A19B644C4006588D1 /* Build configuration list for PBXProject "FDKeychain Mac Example" */; 257 | compatibilityVersion = "Xcode 3.2"; 258 | developmentRegion = English; 259 | hasScannedForEncodings = 0; 260 | knownRegions = ( 261 | en, 262 | ); 263 | mainGroup = 27CC277619B644C4006588D1; 264 | productRefGroup = 27CC278019B644C4006588D1 /* Products */; 265 | projectDirPath = ""; 266 | projectReferences = ( 267 | { 268 | ProductGroup = 278233AB19B67C4E004D04A7 /* Products */; 269 | ProjectRef = 27020FBA19B64C6C00660AEC /* FDKeychain.xcodeproj */; 270 | }, 271 | ); 272 | projectRoot = ""; 273 | targets = ( 274 | 27CC277E19B644C4006588D1 /* FDKeychain Mac Example */, 275 | ); 276 | }; 277 | /* End PBXProject section */ 278 | 279 | /* Begin PBXReferenceProxy section */ 280 | 2737F4401BA4BF6800A4BF30 /* FDKeychain.framework */ = { 281 | isa = PBXReferenceProxy; 282 | fileType = wrapper.framework; 283 | path = FDKeychain.framework; 284 | remoteRef = 2737F43F1BA4BF6800A4BF30 /* PBXContainerItemProxy */; 285 | sourceTree = BUILT_PRODUCTS_DIR; 286 | }; 287 | 278233B219B67C4E004D04A7 /* FDKeychain.framework */ = { 288 | isa = PBXReferenceProxy; 289 | fileType = wrapper.framework; 290 | path = FDKeychain.framework; 291 | remoteRef = 278233B119B67C4E004D04A7 /* PBXContainerItemProxy */; 292 | sourceTree = BUILT_PRODUCTS_DIR; 293 | }; 294 | 27DDC17F1E136C4C000E03BC /* FDKeychain.framework */ = { 295 | isa = PBXReferenceProxy; 296 | fileType = wrapper.framework; 297 | path = FDKeychain.framework; 298 | remoteRef = 27DDC17E1E136C4C000E03BC /* PBXContainerItemProxy */; 299 | sourceTree = BUILT_PRODUCTS_DIR; 300 | }; 301 | 27DDC1811E136C4C000E03BC /* FDKeychain.framework */ = { 302 | isa = PBXReferenceProxy; 303 | fileType = wrapper.framework; 304 | path = FDKeychain.framework; 305 | remoteRef = 27DDC1801E136C4C000E03BC /* PBXContainerItemProxy */; 306 | sourceTree = BUILT_PRODUCTS_DIR; 307 | }; 308 | 27DDC1831E136C4C000E03BC /* FDKeychain iOS Tests.xctest */ = { 309 | isa = PBXReferenceProxy; 310 | fileType = wrapper.cfbundle; 311 | path = "FDKeychain iOS Tests.xctest"; 312 | remoteRef = 27DDC1821E136C4C000E03BC /* PBXContainerItemProxy */; 313 | sourceTree = BUILT_PRODUCTS_DIR; 314 | }; 315 | 27DDC1851E136C4C000E03BC /* FDKeychain OS X Tests.xctest */ = { 316 | isa = PBXReferenceProxy; 317 | fileType = wrapper.cfbundle; 318 | path = "FDKeychain OS X Tests.xctest"; 319 | remoteRef = 27DDC1841E136C4C000E03BC /* PBXContainerItemProxy */; 320 | sourceTree = BUILT_PRODUCTS_DIR; 321 | }; 322 | 27DDC1871E136C4C000E03BC /* FDKeychain tvOS Tests.xctest */ = { 323 | isa = PBXReferenceProxy; 324 | fileType = wrapper.cfbundle; 325 | path = "FDKeychain tvOS Tests.xctest"; 326 | remoteRef = 27DDC1861E136C4C000E03BC /* PBXContainerItemProxy */; 327 | sourceTree = BUILT_PRODUCTS_DIR; 328 | }; 329 | /* End PBXReferenceProxy section */ 330 | 331 | /* Begin PBXResourcesBuildPhase section */ 332 | 27CC277D19B644C4006588D1 /* Resources */ = { 333 | isa = PBXResourcesBuildPhase; 334 | buildActionMask = 2147483647; 335 | files = ( 336 | 27CC278B19B644C4006588D1 /* Images.xcassets in Resources */, 337 | 27CC278F19B644C4006588D1 /* Credits.rtf in Resources */, 338 | 27CC278D19B644C4006588D1 /* InfoPlist.strings in Resources */, 339 | 27CC279219B644C4006588D1 /* MainMenu.xib in Resources */, 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | }; 343 | /* End PBXResourcesBuildPhase section */ 344 | 345 | /* Begin PBXSourcesBuildPhase section */ 346 | 27CC277B19B644C4006588D1 /* Sources */ = { 347 | isa = PBXSourcesBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | 27CC27A019B644C4006588D1 /* AppDelegate.m in Sources */, 351 | 27CC278619B644C4006588D1 /* main.m in Sources */, 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | }; 355 | /* End PBXSourcesBuildPhase section */ 356 | 357 | /* Begin PBXTargetDependency section */ 358 | 278233B419B67C74004D04A7 /* PBXTargetDependency */ = { 359 | isa = PBXTargetDependency; 360 | name = "FDKeychain OS X"; 361 | targetProxy = 278233B319B67C74004D04A7 /* PBXContainerItemProxy */; 362 | }; 363 | /* End PBXTargetDependency section */ 364 | 365 | /* Begin XCBuildConfiguration section */ 366 | 27CC27A119B644C4006588D1 /* Ad Hoc */ = { 367 | isa = XCBuildConfiguration; 368 | buildSettings = { 369 | ALWAYS_SEARCH_USER_PATHS = NO; 370 | BUNDLE_IDENTIFIER = "com.1414degrees.FDKeychain-Mac-Example.adhoc"; 371 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 372 | CLANG_CXX_LIBRARY = "libc++"; 373 | CLANG_ENABLE_MODULES = YES; 374 | CLANG_ENABLE_OBJC_ARC = YES; 375 | CLANG_WARN_BOOL_CONVERSION = YES; 376 | CLANG_WARN_CONSTANT_CONVERSION = YES; 377 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 378 | CLANG_WARN_EMPTY_BODY = YES; 379 | CLANG_WARN_ENUM_CONVERSION = YES; 380 | CLANG_WARN_INT_CONVERSION = YES; 381 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 382 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 383 | CODE_SIGN_ENTITLEMENTS = "FDKeychain Mac Example/Supporting Files/Entitlements.entitlements"; 384 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Distribution"; 385 | COPY_PHASE_STRIP = NO; 386 | GCC_C_LANGUAGE_STANDARD = gnu99; 387 | GCC_PREPROCESSOR_DEFINITIONS = AD_HOC; 388 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 389 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 390 | GCC_WARN_UNDECLARED_SELECTOR = YES; 391 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 392 | GCC_WARN_UNUSED_FUNCTION = YES; 393 | GCC_WARN_UNUSED_VARIABLE = YES; 394 | HEADER_SEARCH_PATHS = "\"$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)\"/**"; 395 | MACOSX_DEPLOYMENT_TARGET = 10.9; 396 | SDKROOT = macosx; 397 | USER_HEADER_SEARCH_PATHS = "\"$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)\"/**"; 398 | VALIDATE_PRODUCT = YES; 399 | }; 400 | name = "Ad Hoc"; 401 | }; 402 | 27CC27A219B644C4006588D1 /* App Store */ = { 403 | isa = XCBuildConfiguration; 404 | buildSettings = { 405 | ALWAYS_SEARCH_USER_PATHS = NO; 406 | BUNDLE_IDENTIFIER = "com.1414degrees.FDKeychain-Mac-Example"; 407 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 408 | CLANG_CXX_LIBRARY = "libc++"; 409 | CLANG_ENABLE_MODULES = YES; 410 | CLANG_ENABLE_OBJC_ARC = YES; 411 | CLANG_WARN_BOOL_CONVERSION = YES; 412 | CLANG_WARN_CONSTANT_CONVERSION = YES; 413 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 414 | CLANG_WARN_EMPTY_BODY = YES; 415 | CLANG_WARN_ENUM_CONVERSION = YES; 416 | CLANG_WARN_INT_CONVERSION = YES; 417 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 418 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 419 | CODE_SIGN_ENTITLEMENTS = "FDKeychain Mac Example/Supporting Files/Entitlements.entitlements"; 420 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Distribution"; 421 | COPY_PHASE_STRIP = YES; 422 | ENABLE_NS_ASSERTIONS = NO; 423 | GCC_C_LANGUAGE_STANDARD = gnu99; 424 | GCC_PREPROCESSOR_DEFINITIONS = APP_STORE; 425 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 426 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 427 | GCC_WARN_UNDECLARED_SELECTOR = YES; 428 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 429 | GCC_WARN_UNUSED_FUNCTION = YES; 430 | GCC_WARN_UNUSED_VARIABLE = YES; 431 | HEADER_SEARCH_PATHS = "\"$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)\"/**"; 432 | MACOSX_DEPLOYMENT_TARGET = 10.9; 433 | SDKROOT = macosx; 434 | USER_HEADER_SEARCH_PATHS = "\"$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)\"/**"; 435 | VALIDATE_PRODUCT = YES; 436 | }; 437 | name = "App Store"; 438 | }; 439 | 27CC27A319B644C4006588D1 /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | ALWAYS_SEARCH_USER_PATHS = NO; 443 | BUNDLE_IDENTIFIER = "com.1414degrees.FDKeychain-Mac-Example.debug"; 444 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 445 | CLANG_CXX_LIBRARY = "libc++"; 446 | CLANG_ENABLE_MODULES = YES; 447 | CLANG_ENABLE_OBJC_ARC = YES; 448 | CLANG_WARN_BOOL_CONVERSION = YES; 449 | CLANG_WARN_CONSTANT_CONVERSION = YES; 450 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 451 | CLANG_WARN_EMPTY_BODY = YES; 452 | CLANG_WARN_ENUM_CONVERSION = YES; 453 | CLANG_WARN_INT_CONVERSION = YES; 454 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 455 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 456 | CODE_SIGN_ENTITLEMENTS = "FDKeychain Mac Example/Supporting Files/Entitlements.entitlements"; 457 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = ""; 458 | COPY_PHASE_STRIP = NO; 459 | ENABLE_TESTABILITY = YES; 460 | GCC_C_LANGUAGE_STANDARD = gnu99; 461 | GCC_DYNAMIC_NO_PIC = NO; 462 | GCC_OPTIMIZATION_LEVEL = 0; 463 | GCC_PREPROCESSOR_DEFINITIONS = DEBUG; 464 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 465 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 466 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 467 | GCC_WARN_UNDECLARED_SELECTOR = YES; 468 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 469 | GCC_WARN_UNUSED_FUNCTION = YES; 470 | GCC_WARN_UNUSED_VARIABLE = YES; 471 | MACOSX_DEPLOYMENT_TARGET = 10.9; 472 | ONLY_ACTIVE_ARCH = YES; 473 | SDKROOT = macosx; 474 | }; 475 | name = Debug; 476 | }; 477 | 27CC27A519B644C4006588D1 /* Ad Hoc */ = { 478 | isa = XCBuildConfiguration; 479 | buildSettings = { 480 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 481 | COMBINE_HIDPI_IMAGES = YES; 482 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 483 | GCC_PREFIX_HEADER = "FDKeychain Mac Example/Supporting Files/Prefix.pch"; 484 | INFOPLIST_FILE = "FDKeychain Mac Example/Supporting Files/Info.plist"; 485 | PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; 486 | PRODUCT_NAME = "$(TARGET_NAME)"; 487 | }; 488 | name = "Ad Hoc"; 489 | }; 490 | 27CC27A619B644C4006588D1 /* App Store */ = { 491 | isa = XCBuildConfiguration; 492 | buildSettings = { 493 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 494 | COMBINE_HIDPI_IMAGES = YES; 495 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 496 | GCC_PREFIX_HEADER = "FDKeychain Mac Example/Supporting Files/Prefix.pch"; 497 | INFOPLIST_FILE = "FDKeychain Mac Example/Supporting Files/Info.plist"; 498 | PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; 499 | PRODUCT_NAME = "$(TARGET_NAME)"; 500 | }; 501 | name = "App Store"; 502 | }; 503 | 27CC27A719B644C4006588D1 /* Debug */ = { 504 | isa = XCBuildConfiguration; 505 | buildSettings = { 506 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 507 | COMBINE_HIDPI_IMAGES = YES; 508 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 509 | GCC_PREFIX_HEADER = "FDKeychain Mac Example/Supporting Files/Prefix.pch"; 510 | INFOPLIST_FILE = "FDKeychain Mac Example/Supporting Files/Info.plist"; 511 | PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_IDENTIFIER}"; 512 | PRODUCT_NAME = "$(TARGET_NAME)"; 513 | }; 514 | name = Debug; 515 | }; 516 | /* End XCBuildConfiguration section */ 517 | 518 | /* Begin XCConfigurationList section */ 519 | 27CC277A19B644C4006588D1 /* Build configuration list for PBXProject "FDKeychain Mac Example" */ = { 520 | isa = XCConfigurationList; 521 | buildConfigurations = ( 522 | 27CC27A119B644C4006588D1 /* Ad Hoc */, 523 | 27CC27A219B644C4006588D1 /* App Store */, 524 | 27CC27A319B644C4006588D1 /* Debug */, 525 | ); 526 | defaultConfigurationIsVisible = 0; 527 | defaultConfigurationName = "Ad Hoc"; 528 | }; 529 | 27CC27A419B644C4006588D1 /* Build configuration list for PBXNativeTarget "FDKeychain Mac Example" */ = { 530 | isa = XCConfigurationList; 531 | buildConfigurations = ( 532 | 27CC27A519B644C4006588D1 /* Ad Hoc */, 533 | 27CC27A619B644C4006588D1 /* App Store */, 534 | 27CC27A719B644C4006588D1 /* Debug */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = "Ad Hoc"; 538 | }; 539 | /* End XCConfigurationList section */ 540 | }; 541 | rootObject = 27CC277719B644C4006588D1 /* Project object */; 542 | } 543 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Classes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #pragma mark Class Interface 2 | 3 | @interface AppDelegate : NSObject< 4 | NSApplicationDelegate, 5 | NSTextFieldDelegate> 6 | 7 | 8 | #pragma mark - Properties 9 | 10 | @property (nonatomic, weak) IBOutlet NSWindow *window; 11 | @property (nonatomic, weak) IBOutlet NSTextField *passwordTextField; 12 | 13 | 14 | @end -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Classes/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | 4 | #pragma mark Constants 5 | 6 | static NSString * const KeychainItem_Service = @"FDKeychain"; 7 | static NSString * const KeychainItem_Key_LocalPassword = @"Local"; 8 | 9 | 10 | #pragma mark - Class Definition 11 | 12 | @implementation AppDelegate 13 | 14 | 15 | #pragma mark - NSApplicationDelegate Methods 16 | 17 | - (void)applicationDidFinishLaunching: (NSNotification *)notification 18 | { 19 | } 20 | 21 | - (BOOL)applicationShouldTerminateAfterLastWindowClosed: (NSApplication *)sender 22 | { 23 | return YES; 24 | } 25 | 26 | 27 | #pragma mark - NSTextFieldDelegate Methods 28 | 29 | - (void)controlTextDidChange: (NSNotification *)notification 30 | { 31 | NSString *passwordToSave = [_passwordTextField stringValue]; 32 | 33 | NSError *error = nil; 34 | 35 | if ([passwordToSave length] == 0) 36 | { 37 | [FDKeychain deleteItemForKey: KeychainItem_Key_LocalPassword 38 | forService: KeychainItem_Service 39 | error: &error]; 40 | 41 | if (error != nil) 42 | { 43 | NSLog(@"Error occured while attempting to delete from the keychain:\t%@", error); 44 | } 45 | } 46 | else 47 | { 48 | [FDKeychain saveItem: passwordToSave 49 | forKey: KeychainItem_Key_LocalPassword 50 | forService: KeychainItem_Service 51 | error: &error]; 52 | 53 | if (error != nil) 54 | { 55 | NSLog(@"Error occured while attempting to save to the keychain:\t%@", error); 56 | } 57 | } 58 | } 59 | 60 | 61 | #pragma mark - Private Methods 62 | 63 | 64 | @end -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} 2 | {\colortbl;\red255\green255\blue255;} 3 | \paperw9840\paperh8400 4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 5 | 6 | \f0\b\fs24 \cf0 Engineering: 7 | \b0 \ 8 | Some people\ 9 | \ 10 | 11 | \b Human Interface Design: 12 | \b0 \ 13 | Some other people\ 14 | \ 15 | 16 | \b Testing: 17 | \b0 \ 18 | Hopefully not nobody\ 19 | \ 20 | 21 | \b Documentation: 22 | \b0 \ 23 | Whoever\ 24 | \ 25 | 26 | \b With special thanks to: 27 | \b0 \ 28 | Mom\ 29 | } 30 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_1024.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_128.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_16.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_256.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_32.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_512.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain Mac Example/Resources/Images.xcassets/AppIcon.appiconset/icon_64.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Resources/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "CFBundleName" = "FDKeychain_Mac_Example"; 2 | 3 | "CFBundleDisplayName" = "FDKeychain_Mac_Example"; 4 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Supporting Files/Entitlements.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | keychain-access-groups 8 | 9 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleVersion 20 | 0 21 | LSApplicationCategoryType 22 | 23 | LSMinimumSystemVersion 24 | ${MACOSX_DEPLOYMENT_TARGET} 25 | NSMainNibFile 26 | MainMenu 27 | NSPrincipalClass 28 | NSApplication 29 | 30 | 31 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Supporting Files/Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files in the 'FDKeychain Mac Example' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | @import Foundation; 7 | @import QuartzCore; 8 | @import AppKit; 9 | 10 | #import 11 | #endif 12 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain Mac Example/Supporting Files/main.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | 4 | int main(int argc, const char *argv[]) 5 | { 6 | return NSApplicationMain(argc, argv); 7 | } -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 07C5BFDF154652EF0018C348 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 07D974DD1544F878005B4023 /* main.m */; }; 11 | 07C5C007154652F10018C348 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 07D974DD1544F878005B4023 /* main.m */; }; 12 | 07D974DE1544F878005B4023 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 07D974DD1544F878005B4023 /* main.m */; }; 13 | 2719737119AFBBB500F12FCF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2719736D19AFBBB500F12FCF /* AppDelegate.m */; }; 14 | 2719737219AFBBB500F12FCF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2719736D19AFBBB500F12FCF /* AppDelegate.m */; }; 15 | 2719737319AFBBB500F12FCF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2719736D19AFBBB500F12FCF /* AppDelegate.m */; }; 16 | 2719737419AFBBB500F12FCF /* FDRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2719737019AFBBB500F12FCF /* FDRootViewController.m */; }; 17 | 2719737519AFBBB500F12FCF /* FDRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2719737019AFBBB500F12FCF /* FDRootViewController.m */; }; 18 | 2719737619AFBBB500F12FCF /* FDRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2719737019AFBBB500F12FCF /* FDRootViewController.m */; }; 19 | 2719737919AFBBC200F12FCF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2719737819AFBBC200F12FCF /* Images.xcassets */; }; 20 | 2719737A19AFBBC200F12FCF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2719737819AFBBC200F12FCF /* Images.xcassets */; }; 21 | 2719737B19AFBBC200F12FCF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2719737819AFBBC200F12FCF /* Images.xcassets */; }; 22 | 2719738119AFBC5000F12FCF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2719737D19AFBC5000F12FCF /* Images.xcassets */; }; 23 | 2719738219AFBC5000F12FCF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2719737E19AFBC5000F12FCF /* InfoPlist.strings */; }; 24 | 2719738319AFBC5000F12FCF /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 2719737F19AFBC5000F12FCF /* iTunesArtwork */; }; 25 | 2719738419AFBC5000F12FCF /* iTunesArtwork@2x in Resources */ = {isa = PBXBuildFile; fileRef = 2719738019AFBC5000F12FCF /* iTunesArtwork@2x */; }; 26 | 2719738A19AFBC5D00F12FCF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2719738619AFBC5D00F12FCF /* Images.xcassets */; }; 27 | 2719738B19AFBC5D00F12FCF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2719738719AFBC5D00F12FCF /* InfoPlist.strings */; }; 28 | 2719738C19AFBC5D00F12FCF /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 2719738819AFBC5D00F12FCF /* iTunesArtwork */; }; 29 | 2719738D19AFBC5D00F12FCF /* iTunesArtwork@2x in Resources */ = {isa = PBXBuildFile; fileRef = 2719738919AFBC5D00F12FCF /* iTunesArtwork@2x */; }; 30 | 2719739319AFBC6F00F12FCF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2719738F19AFBC6F00F12FCF /* Images.xcassets */; }; 31 | 2719739419AFBC6F00F12FCF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2719739019AFBC6F00F12FCF /* InfoPlist.strings */; }; 32 | 2719739519AFBC6F00F12FCF /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 2719739119AFBC6F00F12FCF /* iTunesArtwork */; }; 33 | 2719739619AFBC6F00F12FCF /* iTunesArtwork@2x in Resources */ = {isa = PBXBuildFile; fileRef = 2719739219AFBC6F00F12FCF /* iTunesArtwork@2x */; }; 34 | /* End PBXBuildFile section */ 35 | 36 | /* Begin PBXContainerItemProxy section */ 37 | 2737200E19B67C1E00D235F4 /* PBXContainerItemProxy */ = { 38 | isa = PBXContainerItemProxy; 39 | containerPortal = 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */; 40 | proxyType = 2; 41 | remoteGlobalIDString = 2739252619B662790045EA4B; 42 | remoteInfo = "FDKeychain OS X"; 43 | }; 44 | 27FCB42719C2144900BB1123 /* PBXContainerItemProxy */ = { 45 | isa = PBXContainerItemProxy; 46 | containerPortal = 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */; 47 | proxyType = 2; 48 | remoteGlobalIDString = 27FCB40C19C212D700BB1123; 49 | remoteInfo = "FDKeychain iOS"; 50 | }; 51 | 27FCB42919C2145B00BB1123 /* PBXContainerItemProxy */ = { 52 | isa = PBXContainerItemProxy; 53 | containerPortal = 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */; 54 | proxyType = 1; 55 | remoteGlobalIDString = 27FCB40B19C212D700BB1123; 56 | remoteInfo = "FDKeychain iOS"; 57 | }; 58 | 27FCB42B19C2145E00BB1123 /* PBXContainerItemProxy */ = { 59 | isa = PBXContainerItemProxy; 60 | containerPortal = 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */; 61 | proxyType = 1; 62 | remoteGlobalIDString = 27FCB40B19C212D700BB1123; 63 | remoteInfo = "FDKeychain iOS"; 64 | }; 65 | 27FCB42D19C2146200BB1123 /* PBXContainerItemProxy */ = { 66 | isa = PBXContainerItemProxy; 67 | containerPortal = 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */; 68 | proxyType = 1; 69 | remoteGlobalIDString = 27FCB40B19C212D700BB1123; 70 | remoteInfo = "FDKeychain iOS"; 71 | }; 72 | /* End PBXContainerItemProxy section */ 73 | 74 | /* Begin PBXFileReference section */ 75 | 0760B4621546FBDD00AC1232 /* Entitlements.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Entitlements.entitlements; sourceTree = ""; }; 76 | 0760B4641546FBEF00AC1232 /* Entitlements.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Entitlements.entitlements; sourceTree = ""; }; 77 | 0760B4651546FC0C00AC1232 /* Entitlements.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Entitlements.entitlements; sourceTree = ""; }; 78 | 07C5C002154652EF0018C348 /* Keychain Pi.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Keychain Pi.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 79 | 07C5C02A154652F10018C348 /* Keychain Omega.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Keychain Omega.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 80 | 07D974CD1544F877005B4023 /* Keychain Alpha.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Keychain Alpha.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 81 | 07D974DC1544F877005B4023 /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; 82 | 07D974DD1544F878005B4023 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 83 | 07D975461544FEE4005B4023 /* Info-Alpha.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Alpha.plist"; sourceTree = ""; }; 84 | 07D9755D1544FEE4005B4023 /* Info-Omega.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Omega.plist"; sourceTree = ""; }; 85 | 07D975741544FEE4005B4023 /* Info-Pi.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Pi.plist"; sourceTree = ""; }; 86 | 2719736C19AFBBB500F12FCF /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 87 | 2719736D19AFBBB500F12FCF /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 88 | 2719736F19AFBBB500F12FCF /* FDRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FDRootViewController.h; sourceTree = ""; }; 89 | 2719737019AFBBB500F12FCF /* FDRootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FDRootViewController.m; sourceTree = ""; }; 90 | 2719737819AFBBC200F12FCF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 91 | 2719737D19AFBC5000F12FCF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 92 | 2719737E19AFBC5000F12FCF /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = InfoPlist.strings; sourceTree = ""; }; 93 | 2719737F19AFBC5000F12FCF /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; 94 | 2719738019AFBC5000F12FCF /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 95 | 2719738619AFBC5D00F12FCF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 96 | 2719738719AFBC5D00F12FCF /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = InfoPlist.strings; sourceTree = ""; }; 97 | 2719738819AFBC5D00F12FCF /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; 98 | 2719738919AFBC5D00F12FCF /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 99 | 2719738F19AFBC6F00F12FCF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 100 | 2719739019AFBC6F00F12FCF /* InfoPlist.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = InfoPlist.strings; sourceTree = ""; }; 101 | 2719739119AFBC6F00F12FCF /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; 102 | 2719739219AFBC6F00F12FCF /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 103 | 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = FDKeychain.xcodeproj; path = "../Framework Project/FDKeychain.xcodeproj"; sourceTree = ""; }; 104 | /* End PBXFileReference section */ 105 | 106 | /* Begin PBXFrameworksBuildPhase section */ 107 | 07C5BFE3154652EF0018C348 /* Frameworks */ = { 108 | isa = PBXFrameworksBuildPhase; 109 | buildActionMask = 2147483647; 110 | files = ( 111 | ); 112 | runOnlyForDeploymentPostprocessing = 0; 113 | }; 114 | 07C5C00B154652F10018C348 /* Frameworks */ = { 115 | isa = PBXFrameworksBuildPhase; 116 | buildActionMask = 2147483647; 117 | files = ( 118 | ); 119 | runOnlyForDeploymentPostprocessing = 0; 120 | }; 121 | 07D974CA1544F877005B4023 /* Frameworks */ = { 122 | isa = PBXFrameworksBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | ); 126 | runOnlyForDeploymentPostprocessing = 0; 127 | }; 128 | /* End PBXFrameworksBuildPhase section */ 129 | 130 | /* Begin PBXGroup section */ 131 | 07CE04301613EC7000EC19FA /* Vendors */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */, 135 | ); 136 | name = Vendors; 137 | sourceTree = ""; 138 | }; 139 | 07D974C21544F877005B4023 = { 140 | isa = PBXGroup; 141 | children = ( 142 | 07D974D91544F877005B4023 /* FDKeychain iOS Example */, 143 | 07D975301544FEE4005B4023 /* Keychain Alpha */, 144 | 07D9755E1544FEE4005B4023 /* Keychain Pi */, 145 | 07D975471544FEE4005B4023 /* Keychain Omega */, 146 | 07CE04301613EC7000EC19FA /* Vendors */, 147 | 07D974CE1544F877005B4023 /* Products */, 148 | ); 149 | sourceTree = ""; 150 | usesTabs = 1; 151 | }; 152 | 07D974CE1544F877005B4023 /* Products */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | 07D974CD1544F877005B4023 /* Keychain Alpha.app */, 156 | 07C5C002154652EF0018C348 /* Keychain Pi.app */, 157 | 07C5C02A154652F10018C348 /* Keychain Omega.app */, 158 | ); 159 | name = Products; 160 | sourceTree = ""; 161 | }; 162 | 07D974D91544F877005B4023 /* FDKeychain iOS Example */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 2719736B19AFBBB500F12FCF /* Classes */, 166 | 2719737719AFBBC200F12FCF /* Resources */, 167 | 07D974DA1544F877005B4023 /* Supporting Files */, 168 | ); 169 | path = "FDKeychain iOS Example"; 170 | sourceTree = ""; 171 | }; 172 | 07D974DA1544F877005B4023 /* Supporting Files */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | 07D974DC1544F877005B4023 /* Prefix.pch */, 176 | 07D974DD1544F878005B4023 /* main.m */, 177 | ); 178 | path = "Supporting Files"; 179 | sourceTree = ""; 180 | }; 181 | 07D975301544FEE4005B4023 /* Keychain Alpha */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 2719737C19AFBC5000F12FCF /* Resources */, 185 | 07D975451544FEE4005B4023 /* Supporting Files */, 186 | ); 187 | name = "Keychain Alpha"; 188 | path = "FDKeychain iOS Example/Keychain Alpha"; 189 | sourceTree = ""; 190 | }; 191 | 07D975451544FEE4005B4023 /* Supporting Files */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | 07D975461544FEE4005B4023 /* Info-Alpha.plist */, 195 | 0760B4651546FC0C00AC1232 /* Entitlements.entitlements */, 196 | ); 197 | path = "Supporting Files"; 198 | sourceTree = ""; 199 | }; 200 | 07D975471544FEE4005B4023 /* Keychain Omega */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 2719738E19AFBC6F00F12FCF /* Resources */, 204 | 07D9755C1544FEE4005B4023 /* Supporting Files */, 205 | ); 206 | name = "Keychain Omega"; 207 | path = "FDKeychain iOS Example/Keychain Omega"; 208 | sourceTree = ""; 209 | }; 210 | 07D9755C1544FEE4005B4023 /* Supporting Files */ = { 211 | isa = PBXGroup; 212 | children = ( 213 | 07D9755D1544FEE4005B4023 /* Info-Omega.plist */, 214 | 0760B4621546FBDD00AC1232 /* Entitlements.entitlements */, 215 | ); 216 | path = "Supporting Files"; 217 | sourceTree = ""; 218 | }; 219 | 07D9755E1544FEE4005B4023 /* Keychain Pi */ = { 220 | isa = PBXGroup; 221 | children = ( 222 | 2719738519AFBC5D00F12FCF /* Resources */, 223 | 07D975731544FEE4005B4023 /* Supporting Files */, 224 | ); 225 | name = "Keychain Pi"; 226 | path = "FDKeychain iOS Example/Keychain Pi"; 227 | sourceTree = ""; 228 | }; 229 | 07D975731544FEE4005B4023 /* Supporting Files */ = { 230 | isa = PBXGroup; 231 | children = ( 232 | 07D975741544FEE4005B4023 /* Info-Pi.plist */, 233 | 0760B4641546FBEF00AC1232 /* Entitlements.entitlements */, 234 | ); 235 | path = "Supporting Files"; 236 | sourceTree = ""; 237 | }; 238 | 2719736B19AFBBB500F12FCF /* Classes */ = { 239 | isa = PBXGroup; 240 | children = ( 241 | 2719736E19AFBBB500F12FCF /* Controllers */, 242 | 2719736C19AFBBB500F12FCF /* AppDelegate.h */, 243 | 2719736D19AFBBB500F12FCF /* AppDelegate.m */, 244 | ); 245 | path = Classes; 246 | sourceTree = ""; 247 | }; 248 | 2719736E19AFBBB500F12FCF /* Controllers */ = { 249 | isa = PBXGroup; 250 | children = ( 251 | 2719736F19AFBBB500F12FCF /* FDRootViewController.h */, 252 | 2719737019AFBBB500F12FCF /* FDRootViewController.m */, 253 | ); 254 | path = Controllers; 255 | sourceTree = ""; 256 | }; 257 | 2719737719AFBBC200F12FCF /* Resources */ = { 258 | isa = PBXGroup; 259 | children = ( 260 | 2719737819AFBBC200F12FCF /* Images.xcassets */, 261 | ); 262 | path = Resources; 263 | sourceTree = ""; 264 | }; 265 | 2719737C19AFBC5000F12FCF /* Resources */ = { 266 | isa = PBXGroup; 267 | children = ( 268 | 2719737D19AFBC5000F12FCF /* Images.xcassets */, 269 | 2719737E19AFBC5000F12FCF /* InfoPlist.strings */, 270 | 2719737F19AFBC5000F12FCF /* iTunesArtwork */, 271 | 2719738019AFBC5000F12FCF /* iTunesArtwork@2x */, 272 | ); 273 | path = Resources; 274 | sourceTree = ""; 275 | }; 276 | 2719738519AFBC5D00F12FCF /* Resources */ = { 277 | isa = PBXGroup; 278 | children = ( 279 | 2719738619AFBC5D00F12FCF /* Images.xcassets */, 280 | 2719738719AFBC5D00F12FCF /* InfoPlist.strings */, 281 | 2719738819AFBC5D00F12FCF /* iTunesArtwork */, 282 | 2719738919AFBC5D00F12FCF /* iTunesArtwork@2x */, 283 | ); 284 | path = Resources; 285 | sourceTree = ""; 286 | }; 287 | 2719738E19AFBC6F00F12FCF /* Resources */ = { 288 | isa = PBXGroup; 289 | children = ( 290 | 2719738F19AFBC6F00F12FCF /* Images.xcassets */, 291 | 2719739019AFBC6F00F12FCF /* InfoPlist.strings */, 292 | 2719739119AFBC6F00F12FCF /* iTunesArtwork */, 293 | 2719739219AFBC6F00F12FCF /* iTunesArtwork@2x */, 294 | ); 295 | name = Resources; 296 | path = "FDKeychain iOS Example/Keychain Omega/Resources"; 297 | sourceTree = SOURCE_ROOT; 298 | }; 299 | 2737200819B67C1E00D235F4 /* Products */ = { 300 | isa = PBXGroup; 301 | children = ( 302 | 27FCB42819C2144900BB1123 /* FDKeychain.framework */, 303 | 2737200F19B67C1E00D235F4 /* FDKeychain.framework */, 304 | ); 305 | name = Products; 306 | sourceTree = ""; 307 | }; 308 | /* End PBXGroup section */ 309 | 310 | /* Begin PBXNativeTarget section */ 311 | 07C5BFDD154652EF0018C348 /* Keychain Pi */ = { 312 | isa = PBXNativeTarget; 313 | buildConfigurationList = 07C5BFFE154652EF0018C348 /* Build configuration list for PBXNativeTarget "Keychain Pi" */; 314 | buildPhases = ( 315 | 07C5BFDE154652EF0018C348 /* Sources */, 316 | 07C5BFE3154652EF0018C348 /* Frameworks */, 317 | 07C5BFE9154652EF0018C348 /* Resources */, 318 | ); 319 | buildRules = ( 320 | ); 321 | dependencies = ( 322 | 27FCB42E19C2146200BB1123 /* PBXTargetDependency */, 323 | ); 324 | name = "Keychain Pi"; 325 | productName = FDKeychain; 326 | productReference = 07C5C002154652EF0018C348 /* Keychain Pi.app */; 327 | productType = "com.apple.product-type.application"; 328 | }; 329 | 07C5C005154652F10018C348 /* Keychain Omega */ = { 330 | isa = PBXNativeTarget; 331 | buildConfigurationList = 07C5C026154652F10018C348 /* Build configuration list for PBXNativeTarget "Keychain Omega" */; 332 | buildPhases = ( 333 | 07C5C006154652F10018C348 /* Sources */, 334 | 07C5C00B154652F10018C348 /* Frameworks */, 335 | 07C5C011154652F10018C348 /* Resources */, 336 | ); 337 | buildRules = ( 338 | ); 339 | dependencies = ( 340 | 27FCB42C19C2145E00BB1123 /* PBXTargetDependency */, 341 | ); 342 | name = "Keychain Omega"; 343 | productName = FDKeychain; 344 | productReference = 07C5C02A154652F10018C348 /* Keychain Omega.app */; 345 | productType = "com.apple.product-type.application"; 346 | }; 347 | 07D974CC1544F877005B4023 /* Keychain Alpha */ = { 348 | isa = PBXNativeTarget; 349 | buildConfigurationList = 07D9752C1544F879005B4023 /* Build configuration list for PBXNativeTarget "Keychain Alpha" */; 350 | buildPhases = ( 351 | 07D974C91544F877005B4023 /* Sources */, 352 | 07D974CA1544F877005B4023 /* Frameworks */, 353 | 07D974CB1544F877005B4023 /* Resources */, 354 | ); 355 | buildRules = ( 356 | ); 357 | dependencies = ( 358 | 27FCB42A19C2145B00BB1123 /* PBXTargetDependency */, 359 | ); 360 | name = "Keychain Alpha"; 361 | productName = FDKeychain; 362 | productReference = 07D974CD1544F877005B4023 /* Keychain Alpha.app */; 363 | productType = "com.apple.product-type.application"; 364 | }; 365 | /* End PBXNativeTarget section */ 366 | 367 | /* Begin PBXProject section */ 368 | 07D974C41544F877005B4023 /* Project object */ = { 369 | isa = PBXProject; 370 | attributes = { 371 | CLASSPREFIX = FD; 372 | LastUpgradeCheck = 0700; 373 | ORGANIZATIONNAME = "1414 Degrees"; 374 | }; 375 | buildConfigurationList = 07D974C71544F877005B4023 /* Build configuration list for PBXProject "FDKeychain iOS Example" */; 376 | compatibilityVersion = "Xcode 3.2"; 377 | developmentRegion = English; 378 | hasScannedForEncodings = 0; 379 | knownRegions = ( 380 | en, 381 | ); 382 | mainGroup = 07D974C21544F877005B4023; 383 | productRefGroup = 07D974CE1544F877005B4023 /* Products */; 384 | projectDirPath = ""; 385 | projectReferences = ( 386 | { 387 | ProductGroup = 2737200819B67C1E00D235F4 /* Products */; 388 | ProjectRef = 27F5119F16AF210500B05F89 /* FDKeychain.xcodeproj */; 389 | }, 390 | ); 391 | projectRoot = ""; 392 | targets = ( 393 | 07D974CC1544F877005B4023 /* Keychain Alpha */, 394 | 07C5BFDD154652EF0018C348 /* Keychain Pi */, 395 | 07C5C005154652F10018C348 /* Keychain Omega */, 396 | ); 397 | }; 398 | /* End PBXProject section */ 399 | 400 | /* Begin PBXReferenceProxy section */ 401 | 2737200F19B67C1E00D235F4 /* FDKeychain.framework */ = { 402 | isa = PBXReferenceProxy; 403 | fileType = wrapper.framework; 404 | path = FDKeychain.framework; 405 | remoteRef = 2737200E19B67C1E00D235F4 /* PBXContainerItemProxy */; 406 | sourceTree = BUILT_PRODUCTS_DIR; 407 | }; 408 | 27FCB42819C2144900BB1123 /* FDKeychain.framework */ = { 409 | isa = PBXReferenceProxy; 410 | fileType = wrapper.framework; 411 | path = FDKeychain.framework; 412 | remoteRef = 27FCB42719C2144900BB1123 /* PBXContainerItemProxy */; 413 | sourceTree = BUILT_PRODUCTS_DIR; 414 | }; 415 | /* End PBXReferenceProxy section */ 416 | 417 | /* Begin PBXResourcesBuildPhase section */ 418 | 07C5BFE9154652EF0018C348 /* Resources */ = { 419 | isa = PBXResourcesBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | 2719738D19AFBC5D00F12FCF /* iTunesArtwork@2x in Resources */, 423 | 2719737A19AFBBC200F12FCF /* Images.xcassets in Resources */, 424 | 2719738B19AFBC5D00F12FCF /* InfoPlist.strings in Resources */, 425 | 2719738A19AFBC5D00F12FCF /* Images.xcassets in Resources */, 426 | 2719738C19AFBC5D00F12FCF /* iTunesArtwork in Resources */, 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | }; 430 | 07C5C011154652F10018C348 /* Resources */ = { 431 | isa = PBXResourcesBuildPhase; 432 | buildActionMask = 2147483647; 433 | files = ( 434 | 2719739619AFBC6F00F12FCF /* iTunesArtwork@2x in Resources */, 435 | 2719737B19AFBBC200F12FCF /* Images.xcassets in Resources */, 436 | 2719739419AFBC6F00F12FCF /* InfoPlist.strings in Resources */, 437 | 2719739319AFBC6F00F12FCF /* Images.xcassets in Resources */, 438 | 2719739519AFBC6F00F12FCF /* iTunesArtwork in Resources */, 439 | ); 440 | runOnlyForDeploymentPostprocessing = 0; 441 | }; 442 | 07D974CB1544F877005B4023 /* Resources */ = { 443 | isa = PBXResourcesBuildPhase; 444 | buildActionMask = 2147483647; 445 | files = ( 446 | 2719738419AFBC5000F12FCF /* iTunesArtwork@2x in Resources */, 447 | 2719737919AFBBC200F12FCF /* Images.xcassets in Resources */, 448 | 2719738219AFBC5000F12FCF /* InfoPlist.strings in Resources */, 449 | 2719738119AFBC5000F12FCF /* Images.xcassets in Resources */, 450 | 2719738319AFBC5000F12FCF /* iTunesArtwork in Resources */, 451 | ); 452 | runOnlyForDeploymentPostprocessing = 0; 453 | }; 454 | /* End PBXResourcesBuildPhase section */ 455 | 456 | /* Begin PBXSourcesBuildPhase section */ 457 | 07C5BFDE154652EF0018C348 /* Sources */ = { 458 | isa = PBXSourcesBuildPhase; 459 | buildActionMask = 2147483647; 460 | files = ( 461 | 2719737219AFBBB500F12FCF /* AppDelegate.m in Sources */, 462 | 2719737519AFBBB500F12FCF /* FDRootViewController.m in Sources */, 463 | 07C5BFDF154652EF0018C348 /* main.m in Sources */, 464 | ); 465 | runOnlyForDeploymentPostprocessing = 0; 466 | }; 467 | 07C5C006154652F10018C348 /* Sources */ = { 468 | isa = PBXSourcesBuildPhase; 469 | buildActionMask = 2147483647; 470 | files = ( 471 | 2719737319AFBBB500F12FCF /* AppDelegate.m in Sources */, 472 | 2719737619AFBBB500F12FCF /* FDRootViewController.m in Sources */, 473 | 07C5C007154652F10018C348 /* main.m in Sources */, 474 | ); 475 | runOnlyForDeploymentPostprocessing = 0; 476 | }; 477 | 07D974C91544F877005B4023 /* Sources */ = { 478 | isa = PBXSourcesBuildPhase; 479 | buildActionMask = 2147483647; 480 | files = ( 481 | 2719737119AFBBB500F12FCF /* AppDelegate.m in Sources */, 482 | 2719737419AFBBB500F12FCF /* FDRootViewController.m in Sources */, 483 | 07D974DE1544F878005B4023 /* main.m in Sources */, 484 | ); 485 | runOnlyForDeploymentPostprocessing = 0; 486 | }; 487 | /* End PBXSourcesBuildPhase section */ 488 | 489 | /* Begin PBXTargetDependency section */ 490 | 27FCB42A19C2145B00BB1123 /* PBXTargetDependency */ = { 491 | isa = PBXTargetDependency; 492 | name = "FDKeychain iOS"; 493 | targetProxy = 27FCB42919C2145B00BB1123 /* PBXContainerItemProxy */; 494 | }; 495 | 27FCB42C19C2145E00BB1123 /* PBXTargetDependency */ = { 496 | isa = PBXTargetDependency; 497 | name = "FDKeychain iOS"; 498 | targetProxy = 27FCB42B19C2145E00BB1123 /* PBXContainerItemProxy */; 499 | }; 500 | 27FCB42E19C2146200BB1123 /* PBXTargetDependency */ = { 501 | isa = PBXTargetDependency; 502 | name = "FDKeychain iOS"; 503 | targetProxy = 27FCB42D19C2146200BB1123 /* PBXContainerItemProxy */; 504 | }; 505 | /* End PBXTargetDependency section */ 506 | 507 | /* Begin XCBuildConfiguration section */ 508 | 07C5BFFF154652EF0018C348 /* Debug */ = { 509 | isa = XCBuildConfiguration; 510 | buildSettings = { 511 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Pi/Supporting Files/Entitlements.entitlements"; 512 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 513 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 514 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Pi/Supporting Files/Info-Pi.plist"; 515 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.pi; 516 | PRODUCT_NAME = "Keychain Pi"; 517 | WRAPPER_EXTENSION = app; 518 | }; 519 | name = Debug; 520 | }; 521 | 07C5C000154652EF0018C348 /* Ad Hoc */ = { 522 | isa = XCBuildConfiguration; 523 | buildSettings = { 524 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Pi/Supporting Files/Entitlements.entitlements"; 525 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 526 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 527 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Pi/Supporting Files/Info-Pi.plist"; 528 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.pi; 529 | PRODUCT_NAME = "Keychain Pi"; 530 | WRAPPER_EXTENSION = app; 531 | }; 532 | name = "Ad Hoc"; 533 | }; 534 | 07C5C001154652EF0018C348 /* App Store */ = { 535 | isa = XCBuildConfiguration; 536 | buildSettings = { 537 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Pi/Supporting Files/Entitlements.entitlements"; 538 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 539 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 540 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Pi/Supporting Files/Info-Pi.plist"; 541 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.pi; 542 | PRODUCT_NAME = "Keychain Pi"; 543 | WRAPPER_EXTENSION = app; 544 | }; 545 | name = "App Store"; 546 | }; 547 | 07C5C027154652F10018C348 /* Debug */ = { 548 | isa = XCBuildConfiguration; 549 | buildSettings = { 550 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Omega/Supporting Files/Entitlements.entitlements"; 551 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 552 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 553 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Omega/Supporting Files/Info-Omega.plist"; 554 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.omega; 555 | PRODUCT_NAME = "Keychain Omega"; 556 | WRAPPER_EXTENSION = app; 557 | }; 558 | name = Debug; 559 | }; 560 | 07C5C028154652F10018C348 /* Ad Hoc */ = { 561 | isa = XCBuildConfiguration; 562 | buildSettings = { 563 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Omega/Supporting Files/Entitlements.entitlements"; 564 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 565 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 566 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Omega/Supporting Files/Info-Omega.plist"; 567 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.omega; 568 | PRODUCT_NAME = "Keychain Omega"; 569 | WRAPPER_EXTENSION = app; 570 | }; 571 | name = "Ad Hoc"; 572 | }; 573 | 07C5C029154652F10018C348 /* App Store */ = { 574 | isa = XCBuildConfiguration; 575 | buildSettings = { 576 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Omega/Supporting Files/Entitlements.entitlements"; 577 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 578 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 579 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Omega/Supporting Files/Info-Omega.plist"; 580 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.omega; 581 | PRODUCT_NAME = "Keychain Omega"; 582 | WRAPPER_EXTENSION = app; 583 | }; 584 | name = "App Store"; 585 | }; 586 | 07D975291544F879005B4023 /* Debug */ = { 587 | isa = XCBuildConfiguration; 588 | buildSettings = { 589 | ALWAYS_SEARCH_USER_PATHS = NO; 590 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 591 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 592 | CLANG_ENABLE_MODULES = YES; 593 | CLANG_ENABLE_OBJC_ARC = YES; 594 | CLANG_WARN_BOOL_CONVERSION = YES; 595 | CLANG_WARN_CONSTANT_CONVERSION = YES; 596 | CLANG_WARN_EMPTY_BODY = YES; 597 | CLANG_WARN_ENUM_CONVERSION = YES; 598 | CLANG_WARN_INT_CONVERSION = YES; 599 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 600 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 601 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 602 | COPY_PHASE_STRIP = NO; 603 | ENABLE_TESTABILITY = YES; 604 | GCC_DYNAMIC_NO_PIC = NO; 605 | GCC_OPTIMIZATION_LEVEL = 0; 606 | GCC_PREPROCESSOR_DEFINITIONS = DEBUG; 607 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 608 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 609 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 610 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 611 | GCC_WARN_UNDECLARED_SELECTOR = YES; 612 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 613 | GCC_WARN_UNUSED_FUNCTION = YES; 614 | GCC_WARN_UNUSED_VARIABLE = YES; 615 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 616 | ONLY_ACTIVE_ARCH = YES; 617 | SDKROOT = iphoneos; 618 | TARGETED_DEVICE_FAMILY = "1,2"; 619 | }; 620 | name = Debug; 621 | }; 622 | 07D9752A1544F879005B4023 /* Ad Hoc */ = { 623 | isa = XCBuildConfiguration; 624 | buildSettings = { 625 | ALWAYS_SEARCH_USER_PATHS = NO; 626 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 627 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 628 | CLANG_ENABLE_MODULES = YES; 629 | CLANG_ENABLE_OBJC_ARC = YES; 630 | CLANG_WARN_BOOL_CONVERSION = YES; 631 | CLANG_WARN_CONSTANT_CONVERSION = YES; 632 | CLANG_WARN_EMPTY_BODY = YES; 633 | CLANG_WARN_ENUM_CONVERSION = YES; 634 | CLANG_WARN_INT_CONVERSION = YES; 635 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 636 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 637 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; 638 | COPY_PHASE_STRIP = NO; 639 | GCC_PREPROCESSOR_DEFINITIONS = AD_HOC; 640 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 641 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 642 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 643 | GCC_WARN_UNDECLARED_SELECTOR = YES; 644 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 645 | GCC_WARN_UNUSED_FUNCTION = YES; 646 | GCC_WARN_UNUSED_VARIABLE = YES; 647 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 648 | SDKROOT = iphoneos; 649 | STRIP_INSTALLED_PRODUCT = NO; 650 | TARGETED_DEVICE_FAMILY = "1,2"; 651 | VALIDATE_PRODUCT = YES; 652 | }; 653 | name = "Ad Hoc"; 654 | }; 655 | 07D9752B1544F879005B4023 /* App Store */ = { 656 | isa = XCBuildConfiguration; 657 | buildSettings = { 658 | ALWAYS_SEARCH_USER_PATHS = NO; 659 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 660 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 661 | CLANG_ENABLE_MODULES = YES; 662 | CLANG_ENABLE_OBJC_ARC = YES; 663 | CLANG_WARN_BOOL_CONVERSION = YES; 664 | CLANG_WARN_CONSTANT_CONVERSION = YES; 665 | CLANG_WARN_EMPTY_BODY = YES; 666 | CLANG_WARN_ENUM_CONVERSION = YES; 667 | CLANG_WARN_INT_CONVERSION = YES; 668 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 669 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 670 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; 671 | COPY_PHASE_STRIP = YES; 672 | ENABLE_NS_ASSERTIONS = NO; 673 | GCC_PREPROCESSOR_DEFINITIONS = APP_STORE; 674 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 675 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 676 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 677 | GCC_WARN_UNDECLARED_SELECTOR = YES; 678 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 679 | GCC_WARN_UNUSED_FUNCTION = YES; 680 | GCC_WARN_UNUSED_VARIABLE = YES; 681 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 682 | SDKROOT = iphoneos; 683 | TARGETED_DEVICE_FAMILY = "1,2"; 684 | VALIDATE_PRODUCT = YES; 685 | }; 686 | name = "App Store"; 687 | }; 688 | 07D9752D1544F879005B4023 /* Debug */ = { 689 | isa = XCBuildConfiguration; 690 | buildSettings = { 691 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Alpha/Supporting Files/Entitlements.entitlements"; 692 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 693 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 694 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Alpha/Supporting Files/Info-Alpha.plist"; 695 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.alpha; 696 | PRODUCT_NAME = "Keychain Alpha"; 697 | WRAPPER_EXTENSION = app; 698 | }; 699 | name = Debug; 700 | }; 701 | 07D9752E1544F879005B4023 /* Ad Hoc */ = { 702 | isa = XCBuildConfiguration; 703 | buildSettings = { 704 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Alpha/Supporting Files/Entitlements.entitlements"; 705 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 706 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 707 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Alpha/Supporting Files/Info-Alpha.plist"; 708 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.alpha; 709 | PRODUCT_NAME = "Keychain Alpha"; 710 | WRAPPER_EXTENSION = app; 711 | }; 712 | name = "Ad Hoc"; 713 | }; 714 | 07D9752F1544F879005B4023 /* App Store */ = { 715 | isa = XCBuildConfiguration; 716 | buildSettings = { 717 | CODE_SIGN_ENTITLEMENTS = "FDKeychain iOS Example/Keychain Alpha/Supporting Files/Entitlements.entitlements"; 718 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 719 | GCC_PREFIX_HEADER = "FDKeychain iOS Example/Supporting Files/Prefix.pch"; 720 | INFOPLIST_FILE = "FDKeychain iOS Example/Keychain Alpha/Supporting Files/Info-Alpha.plist"; 721 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.alpha; 722 | PRODUCT_NAME = "Keychain Alpha"; 723 | WRAPPER_EXTENSION = app; 724 | }; 725 | name = "App Store"; 726 | }; 727 | /* End XCBuildConfiguration section */ 728 | 729 | /* Begin XCConfigurationList section */ 730 | 07C5BFFE154652EF0018C348 /* Build configuration list for PBXNativeTarget "Keychain Pi" */ = { 731 | isa = XCConfigurationList; 732 | buildConfigurations = ( 733 | 07C5BFFF154652EF0018C348 /* Debug */, 734 | 07C5C000154652EF0018C348 /* Ad Hoc */, 735 | 07C5C001154652EF0018C348 /* App Store */, 736 | ); 737 | defaultConfigurationIsVisible = 0; 738 | defaultConfigurationName = Debug; 739 | }; 740 | 07C5C026154652F10018C348 /* Build configuration list for PBXNativeTarget "Keychain Omega" */ = { 741 | isa = XCConfigurationList; 742 | buildConfigurations = ( 743 | 07C5C027154652F10018C348 /* Debug */, 744 | 07C5C028154652F10018C348 /* Ad Hoc */, 745 | 07C5C029154652F10018C348 /* App Store */, 746 | ); 747 | defaultConfigurationIsVisible = 0; 748 | defaultConfigurationName = Debug; 749 | }; 750 | 07D974C71544F877005B4023 /* Build configuration list for PBXProject "FDKeychain iOS Example" */ = { 751 | isa = XCConfigurationList; 752 | buildConfigurations = ( 753 | 07D975291544F879005B4023 /* Debug */, 754 | 07D9752A1544F879005B4023 /* Ad Hoc */, 755 | 07D9752B1544F879005B4023 /* App Store */, 756 | ); 757 | defaultConfigurationIsVisible = 0; 758 | defaultConfigurationName = Debug; 759 | }; 760 | 07D9752C1544F879005B4023 /* Build configuration list for PBXNativeTarget "Keychain Alpha" */ = { 761 | isa = XCConfigurationList; 762 | buildConfigurations = ( 763 | 07D9752D1544F879005B4023 /* Debug */, 764 | 07D9752E1544F879005B4023 /* Ad Hoc */, 765 | 07D9752F1544F879005B4023 /* App Store */, 766 | ); 767 | defaultConfigurationIsVisible = 0; 768 | defaultConfigurationName = Debug; 769 | }; 770 | /* End XCConfigurationList section */ 771 | }; 772 | rootObject = 07D974C41544F877005B4023 /* Project object */; 773 | } 774 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Classes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #pragma mark Class Interface 2 | 3 | @interface AppDelegate : NSObject< 4 | UIApplicationDelegate> 5 | 6 | 7 | @end -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Classes/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | #import "FDRootViewController.h" 3 | 4 | 5 | #pragma mark Class Definition 6 | 7 | @implementation AppDelegate 8 | { 9 | @private UIWindow *_mainWindow; 10 | } 11 | 12 | 13 | #pragma mark - UIApplicationDelegate Methods 14 | 15 | - (BOOL)application: (UIApplication *)application 16 | didFinishLaunchingWithOptions: (NSDictionary *)launchOptions 17 | { 18 | // Create the main window. 19 | UIScreen *mainScreen = [UIScreen mainScreen]; 20 | 21 | _mainWindow = [[UIWindow alloc] 22 | initWithFrame: mainScreen.bounds]; 23 | 24 | _mainWindow.backgroundColor = [UIColor blackColor]; 25 | 26 | // Create the root view controller for the window. 27 | _mainWindow.rootViewController = [FDRootViewController new]; 28 | 29 | // Show the main window. 30 | [_mainWindow makeKeyAndVisible]; 31 | 32 | // Indicate success. 33 | return YES; 34 | } 35 | 36 | 37 | @end -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Classes/Controllers/FDRootViewController.h: -------------------------------------------------------------------------------- 1 | #pragma mark Class Interface 2 | 3 | @interface FDRootViewController : UIViewController< 4 | UITextFieldDelegate> 5 | 6 | 7 | @end -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Classes/Controllers/FDRootViewController.m: -------------------------------------------------------------------------------- 1 | #import "FDRootViewController.h" 2 | 3 | 4 | #pragma mark Constants 5 | 6 | static NSString * const KeychainItem_Service = @"FDKeychain"; 7 | static NSString * const KeychainItem_Key_LocalPassword = @"Local"; 8 | static NSString * const KeychainItem_Key_SharedPassword = @"Shared"; 9 | // TODO: Replace the App Ids in the following strings with the App Ids of the provisioning profiles you are using to sign the apps. 10 | #if defined(DEBUG) 11 | static NSString * const KeychainItem_AccessGroup_Shared = @"XXXXXXXXXX.com.1414degrees.keychain.shared"; 12 | #else 13 | static NSString * const KeychainItem_AccessGroup_Shared = @"XXXXXXXXXX.com.1414degrees.keychain.shared"; 14 | #endif 15 | 16 | 17 | #pragma mark - Class Extension 18 | 19 | @interface FDRootViewController () 20 | 21 | - (void)_updateTextFieldsWithKeychainItems; 22 | 23 | 24 | @end 25 | 26 | 27 | #pragma mark - Class Definition 28 | 29 | @implementation FDRootViewController 30 | { 31 | @private __strong UITextField *_localPasswordTextField; 32 | @private __strong UITextField *_sharedPasswordTextField; 33 | } 34 | 35 | 36 | #pragma mark - Constructors 37 | 38 | - (id)initWithNibName: (NSString *)nibName 39 | bundle: (NSBundle *)bundle 40 | { 41 | // Abort if base initializer fails. 42 | if ((self = [super initWithNibName: nibName 43 | bundle: nil]) == nil) 44 | { 45 | return nil; 46 | } 47 | 48 | // Listen for when the application is entering the foreground. 49 | NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 50 | 51 | [notificationCenter addObserver: self 52 | selector: @selector(_updateTextFieldsWithKeychainItems) 53 | name: UIApplicationWillEnterForegroundNotification 54 | object: nil]; 55 | 56 | // Return initialized instance. 57 | return self; 58 | } 59 | 60 | 61 | #pragma mark - Destructor 62 | 63 | - (void)dealloc 64 | { 65 | // Stop listening for when the application is entering the foregound. 66 | NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 67 | 68 | [notificationCenter removeObserver: self 69 | name: UIApplicationWillEnterForegroundNotification 70 | object: nil]; 71 | 72 | // nil out delegates of any instance variables. 73 | _localPasswordTextField.delegate = nil; 74 | _sharedPasswordTextField.delegate = nil; 75 | } 76 | 77 | 78 | #pragma mark - Overridden Methods 79 | 80 | - (void)viewDidLoad 81 | { 82 | // Call base implementation. 83 | [super viewDidLoad]; 84 | 85 | // Set the controller view's background color. 86 | self.view.backgroundColor = [UIColor whiteColor]; 87 | 88 | // Create the local password text field and add it to the controller's view. 89 | _localPasswordTextField = [UITextField new]; 90 | _localPasswordTextField.delegate = self; 91 | _localPasswordTextField.placeholder = @"Local Password"; 92 | _localPasswordTextField.textColor = [UIColor blueColor]; 93 | _localPasswordTextField.clearButtonMode = UITextFieldViewModeAlways; 94 | 95 | [self.view addSubview: _localPasswordTextField]; 96 | 97 | // Create the shared password text field and add it to the controller's view. 98 | _sharedPasswordTextField = [UITextField new]; 99 | _sharedPasswordTextField.delegate = self; 100 | _sharedPasswordTextField.placeholder = @"Shared Password"; 101 | _sharedPasswordTextField.textColor = _localPasswordTextField.textColor; 102 | _sharedPasswordTextField.clearButtonMode = _localPasswordTextField.clearButtonMode; 103 | 104 | [self.view addSubview: _sharedPasswordTextField]; 105 | 106 | // Set the auto layout constraint of the text fields. 107 | _localPasswordTextField.translatesAutoresizingMaskIntoConstraints = NO; 108 | _sharedPasswordTextField.translatesAutoresizingMaskIntoConstraints = NO; 109 | 110 | NSDictionary *autoLayoutViews = NSDictionaryOfVariableBindings(_localPasswordTextField, _sharedPasswordTextField); 111 | 112 | [self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-[_localPasswordTextField]-|" 113 | options: 0 114 | metrics: nil 115 | views: autoLayoutViews]]; 116 | 117 | [self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"H:|-[_sharedPasswordTextField]-|" 118 | options: 0 119 | metrics: nil 120 | views: autoLayoutViews]]; 121 | 122 | [self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @"V:|-75-[_localPasswordTextField]-30-[_sharedPasswordTextField]" 123 | options: 0 124 | metrics: nil 125 | views: autoLayoutViews]]; 126 | 127 | // Ensure the text fields are populated with their keychain items. 128 | [self _updateTextFieldsWithKeychainItems]; 129 | } 130 | 131 | - (void)touchesBegan: (NSSet *)touches 132 | withEvent: (UIEvent *)event 133 | { 134 | [_localPasswordTextField becomeFirstResponder]; 135 | [_localPasswordTextField resignFirstResponder]; 136 | } 137 | 138 | 139 | #pragma mark - Private Methods 140 | 141 | - (void)_updateTextFieldsWithKeychainItems 142 | { 143 | _localPasswordTextField.text = [FDKeychain itemForKey: KeychainItem_Key_LocalPassword 144 | forService: KeychainItem_Service 145 | error: nil]; 146 | 147 | _sharedPasswordTextField.text = [FDKeychain itemForKey: KeychainItem_Key_SharedPassword 148 | forService: KeychainItem_Service 149 | inAccessGroup: KeychainItem_AccessGroup_Shared 150 | error: nil]; 151 | } 152 | 153 | 154 | #pragma mark - UITextFieldDelegate Methods 155 | 156 | - (BOOL)textField: (UITextField *)textField 157 | shouldChangeCharactersInRange: (NSRange)range 158 | replacementString: (NSString *)string 159 | { 160 | NSString *candidateString = [textField.text stringByReplacingCharactersInRange: range 161 | withString: string]; 162 | 163 | NSError *error = nil; 164 | 165 | if (textField == _localPasswordTextField) 166 | { 167 | [FDKeychain saveItem: candidateString 168 | forKey: KeychainItem_Key_LocalPassword 169 | forService: KeychainItem_Service 170 | error: &error]; 171 | } 172 | else if (textField == _sharedPasswordTextField) 173 | { 174 | [FDKeychain saveItem: candidateString 175 | forKey: KeychainItem_Key_SharedPassword 176 | forService: KeychainItem_Service 177 | inAccessGroup: KeychainItem_AccessGroup_Shared 178 | withAccessibility: FDKeychainAccessibleWhenUnlocked 179 | error: &error]; 180 | } 181 | 182 | if (error != nil) 183 | { 184 | NSLog(@"Error occured while attempting to save to the keychain:\t%@", error); 185 | } 186 | 187 | return YES; 188 | } 189 | 190 | - (BOOL)textFieldShouldClear: (UITextField *)textField 191 | { 192 | NSError *error = nil; 193 | 194 | if (textField == _localPasswordTextField) 195 | { 196 | [FDKeychain deleteItemForKey: KeychainItem_Key_LocalPassword 197 | forService: KeychainItem_Service 198 | error: &error]; 199 | } 200 | else if (textField == _sharedPasswordTextField) 201 | { 202 | [FDKeychain deleteItemForKey: KeychainItem_Key_SharedPassword 203 | forService: KeychainItem_Service 204 | inAccessGroup: KeychainItem_AccessGroup_Shared 205 | error: &error]; 206 | } 207 | 208 | if (error != nil) 209 | { 210 | NSLog(@"Error occured while attempting to delete from the keychain:\t%@", error); 211 | } 212 | 213 | return YES; 214 | } 215 | 216 | - (BOOL)textFieldShouldReturn: (UITextField *)textField 217 | { 218 | [textField resignFirstResponder]; 219 | 220 | return YES; 221 | } 222 | 223 | 224 | @end -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "icon_settings@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "40x40", 11 | "idiom" : "iphone", 12 | "filename" : "icon_spotlight@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "60x60", 17 | "idiom" : "iphone", 18 | "filename" : "icon_iphone@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "ipad", 24 | "filename" : "icon_settings.png", 25 | "scale" : "1x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "ipad", 30 | "filename" : "icon_settings@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "ipad", 36 | "filename" : "icon_spotlight.png", 37 | "scale" : "1x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "ipad", 42 | "filename" : "icon_spotlight@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "76x76", 47 | "idiom" : "ipad", 48 | "filename" : "icon_ipad.png", 49 | "scale" : "1x" 50 | }, 51 | { 52 | "size" : "76x76", 53 | "idiom" : "ipad", 54 | "filename" : "icon_ipad@2x.png", 55 | "scale" : "2x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_iphone@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_settings.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_settings@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "CFBundleName" = "Keychain α"; 2 | 3 | "CFBundleDisplayName" = "Keychain α"; 4 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/iTunesArtwork -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Alpha/Resources/iTunesArtwork@2x -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Supporting Files/Entitlements.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 8 | $(AppIdentifierPrefix)com.1414degrees.keychain.shared 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Alpha/Supporting Files/Info-Alpha.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFiles 12 | 13 | icon_iphone.png 14 | icon_iphone@2x.png 15 | icon_iphone_spotlight.png 16 | icon_iphone_spotlight@2x.png 17 | icon_ipad.png 18 | icon_ipad@2x.png 19 | icon_ipad_spotlight.png 20 | icon_ipad_spotlight@2x.png 21 | 22 | CFBundleIdentifier 23 | $(PRODUCT_BUNDLE_IDENTIFIER) 24 | CFBundleInfoDictionaryVersion 25 | 6.0 26 | CFBundleName 27 | ${PRODUCT_NAME} 28 | CFBundlePackageType 29 | APPL 30 | CFBundleShortVersionString 31 | 1.0.0 32 | CFBundleVersion 33 | 0 34 | LSRequiresIPhoneOS 35 | 36 | UIPrerenderedIcon 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationPortraitUpsideDown 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "icon_settings@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "40x40", 11 | "idiom" : "iphone", 12 | "filename" : "icon_spotlight@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "60x60", 17 | "idiom" : "iphone", 18 | "filename" : "icon_iphone@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "ipad", 24 | "filename" : "icon_settings.png", 25 | "scale" : "1x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "ipad", 30 | "filename" : "icon_settings@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "ipad", 36 | "filename" : "icon_spotlight.png", 37 | "scale" : "1x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "ipad", 42 | "filename" : "icon_spotlight@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "76x76", 47 | "idiom" : "ipad", 48 | "filename" : "icon_ipad.png", 49 | "scale" : "1x" 50 | }, 51 | { 52 | "size" : "76x76", 53 | "idiom" : "ipad", 54 | "filename" : "icon_ipad@2x.png", 55 | "scale" : "2x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_iphone@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_settings.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_settings@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "CFBundleName" = "Keychain Ω"; 2 | 3 | "CFBundleDisplayName" = "Keychain Ω"; 4 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/iTunesArtwork -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Omega/Resources/iTunesArtwork@2x -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Supporting Files/Entitlements.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 8 | $(AppIdentifierPrefix)com.1414degrees.keychain.shared 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Omega/Supporting Files/Info-Omega.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFiles 12 | 13 | icon_iphone.png 14 | icon_iphone@2x.png 15 | icon_iphone_spotlight.png 16 | icon_iphone_spotlight@2x.png 17 | icon_ipad.png 18 | icon_ipad@2x.png 19 | icon_ipad_spotlight.png 20 | icon_ipad_spotlight@2x.png 21 | 22 | CFBundleIdentifier 23 | $(PRODUCT_BUNDLE_IDENTIFIER) 24 | CFBundleInfoDictionaryVersion 25 | 6.0 26 | CFBundleName 27 | ${PRODUCT_NAME} 28 | CFBundlePackageType 29 | APPL 30 | CFBundleShortVersionString 31 | 1.0.0 32 | CFBundleVersion 33 | 0 34 | LSRequiresIPhoneOS 35 | 36 | UIPrerenderedIcon 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationPortraitUpsideDown 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "icon_settings@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "40x40", 11 | "idiom" : "iphone", 12 | "filename" : "icon_spotlight@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "60x60", 17 | "idiom" : "iphone", 18 | "filename" : "icon_iphone@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "ipad", 24 | "filename" : "icon_settings.png", 25 | "scale" : "1x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "ipad", 30 | "filename" : "icon_settings@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "ipad", 36 | "filename" : "icon_spotlight.png", 37 | "scale" : "1x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "ipad", 42 | "filename" : "icon_spotlight@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "76x76", 47 | "idiom" : "ipad", 48 | "filename" : "icon_ipad.png", 49 | "scale" : "1x" 50 | }, 51 | { 52 | "size" : "76x76", 53 | "idiom" : "ipad", 54 | "filename" : "icon_ipad@2x.png", 55 | "scale" : "2x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_ipad@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_iphone@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_settings.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_settings@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/Images.xcassets/AppIcon.appiconset/icon_spotlight@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "CFBundleName" = "Keychain π"; 2 | 3 | "CFBundleDisplayName" = "Keychain π"; 4 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/iTunesArtwork -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Keychain Pi/Resources/iTunesArtwork@2x -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Supporting Files/Entitlements.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)$(CFBundleIdentifier) 8 | $(AppIdentifierPrefix)com.1414degrees.keychain.shared 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Keychain Pi/Supporting Files/Info-Pi.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFiles 12 | 13 | icon_iphone.png 14 | icon_iphone@2x.png 15 | icon_iphone_spotlight.png 16 | icon_iphone_spotlight@2x.png 17 | icon_ipad.png 18 | icon_ipad@2x.png 19 | icon_ipad_spotlight.png 20 | icon_ipad_spotlight@2x.png 21 | 22 | CFBundleIdentifier 23 | $(PRODUCT_BUNDLE_IDENTIFIER) 24 | CFBundleInfoDictionaryVersion 25 | 6.0 26 | CFBundleName 27 | ${PRODUCT_NAME} 28 | CFBundlePackageType 29 | APPL 30 | CFBundleShortVersionString 31 | 1.0.0 32 | CFBundleVersion 33 | 0 34 | LSRequiresIPhoneOS 35 | 36 | UIPrerenderedIcon 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationPortraitUpsideDown 48 | UIInterfaceOrientationLandscapeLeft 49 | UIInterfaceOrientationLandscapeRight 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "filename" : "launch_iphone@2x.png", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "extent" : "full-screen", 13 | "idiom" : "iphone", 14 | "subtype" : "retina4", 15 | "filename" : "launch_iphone_r4@2x.png", 16 | "minimum-system-version" : "7.0", 17 | "orientation" : "portrait", 18 | "scale" : "2x" 19 | }, 20 | { 21 | "orientation" : "portrait", 22 | "idiom" : "ipad", 23 | "extent" : "full-screen", 24 | "minimum-system-version" : "7.0", 25 | "filename" : "launch_ipad_portrait.png", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "orientation" : "landscape", 30 | "idiom" : "ipad", 31 | "extent" : "full-screen", 32 | "minimum-system-version" : "7.0", 33 | "filename" : "launch_ipad_landscape.png", 34 | "scale" : "1x" 35 | }, 36 | { 37 | "orientation" : "portrait", 38 | "idiom" : "ipad", 39 | "extent" : "full-screen", 40 | "minimum-system-version" : "7.0", 41 | "filename" : "launch_ipad_portrait@2x.png", 42 | "scale" : "2x" 43 | }, 44 | { 45 | "orientation" : "landscape", 46 | "idiom" : "ipad", 47 | "extent" : "full-screen", 48 | "minimum-system-version" : "7.0", 49 | "filename" : "launch_ipad_landscape@2x.png", 50 | "scale" : "2x" 51 | } 52 | ], 53 | "info" : { 54 | "version" : 1, 55 | "author" : "xcode" 56 | } 57 | } -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_landscape.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_landscape@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_landscape@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_portrait.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_ipad_portrait@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_iphone@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_iphone@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_iphone_r4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reidmain/FDKeychain/87d11d3c51e77dbde85066750e90a6848d7d2ea3/Example Projects/FDKeychain iOS Example/Resources/Images.xcassets/LaunchImage.launchimage/launch_iphone_r4@2x.png -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Supporting Files/Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files in the 'FDKeychain iOS Example' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | @import Foundation; 7 | @import QuartzCore; 8 | @import UIKit; 9 | 10 | @import FDKeychain; 11 | #endif -------------------------------------------------------------------------------- /Example Projects/FDKeychain iOS Example/Supporting Files/main.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | @autoreleasepool 7 | { 8 | // Create the UIApplication object and initialize the main event loop. 9 | int retVal = UIApplicationMain(argc, 10 | argv, 11 | nil, 12 | NSStringFromClass([AppDelegate class])); 13 | 14 | // NOTE: UIApplicationMain never returns because the application is either sent to the background or is killed. It cannot exit "normally". 15 | return retVal; 16 | } 17 | } -------------------------------------------------------------------------------- /FDKeychain.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "FDKeychain" 3 | s.version = "1.3.0" 4 | s.summary = "Save, load and delete items from the keychain with a single Objective-C message." 5 | s.license = { :type => "MIT", :file => "LICENSE.md" } 6 | s.source = { :git => "https://github.com/reidmain/FDKeychain.git", :tag => "#{s.version}" } 7 | 8 | s.homepage = "https://github.com/reidmain/FDKeychain" 9 | s.author = { "Reid Main" => "reidmain@gmail.com" } 10 | s.social_media_url = "http://twitter.com/reidmain" 11 | 12 | s.ios.deployment_target = "8.0" 13 | s.osx.deployment_target = "10.9" 14 | s.watchos.deployment_target = "2.0" 15 | s.tvos.deployment_target = "9.0" 16 | 17 | s.frameworks = [ "Foundation", "Security" ] 18 | s.requires_arc = true 19 | 20 | s.source_files = [ "#{s.name}/**/*.{h,m}" ] 21 | end 22 | -------------------------------------------------------------------------------- /FDKeychain.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /FDKeychain/FDKeychain.h: -------------------------------------------------------------------------------- 1 | @import Foundation; 2 | 3 | 4 | #pragma mark - Constants 5 | 6 | /** 7 | Error domain for FDKeychain. Error codes correspond to either codes found in FDKeychain.h or SecBase.h 8 | */ 9 | extern NSString * const FDKeychainErrorDomain; 10 | 11 | /** 12 | Error code for when an item cannot be succesfully unarchived from the keychain. 13 | */ 14 | #define FDKeychainUnarchiveErrorCode 21 15 | 16 | 17 | #pragma mark - Enumerations 18 | 19 | /** 20 | Accessibility level of an item in the keychain which determines when it is readable. 21 | */ 22 | typedef NS_ENUM(NSInteger, FDKeychainAccessibility) 23 | { 24 | /// The item in the keychain can only be accessed while the device is unlocked. 25 | FDKeychainAccessibleWhenUnlocked, 26 | 27 | /// The item in the keychain cannot be accessed after a restart until the device has been unlocked once. 28 | FDKeychainAccessibleAfterFirstUnlock, 29 | }; 30 | 31 | 32 | #pragma mark - Class Interface 33 | 34 | /** 35 | FDKeychain is a class that provides the ability to save, load and delete items from the keychain with a single message. 36 | 37 | FDKeychain is not designed to be instantiated because it does not maintain any state. Every method is static and acts directly on the keychain when it is called. There is no need to persist any state and minimize accessing the keychain because speed is very rarely a factor and, with the addition if the iCloud keychain, ensuring that your data is never stale can be a pain. 38 | 39 | All items that are saved using FDKeychain must adhere to the NSCoding protocol because they are serialized before they are saved to the keychain. This allows users to store arbitrary objects in the keychain and not have to worry about the serialize/deserialize process themselves. 40 | */ 41 | @interface FDKeychain : NSObject 42 | 43 | 44 | #pragma mark - Static Methods 45 | 46 | /// ---------- 47 | /// @name Load 48 | /// ---------- 49 | 50 | /** 51 | Attempts to retrieve the raw serialized NSData from the keychain with the specified key, service and access group. 52 | 53 | This is useful for migration purposes if the item that was serialized to the keychain cannot be deserialized automatically. 54 | 55 | @param key The key that the item is associated with. This parameter must not be nil. 56 | @param service The service that the item is associated with. This is usually the name of the application using the keychain. This parameter must not be nil. 57 | @param accessGroup The access group that the item is saved to in the keychain. If this parameter is nil the first access group in the application entitlements file is used by default. 58 | @param error A pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. 59 | 60 | @return Returns the raw serialized NSData if it exists in the keychain or nil if it does not exist in the keychain. If nil is returned an error may have also occurred. 61 | */ 62 | + (NSData *)rawDataForKey: (NSString *)key 63 | forService: (NSString *)service 64 | inAccessGroup: (NSString *)accessGroup 65 | error: (NSError **)error; 66 | 67 | /** 68 | Helper method for rawDataForKey:forService:inAccessGroup:error: that omits the access group. 69 | 70 | @see rawDataForKey:forService:inAccessGroup:error: 71 | */ 72 | + (NSData *)rawDataForKey: (NSString *)key 73 | forService: (NSString *)service 74 | error: (NSError **)error; 75 | 76 | /** 77 | Attempts to retrieve the item from the keychain with the specified key, service and access group. 78 | 79 | @param key The key that the item is associated with. This parameter must not be nil. 80 | @param service The service that the item is associated with. This is usually the name of the application using the keychain. This parameter must not be nil. 81 | @param accessGroup The access group that the item is saved to in the keychain. If this parameter is nil the first access group in the application entitlements file is used by default. 82 | @param error A pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. 83 | 84 | @return Returns the item if it exists in the keychain or nil if they item does not exist in the keychain. If nil is returned an error may have also occurred. 85 | */ 86 | + (id)itemForKey: (NSString *)key 87 | forService: (NSString *)service 88 | inAccessGroup: (NSString *)accessGroup 89 | error: (NSError **)error; 90 | 91 | /** 92 | Helper method for itemForKey:forService:inAccessGroup:error: that omits the access group. 93 | 94 | @see itemForKey:forService:inAccessGroup:error: 95 | */ 96 | + (id)itemForKey: (NSString *)key 97 | forService: (NSString *)service 98 | error: (NSError **)error; 99 | 100 | /// ---------- 101 | /// @name Save 102 | /// ---------- 103 | 104 | /** 105 | Attempts to save the item to the keychain under the associated key, service and access group with the specified accessibility level. 106 | 107 | @param item The item to be saved to the keychain. The item must adhere to the NSCoding protocol because it will be serialized before it is stored in the keychain. If the item is nil FDKeychain will attempt to delete the item from the keychain instead. 108 | @param key The key that the item will be associated with. This parameter must not be nil. 109 | @param service The service that the item will be associated with. This is usually the name of the application using the keychain. This parameter must not be nil. 110 | @param accessGroup The access group that the item will be saved to in the keychain. If this parameter is nil the first access group in the application entitlements file is used by default. 111 | @param accessibility The accessibility level of the item. 112 | @param error A pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. 113 | 114 | @return Returns YES if the item was saved successfully. Returns NO if an error occurred. 115 | */ 116 | + (BOOL)saveItem: (id)item 117 | forKey: (NSString *)key 118 | forService: (NSString *)service 119 | inAccessGroup: (NSString *)accessGroup 120 | withAccessibility: (FDKeychainAccessibility)accessibility 121 | error: (NSError **)error; 122 | 123 | /** 124 | Helper method for saveItem:forKey:forService:inAccessGroup:withAccessibility:error: that omits the access group. 125 | 126 | @see saveItem:forKey:forService:inAccessGroup:withAccessibility:error: 127 | */ 128 | + (BOOL)saveItem: (id)item 129 | forKey: (NSString *)key 130 | forService: (NSString *)service 131 | error: (NSError **)error; 132 | 133 | /// ------------ 134 | /// @name Delete 135 | /// ------------ 136 | 137 | /** 138 | Attempts to delete the item from the keychain with the specified key, service and access group. 139 | 140 | @param key The key that the item is associated with. This parameter must not be nil. 141 | @param service The service that the item is associated with. This is usually the name of the application using the keychain. This parameter must not be nil. 142 | @param accessGroup The access group that the item is saved to in the keychain. If this parameter is nil the first access group in the application entitlements file is used by default. 143 | @param error A pointer to an error object. If an error occurs, this pointer is set to an actual error object containing the error information. You may specify nil for this parameter if you do not want the error information. 144 | 145 | @return Returns YES if the item was deleted successfully. Returns NO if an error occurred. 146 | */ 147 | + (BOOL)deleteItemForKey: (NSString *)key 148 | forService: (NSString *)service 149 | inAccessGroup: (NSString *)accessGroup 150 | error: (NSError **)error; 151 | 152 | /** 153 | Helper method for deleteItemForKey:forService:inAccessGroup:error: that omits the access group. 154 | 155 | @see deleteItemForKey:forService:inAccessGroup:error: 156 | */ 157 | + (BOOL)deleteItemForKey: (NSString *)key 158 | forService: (NSString *)service 159 | error: (NSError **)error; 160 | 161 | 162 | @end -------------------------------------------------------------------------------- /FDKeychain/FDKeychain.m: -------------------------------------------------------------------------------- 1 | #import "FDKeychain.h" 2 | 3 | @import Security; 4 | 5 | 6 | #pragma mark - Constants 7 | 8 | NSString * const FDKeychainErrorDomain = @"com.1414degrees.keychain"; 9 | 10 | 11 | #pragma mark - Class Definition 12 | 13 | @implementation FDKeychain 14 | 15 | 16 | #pragma mark - Public Methods 17 | 18 | + (NSData *)rawDataForKey: (NSString *)key 19 | forService: (NSString *)service 20 | inAccessGroup: (NSString *)accessGroup 21 | error: (NSError **)error 22 | { 23 | // Load the item from the keychain. 24 | NSDictionary *itemAttributesAndData = [self _itemAttributesAndDataForKey: key 25 | forService: service 26 | inAccessGroup: accessGroup 27 | error: error]; 28 | 29 | // Extract the item's value data. 30 | NSData *rawData = nil; 31 | 32 | if (itemAttributesAndData != nil) 33 | { 34 | rawData = [itemAttributesAndData objectForKey: (__bridge id)kSecValueData]; 35 | } 36 | 37 | return rawData; 38 | } 39 | 40 | + (NSData *)rawDataForKey: (NSString *)key 41 | forService: (NSString *)service 42 | error: (NSError **)error 43 | { 44 | NSData *rawData = [self rawDataForKey: key 45 | forService: service 46 | inAccessGroup: nil 47 | error: error]; 48 | 49 | return rawData; 50 | } 51 | 52 | + (id)itemForKey: (NSString *)key 53 | forService: (NSString *)service 54 | inAccessGroup: (NSString *)accessGroup 55 | error: (NSError **)error 56 | { 57 | // Load the raw data for the item from the keychain. 58 | NSData *rawData = [self rawDataForKey: key 59 | forService: service 60 | inAccessGroup: accessGroup 61 | error: error]; 62 | 63 | // Unarchive the data that was received from the keychain. 64 | id item = nil; 65 | 66 | if (rawData != nil) 67 | { 68 | // Catch any exceptions that occur when unarchiving an item and return a appropriate error object. 69 | // This is useful for the scenario where the encoded object may have changed and can no longer be decoded properly. Rather than crash the application outright give the user the ability to recover from it. 70 | @try 71 | { 72 | item = [NSKeyedUnarchiver unarchiveObjectWithData: rawData]; 73 | } 74 | @catch (NSException *exception) 75 | { 76 | if (error != NULL) 77 | { 78 | NSDictionary *userInfo = @{ 79 | NSLocalizedFailureReasonErrorKey : exception.reason 80 | }; 81 | 82 | *error = [NSError errorWithDomain: FDKeychainErrorDomain 83 | code: FDKeychainUnarchiveErrorCode 84 | userInfo: userInfo]; 85 | } 86 | } 87 | } 88 | 89 | return item; 90 | } 91 | 92 | + (id)itemForKey: (NSString *)key 93 | forService: (NSString *)service 94 | error: (NSError **)error 95 | { 96 | id item = [FDKeychain itemForKey: key 97 | forService: service 98 | inAccessGroup: nil 99 | error: error]; 100 | 101 | return item; 102 | } 103 | 104 | + (BOOL)saveItem: (id)item 105 | forKey: (NSString *)key 106 | forService: (NSString *)service 107 | inAccessGroup: (NSString *)accessGroup 108 | withAccessibility: (FDKeychainAccessibility)accessibility 109 | error: (NSError **)error 110 | { 111 | // Raise exception if either the key or the service parameter are empty. 112 | if ([key length] == 0) 113 | { 114 | [NSException raise: NSInvalidArgumentException 115 | format: @"%s key argument cannot be empty", 116 | __PRETTY_FUNCTION__]; 117 | } 118 | else if ([service length] == 0) 119 | { 120 | [NSException raise: NSInvalidArgumentException 121 | format: @"%s service argument cannot be empty", 122 | __PRETTY_FUNCTION__]; 123 | } 124 | 125 | // Assume the save is successful. 126 | BOOL saveSuccessful = YES; 127 | 128 | // If the item is nil attempt to delete it from the keychain. 129 | if (item == nil) 130 | { 131 | saveSuccessful = [self deleteItemForKey: key 132 | forService: service 133 | error: error]; 134 | } 135 | else 136 | { 137 | // Load the item from the keychain for the key, service and access group to check if it already exists. 138 | NSError *itemFromKeychainError = nil; 139 | NSDictionary *itemFromKeychain = [self _itemAttributesAndDataForKey: key 140 | forService: service 141 | inAccessGroup: accessGroup 142 | error: &itemFromKeychainError]; 143 | 144 | // If any error except "Item Not Found" occured when checking if the item existed immediately fail out. 145 | if (itemFromKeychain == nil 146 | && [itemFromKeychainError code] != errSecItemNotFound) 147 | { 148 | // Return NO because checking if the item existed failed. 149 | saveSuccessful = NO; 150 | 151 | // If an error pointer was passed in update the pointer with an error object describing the problem. 152 | if (error != NULL) 153 | { 154 | *error = itemFromKeychainError; 155 | } 156 | } 157 | // Otherwise, if the keychain did not error out when checking if the item existed proceed with saving the item to the keychain. 158 | else 159 | { 160 | // Archive the item so it can be saved to the keychain. 161 | NSData *valueData = [NSKeyedArchiver archivedDataWithRootObject: item]; 162 | 163 | // If the item does not exist add it to the keychain. 164 | if (itemFromKeychain == nil) 165 | { 166 | NSMutableDictionary *attributes = [FDKeychain _baseQueryDictionaryForKey: key 167 | forService: service 168 | inAccessGroup: accessGroup]; 169 | 170 | [attributes setObject: valueData 171 | forKey: (__bridge id)kSecValueData]; 172 | 173 | switch (accessibility) 174 | { 175 | case FDKeychainAccessibleWhenUnlocked: 176 | { 177 | [attributes setObject: (__bridge id)kSecAttrAccessibleWhenUnlocked 178 | forKey: (__bridge id)kSecAttrAccessible]; 179 | 180 | break; 181 | } 182 | 183 | case FDKeychainAccessibleAfterFirstUnlock: 184 | { 185 | [attributes setObject: (__bridge id)kSecAttrAccessibleAfterFirstUnlock 186 | forKey: (__bridge id)kSecAttrAccessible]; 187 | 188 | break; 189 | } 190 | } 191 | 192 | OSStatus resultCode = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL); 193 | 194 | // Check if the save succeeded. 195 | if (resultCode != errSecSuccess) 196 | { 197 | // Return NO because saving the item failed. 198 | saveSuccessful = NO; 199 | 200 | // If an error pointer was passed in update the pointer with an error object describing the problem. 201 | if (error != NULL) 202 | { 203 | *error = [self _errorForResultCode: resultCode 204 | withKey: key 205 | forService: service]; 206 | } 207 | } 208 | } 209 | // If the item does exist update the item in the keychain. 210 | else 211 | { 212 | NSDictionary *queryDictionary = [FDKeychain _baseQueryDictionaryForKey: key 213 | forService: service 214 | inAccessGroup: accessGroup]; 215 | 216 | NSMutableDictionary *attributesToUpdate = [NSMutableDictionary dictionaryWithObjectsAndKeys: 217 | valueData, 218 | (__bridge id)kSecValueData, 219 | nil]; 220 | 221 | switch (accessibility) 222 | { 223 | case FDKeychainAccessibleWhenUnlocked: 224 | { 225 | [attributesToUpdate setObject: (__bridge id)kSecAttrAccessibleWhenUnlocked 226 | forKey: (__bridge id)kSecAttrAccessible]; 227 | 228 | break; 229 | } 230 | 231 | case FDKeychainAccessibleAfterFirstUnlock: 232 | { 233 | [attributesToUpdate setObject: (__bridge id)kSecAttrAccessibleAfterFirstUnlock 234 | forKey: (__bridge id)kSecAttrAccessible]; 235 | 236 | break; 237 | } 238 | } 239 | 240 | OSStatus resultCode = SecItemUpdate((__bridge CFDictionaryRef)queryDictionary, (__bridge CFDictionaryRef)attributesToUpdate); 241 | 242 | // Check if the update succeeded. 243 | if (resultCode != errSecSuccess) 244 | { 245 | // Return NO because updating the item failed. 246 | saveSuccessful = NO; 247 | 248 | // If an error pointer was passed in update the pointer with an error object describing the problem. 249 | if (error != NULL) 250 | { 251 | *error = [self _errorForResultCode: resultCode 252 | withKey: key 253 | forService: service]; 254 | } 255 | } 256 | } 257 | } 258 | } 259 | 260 | return saveSuccessful; 261 | } 262 | 263 | + (BOOL)saveItem: (id)item 264 | forKey: (NSString *)key 265 | forService: (NSString *)service 266 | error: (NSError **)error 267 | { 268 | BOOL saveSuccessful = [FDKeychain saveItem: item 269 | forKey: key 270 | forService: service 271 | inAccessGroup: nil 272 | withAccessibility: FDKeychainAccessibleAfterFirstUnlock 273 | error: error]; 274 | 275 | return saveSuccessful; 276 | } 277 | 278 | + (BOOL)deleteItemForKey: (NSString *)key 279 | forService: (NSString *)service 280 | inAccessGroup: (NSString *)accessGroup 281 | error: (NSError **)error 282 | { 283 | // Raise exception if either the key or the service parameter are empty. 284 | if ([key length] == 0) 285 | { 286 | [NSException raise: NSInvalidArgumentException 287 | format: @"%s key argument cannot be empty", 288 | __PRETTY_FUNCTION__]; 289 | } 290 | else if ([service length] == 0) 291 | { 292 | [NSException raise: NSInvalidArgumentException 293 | format: @"%s service argument cannot be empty", 294 | __PRETTY_FUNCTION__]; 295 | } 296 | 297 | // Assume the delete will succeed. 298 | BOOL deleteSuccessful = YES; 299 | 300 | // Delete the item from the keychain. 301 | NSDictionary *queryDictionary = [FDKeychain _baseQueryDictionaryForKey: key 302 | forService: service 303 | inAccessGroup: accessGroup]; 304 | 305 | OSStatus resultCode = SecItemDelete((__bridge CFDictionaryRef)queryDictionary); 306 | 307 | // Check if the deletion succeeded. 308 | if (resultCode != errSecSuccess) 309 | { 310 | // Return NO because deleting the item failed. 311 | deleteSuccessful = NO; 312 | 313 | // If an error pointer was passed in update the pointer with an error object describing the problem. 314 | if (error != NULL) 315 | { 316 | *error = [self _errorForResultCode: resultCode 317 | withKey: key 318 | forService: service]; 319 | 320 | // If the delete failed bacause the item did not exist in the keychain create a more descriptive error message. 321 | if ([*error code] == errSecItemNotFound) 322 | { 323 | NSString *localizedDescription = [NSString stringWithFormat: @"Could not delete item with key '%@' for service '%@' from the keychain because it does not exist.", 324 | key, 325 | service]; 326 | NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : localizedDescription, 327 | NSUnderlyingErrorKey : *error }; 328 | 329 | *error = [NSError errorWithDomain: FDKeychainErrorDomain 330 | code: resultCode 331 | userInfo: userInfo]; 332 | } 333 | } 334 | } 335 | 336 | return deleteSuccessful; 337 | } 338 | 339 | + (BOOL)deleteItemForKey: (NSString *)key 340 | forService: (NSString *)service 341 | error: (NSError **)error 342 | { 343 | BOOL deleteSuccessful = [FDKeychain deleteItemForKey: key 344 | forService: service 345 | inAccessGroup: nil 346 | error: error]; 347 | 348 | return deleteSuccessful; 349 | } 350 | 351 | 352 | #pragma mark - Private Methods 353 | 354 | + (NSError *)_errorForResultCode: (OSStatus)resultCode 355 | withKey: (NSString *)key 356 | forService: (NSString *)service 357 | { 358 | NSString *localizedDescription = nil; 359 | 360 | switch (resultCode) 361 | { 362 | case errSecDuplicateItem: 363 | { 364 | localizedDescription = [NSString stringWithFormat: @"Item with key '%@' for service '%@' already exists in the keychain.", 365 | key, 366 | service]; 367 | 368 | break; 369 | } 370 | 371 | case errSecItemNotFound: 372 | { 373 | localizedDescription = [NSString stringWithFormat: @"Item with key '%@' for service '%@' could not be found in the keychain.", 374 | key, 375 | service]; 376 | 377 | break; 378 | } 379 | 380 | case errSecInteractionNotAllowed: 381 | { 382 | localizedDescription = [NSString stringWithFormat: @"Interaction with key '%@' for service '%@' was not allowed. It is possible that the item is only accessible when the device is unlocked and this query is happening when the app is in the background. Double-check your item permissions.", 383 | key, 384 | service]; 385 | 386 | break; 387 | } 388 | 389 | default: 390 | { 391 | localizedDescription = @"This is a undefined error. Check SecBase.h or Apple's iOS Developer Library for more information on this Keychain Services error code."; 392 | 393 | break; 394 | } 395 | } 396 | 397 | NSError *error = [NSError errorWithDomain: FDKeychainErrorDomain 398 | code: resultCode 399 | userInfo: @{ NSLocalizedDescriptionKey : localizedDescription }]; 400 | 401 | return error; 402 | } 403 | 404 | + (NSMutableDictionary *)_baseQueryDictionaryForKey: (NSString *)key 405 | forService: (NSString *)service 406 | inAccessGroup: (NSString *)accessGroup 407 | { 408 | // Create dictionary that will be the basis for all queries against the keychain. 409 | NSMutableDictionary *baseQueryDictionary = [[NSMutableDictionary alloc] 410 | initWithCapacity: 4]; 411 | 412 | [baseQueryDictionary setObject: (__bridge id)kSecClassGenericPassword 413 | forKey: (__bridge id)kSecClass]; 414 | 415 | [baseQueryDictionary setObject: key 416 | forKey: (__bridge id)kSecAttrAccount]; 417 | 418 | [baseQueryDictionary setObject: service 419 | forKey: (__bridge id)kSecAttrService]; 420 | 421 | #if TARGET_IPHONE_SIMULATOR 422 | // Note: If we are running in the Simulator we cannot set the access group. Apps running in the Simulator are not signed so there is no access group for them to check. All apps running in the simulator can see all the keychain items. If you need to test apps that share access groups you will need to install the apps on a device. 423 | #else 424 | if ([accessGroup length] > 0) 425 | { 426 | [baseQueryDictionary setObject: accessGroup 427 | forKey: (__bridge id)kSecAttrAccessGroup]; 428 | } 429 | #endif 430 | 431 | return baseQueryDictionary; 432 | } 433 | 434 | + (NSDictionary *)_itemAttributesAndDataForKey: (NSString *)key 435 | forService: (NSString *)service 436 | inAccessGroup: (NSString *)accessGroup 437 | error: (NSError **)error 438 | { 439 | // Raise exception if either the key or the service parameter are empty. 440 | if ([key length] == 0) 441 | { 442 | [NSException raise: NSInvalidArgumentException 443 | format: @"%s key argument cannot be empty", 444 | __PRETTY_FUNCTION__]; 445 | } 446 | else if ([service length] == 0) 447 | { 448 | [NSException raise: NSInvalidArgumentException 449 | format: @"%s service argument cannot be empty", 450 | __PRETTY_FUNCTION__]; 451 | } 452 | 453 | // Load the item from the keychain that matches the key, service and access group. 454 | NSMutableDictionary *queryDictionary = [FDKeychain _baseQueryDictionaryForKey: key 455 | forService: service 456 | inAccessGroup: accessGroup]; 457 | 458 | [queryDictionary setObject: (__bridge id)kSecMatchLimitOne 459 | forKey: (__bridge id)kSecMatchLimit]; 460 | [queryDictionary setObject: (id)kCFBooleanTrue 461 | forKey: (__bridge id)kSecReturnAttributes]; 462 | [queryDictionary setObject: (id)kCFBooleanTrue 463 | forKey: (__bridge id)kSecReturnData]; 464 | 465 | CFTypeRef itemAttributesAndDataTypeRef = nil; 466 | 467 | OSStatus resultCode = SecItemCopyMatching((__bridge CFDictionaryRef)queryDictionary, &itemAttributesAndDataTypeRef); 468 | 469 | NSDictionary *itemAttributesAndData = nil; 470 | 471 | if (resultCode != errSecSuccess) 472 | { 473 | if (error != NULL) 474 | { 475 | *error = [self _errorForResultCode: resultCode 476 | withKey: key 477 | forService: service]; 478 | } 479 | } 480 | else 481 | { 482 | itemAttributesAndData = (__bridge_transfer NSDictionary *)itemAttributesAndDataTypeRef; 483 | } 484 | 485 | return itemAttributesAndData; 486 | } 487 | 488 | 489 | @end -------------------------------------------------------------------------------- /Framework Project/FDKeychain Tests/Classes/FDKeychainTests.m: -------------------------------------------------------------------------------- 1 | @import XCTest; 2 | 3 | @import FDKeychain; 4 | 5 | 6 | @interface FDKeychainTests : XCTestCase 7 | 8 | @end 9 | 10 | @implementation FDKeychainTests 11 | 12 | - (void)testSaving 13 | { 14 | NSString *key = @"key"; 15 | NSString *service = @"FDKeychainTests"; 16 | NSError *error = nil; 17 | id itemInKeychain = @"Reid"; 18 | 19 | id item = [FDKeychain itemForKey: key 20 | forService: service 21 | error: &error]; 22 | 23 | XCTAssertNil(item, @"No item should exist in the keychain yet."); 24 | XCTAssertNotNil(error, @"Any error should occur because there is no item in the keychain."); 25 | XCTAssertEqualObjects(error.domain, FDKeychainErrorDomain); 26 | XCTAssertEqual(error.code, errSecItemNotFound); 27 | 28 | error = nil; 29 | BOOL saveSuccessful = [FDKeychain saveItem: itemInKeychain 30 | forKey: key 31 | forService: service 32 | error: &error]; 33 | 34 | XCTAssertTrue(saveSuccessful, @"The item should have been successfully saved to the keychain."); 35 | XCTAssertNil(error, @"No error should occur while saving the item to the keychain."); 36 | 37 | error = nil; 38 | item = [FDKeychain itemForKey: key 39 | forService: service 40 | error: &error]; 41 | 42 | XCTAssertNotNil(item, @"An item should exist in the keychain."); 43 | XCTAssertEqualObjects(item, itemInKeychain); 44 | XCTAssertNil(error, @"No error should occur because there is a valid item in the keychain."); 45 | 46 | error = nil; 47 | BOOL deleteSuccessful = [FDKeychain deleteItemForKey: key 48 | forService: service 49 | error: &error]; 50 | 51 | XCTAssertTrue(deleteSuccessful, @"The item should have been successfully deleted from the keychain."); 52 | XCTAssertNil(error, @"No error should occur while deleting the item to the keychain."); 53 | } 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /Framework Project/FDKeychain Tests/Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Framework Project/FDKeychain.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2737F4441BA4C17E00A4BF30 /* FDKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F71A0E199AF84200C5AD3C /* FDKeychain.m */; }; 11 | 2737F4471BA4C17E00A4BF30 /* FDKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F71A0D199AF84200C5AD3C /* FDKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 2737F4721BA4C27800A4BF30 /* FDKeychainTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2737F46F1BA4C27800A4BF30 /* FDKeychainTests.m */; }; 13 | 2737F4731BA4C27800A4BF30 /* FDKeychainTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2737F46F1BA4C27800A4BF30 /* FDKeychainTests.m */; }; 14 | 276FF8AA1CE9177A00C4CFDE /* FDKeychainTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2737F46F1BA4C27800A4BF30 /* FDKeychainTests.m */; }; 15 | 276FF8AB1CE9195F00C4CFDE /* FDKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F71A0E199AF84200C5AD3C /* FDKeychain.m */; }; 16 | 279762C919B6638200B55F7B /* FDKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F71A0D199AF84200C5AD3C /* FDKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 279762CA19B6638C00B55F7B /* FDKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F71A0E199AF84200C5AD3C /* FDKeychain.m */; }; 18 | 27E4DA801CE91A2500B89366 /* FDKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F71A0D199AF84200C5AD3C /* FDKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | 27FCB42F19C2147E00BB1123 /* FDKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F71A0D199AF84200C5AD3C /* FDKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | 27FCB43019C2147E00BB1123 /* FDKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F71A0E199AF84200C5AD3C /* FDKeychain.m */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 2737F45A1BA4C21F00A4BF30 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 27F5117016AF1FEE00B05F89 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 27FCB40B19C212D700BB1123; 29 | remoteInfo = "FDKeychain iOS"; 30 | }; 31 | 2737F4761BA4C6D600A4BF30 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 27F5117016AF1FEE00B05F89 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 2739252519B662790045EA4B; 36 | remoteInfo = "FDKeychain OS X"; 37 | }; 38 | 276FF89B1CE9171C00C4CFDE /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = 27F5117016AF1FEE00B05F89 /* Project object */; 41 | proxyType = 1; 42 | remoteGlobalIDString = 276FF88F1CE9171C00C4CFDE; 43 | remoteInfo = "FDKeychain tVOS"; 44 | }; 45 | /* End PBXContainerItemProxy section */ 46 | 47 | /* Begin PBXFileReference section */ 48 | 2737F44C1BA4C17E00A4BF30 /* FDKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 2737F44F1BA4C1D800A4BF30 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50 | 2737F4541BA4C21F00A4BF30 /* FDKeychain iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "FDKeychain iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 2737F4631BA4C22600A4BF30 /* FDKeychain OS X Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "FDKeychain OS X Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 2737F46F1BA4C27800A4BF30 /* FDKeychainTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FDKeychainTests.m; sourceTree = ""; }; 53 | 2737F4711BA4C27800A4BF30 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 2739252619B662790045EA4B /* FDKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 276FF8901CE9171C00C4CFDE /* FDKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 276FF8991CE9171C00C4CFDE /* FDKeychain tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "FDKeychain tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 276FF8A81CE9174D00C4CFDE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | 279762DB19B669A300B55F7B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | 27F71A0D199AF84200C5AD3C /* FDKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FDKeychain.h; sourceTree = ""; }; 60 | 27F71A0E199AF84200C5AD3C /* FDKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FDKeychain.m; sourceTree = ""; }; 61 | 27FCB40C19C212D700BB1123 /* FDKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FDKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 27FCB42419C2143800BB1123 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63 | /* End PBXFileReference section */ 64 | 65 | /* Begin PBXFrameworksBuildPhase section */ 66 | 2737F4451BA4C17E00A4BF30 /* Frameworks */ = { 67 | isa = PBXFrameworksBuildPhase; 68 | buildActionMask = 2147483647; 69 | files = ( 70 | ); 71 | runOnlyForDeploymentPostprocessing = 0; 72 | }; 73 | 2737F4511BA4C21F00A4BF30 /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | 2737F4601BA4C22600A4BF30 /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | 2739252219B662790045EA4B /* Frameworks */ = { 88 | isa = PBXFrameworksBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | ); 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | 276FF88C1CE9171C00C4CFDE /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | 276FF8961CE9171C00C4CFDE /* Frameworks */ = { 102 | isa = PBXFrameworksBuildPhase; 103 | buildActionMask = 2147483647; 104 | files = ( 105 | ); 106 | runOnlyForDeploymentPostprocessing = 0; 107 | }; 108 | 27FCB40819C212D700BB1123 /* Frameworks */ = { 109 | isa = PBXFrameworksBuildPhase; 110 | buildActionMask = 2147483647; 111 | files = ( 112 | ); 113 | runOnlyForDeploymentPostprocessing = 0; 114 | }; 115 | /* End PBXFrameworksBuildPhase section */ 116 | 117 | /* Begin PBXGroup section */ 118 | 2737F44E1BA4C1D800A4BF30 /* watchOS Supporting Files */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 2737F44F1BA4C1D800A4BF30 /* Info.plist */, 122 | ); 123 | path = "watchOS Supporting Files"; 124 | sourceTree = ""; 125 | }; 126 | 2737F4551BA4C21F00A4BF30 /* FDKeychain Tests */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 2737F46E1BA4C27800A4BF30 /* Classes */, 130 | 2737F4701BA4C27800A4BF30 /* Supporting Files */, 131 | ); 132 | path = "FDKeychain Tests"; 133 | sourceTree = ""; 134 | }; 135 | 2737F46E1BA4C27800A4BF30 /* Classes */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 2737F46F1BA4C27800A4BF30 /* FDKeychainTests.m */, 139 | ); 140 | path = Classes; 141 | sourceTree = ""; 142 | }; 143 | 2737F4701BA4C27800A4BF30 /* Supporting Files */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 2737F4711BA4C27800A4BF30 /* Info.plist */, 147 | ); 148 | path = "Supporting Files"; 149 | sourceTree = ""; 150 | }; 151 | 276FF8A71CE9174D00C4CFDE /* tvOS Supporting Files */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 276FF8A81CE9174D00C4CFDE /* Info.plist */, 155 | ); 156 | path = "tvOS Supporting Files"; 157 | sourceTree = ""; 158 | }; 159 | 279762DA19B669A300B55F7B /* OS X Supporting Files */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 279762DB19B669A300B55F7B /* Info.plist */, 163 | ); 164 | path = "OS X Supporting Files"; 165 | sourceTree = ""; 166 | }; 167 | 27F5116E16AF1FEE00B05F89 = { 168 | isa = PBXGroup; 169 | children = ( 170 | 27F71A07199AF7F500C5AD3C /* FDKeychain Framework */, 171 | 2737F4551BA4C21F00A4BF30 /* FDKeychain Tests */, 172 | 27F5117A16AF1FEE00B05F89 /* Products */, 173 | ); 174 | sourceTree = ""; 175 | usesTabs = 1; 176 | }; 177 | 27F5117A16AF1FEE00B05F89 /* Products */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | 2739252619B662790045EA4B /* FDKeychain.framework */, 181 | 27FCB40C19C212D700BB1123 /* FDKeychain.framework */, 182 | 2737F44C1BA4C17E00A4BF30 /* FDKeychain.framework */, 183 | 2737F4541BA4C21F00A4BF30 /* FDKeychain iOS Tests.xctest */, 184 | 2737F4631BA4C22600A4BF30 /* FDKeychain OS X Tests.xctest */, 185 | 276FF8901CE9171C00C4CFDE /* FDKeychain.framework */, 186 | 276FF8991CE9171C00C4CFDE /* FDKeychain tvOS Tests.xctest */, 187 | ); 188 | name = Products; 189 | sourceTree = ""; 190 | }; 191 | 27F71A07199AF7F500C5AD3C /* FDKeychain Framework */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | 27F71A0C199AF84200C5AD3C /* FDKeychain */, 195 | 27FCB42319C2143800BB1123 /* iOS Supporting Files */, 196 | 2737F44E1BA4C1D800A4BF30 /* watchOS Supporting Files */, 197 | 276FF8A71CE9174D00C4CFDE /* tvOS Supporting Files */, 198 | 279762DA19B669A300B55F7B /* OS X Supporting Files */, 199 | ); 200 | name = "FDKeychain Framework"; 201 | sourceTree = ""; 202 | }; 203 | 27F71A0C199AF84200C5AD3C /* FDKeychain */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | 27F71A0D199AF84200C5AD3C /* FDKeychain.h */, 207 | 27F71A0E199AF84200C5AD3C /* FDKeychain.m */, 208 | ); 209 | name = FDKeychain; 210 | path = ../FDKeychain; 211 | sourceTree = ""; 212 | }; 213 | 27FCB42319C2143800BB1123 /* iOS Supporting Files */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 27FCB42419C2143800BB1123 /* Info.plist */, 217 | ); 218 | path = "iOS Supporting Files"; 219 | sourceTree = ""; 220 | }; 221 | /* End PBXGroup section */ 222 | 223 | /* Begin PBXHeadersBuildPhase section */ 224 | 2737F4461BA4C17E00A4BF30 /* Headers */ = { 225 | isa = PBXHeadersBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | 2737F4471BA4C17E00A4BF30 /* FDKeychain.h in Headers */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | 2739252319B662790045EA4B /* Headers */ = { 233 | isa = PBXHeadersBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | 279762C919B6638200B55F7B /* FDKeychain.h in Headers */, 237 | ); 238 | runOnlyForDeploymentPostprocessing = 0; 239 | }; 240 | 276FF88D1CE9171C00C4CFDE /* Headers */ = { 241 | isa = PBXHeadersBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | 27E4DA801CE91A2500B89366 /* FDKeychain.h in Headers */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | 27FCB40919C212D700BB1123 /* Headers */ = { 249 | isa = PBXHeadersBuildPhase; 250 | buildActionMask = 2147483647; 251 | files = ( 252 | 27FCB42F19C2147E00BB1123 /* FDKeychain.h in Headers */, 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | /* End PBXHeadersBuildPhase section */ 257 | 258 | /* Begin PBXNativeTarget section */ 259 | 2737F4421BA4C17E00A4BF30 /* FDKeychain watchOS */ = { 260 | isa = PBXNativeTarget; 261 | buildConfigurationList = 2737F4491BA4C17E00A4BF30 /* Build configuration list for PBXNativeTarget "FDKeychain watchOS" */; 262 | buildPhases = ( 263 | 2737F4431BA4C17E00A4BF30 /* Sources */, 264 | 2737F4451BA4C17E00A4BF30 /* Frameworks */, 265 | 2737F4461BA4C17E00A4BF30 /* Headers */, 266 | 2737F4481BA4C17E00A4BF30 /* Resources */, 267 | ); 268 | buildRules = ( 269 | ); 270 | dependencies = ( 271 | ); 272 | name = "FDKeychain watchOS"; 273 | productName = "FDKeychain iOS"; 274 | productReference = 2737F44C1BA4C17E00A4BF30 /* FDKeychain.framework */; 275 | productType = "com.apple.product-type.framework"; 276 | }; 277 | 2737F4531BA4C21F00A4BF30 /* FDKeychain iOS Tests */ = { 278 | isa = PBXNativeTarget; 279 | buildConfigurationList = 2737F45C1BA4C21F00A4BF30 /* Build configuration list for PBXNativeTarget "FDKeychain iOS Tests" */; 280 | buildPhases = ( 281 | 2737F4501BA4C21F00A4BF30 /* Sources */, 282 | 2737F4511BA4C21F00A4BF30 /* Frameworks */, 283 | 2737F4521BA4C21F00A4BF30 /* Resources */, 284 | ); 285 | buildRules = ( 286 | ); 287 | dependencies = ( 288 | 2737F45B1BA4C21F00A4BF30 /* PBXTargetDependency */, 289 | ); 290 | name = "FDKeychain iOS Tests"; 291 | productName = "FDKeychain iOS Tests"; 292 | productReference = 2737F4541BA4C21F00A4BF30 /* FDKeychain iOS Tests.xctest */; 293 | productType = "com.apple.product-type.bundle.unit-test"; 294 | }; 295 | 2737F4621BA4C22600A4BF30 /* FDKeychain OS X Tests */ = { 296 | isa = PBXNativeTarget; 297 | buildConfigurationList = 2737F46B1BA4C22600A4BF30 /* Build configuration list for PBXNativeTarget "FDKeychain OS X Tests" */; 298 | buildPhases = ( 299 | 2737F45F1BA4C22600A4BF30 /* Sources */, 300 | 2737F4601BA4C22600A4BF30 /* Frameworks */, 301 | 2737F4611BA4C22600A4BF30 /* Resources */, 302 | ); 303 | buildRules = ( 304 | ); 305 | dependencies = ( 306 | 2737F4771BA4C6D600A4BF30 /* PBXTargetDependency */, 307 | ); 308 | name = "FDKeychain OS X Tests"; 309 | productName = "FDKeychain OS X Tests"; 310 | productReference = 2737F4631BA4C22600A4BF30 /* FDKeychain OS X Tests.xctest */; 311 | productType = "com.apple.product-type.bundle.unit-test"; 312 | }; 313 | 2739252519B662790045EA4B /* FDKeychain OS X */ = { 314 | isa = PBXNativeTarget; 315 | buildConfigurationList = 2739254F19B662790045EA4B /* Build configuration list for PBXNativeTarget "FDKeychain OS X" */; 316 | buildPhases = ( 317 | 2739252119B662790045EA4B /* Sources */, 318 | 2739252219B662790045EA4B /* Frameworks */, 319 | 2739252319B662790045EA4B /* Headers */, 320 | 2739252419B662790045EA4B /* Resources */, 321 | ); 322 | buildRules = ( 323 | ); 324 | dependencies = ( 325 | ); 326 | name = "FDKeychain OS X"; 327 | productName = "FDKeychain OS X"; 328 | productReference = 2739252619B662790045EA4B /* FDKeychain.framework */; 329 | productType = "com.apple.product-type.framework"; 330 | }; 331 | 276FF88F1CE9171C00C4CFDE /* FDKeychain tvOS */ = { 332 | isa = PBXNativeTarget; 333 | buildConfigurationList = 276FF8A51CE9171C00C4CFDE /* Build configuration list for PBXNativeTarget "FDKeychain tvOS" */; 334 | buildPhases = ( 335 | 276FF88B1CE9171C00C4CFDE /* Sources */, 336 | 276FF88C1CE9171C00C4CFDE /* Frameworks */, 337 | 276FF88D1CE9171C00C4CFDE /* Headers */, 338 | 276FF88E1CE9171C00C4CFDE /* Resources */, 339 | ); 340 | buildRules = ( 341 | ); 342 | dependencies = ( 343 | ); 344 | name = "FDKeychain tvOS"; 345 | productName = "FDKeychain tVOS"; 346 | productReference = 276FF8901CE9171C00C4CFDE /* FDKeychain.framework */; 347 | productType = "com.apple.product-type.framework"; 348 | }; 349 | 276FF8981CE9171C00C4CFDE /* FDKeychain tvOS Tests */ = { 350 | isa = PBXNativeTarget; 351 | buildConfigurationList = 276FF8A61CE9171C00C4CFDE /* Build configuration list for PBXNativeTarget "FDKeychain tvOS Tests" */; 352 | buildPhases = ( 353 | 276FF8951CE9171C00C4CFDE /* Sources */, 354 | 276FF8961CE9171C00C4CFDE /* Frameworks */, 355 | 276FF8971CE9171C00C4CFDE /* Resources */, 356 | ); 357 | buildRules = ( 358 | ); 359 | dependencies = ( 360 | 276FF89C1CE9171C00C4CFDE /* PBXTargetDependency */, 361 | ); 362 | name = "FDKeychain tvOS Tests"; 363 | productName = "FDKeychain tVOSTests"; 364 | productReference = 276FF8991CE9171C00C4CFDE /* FDKeychain tvOS Tests.xctest */; 365 | productType = "com.apple.product-type.bundle.unit-test"; 366 | }; 367 | 27FCB40B19C212D700BB1123 /* FDKeychain iOS */ = { 368 | isa = PBXNativeTarget; 369 | buildConfigurationList = 27FCB41C19C212D700BB1123 /* Build configuration list for PBXNativeTarget "FDKeychain iOS" */; 370 | buildPhases = ( 371 | 27FCB40719C212D700BB1123 /* Sources */, 372 | 27FCB40819C212D700BB1123 /* Frameworks */, 373 | 27FCB40919C212D700BB1123 /* Headers */, 374 | 27FCB40A19C212D700BB1123 /* Resources */, 375 | ); 376 | buildRules = ( 377 | ); 378 | dependencies = ( 379 | ); 380 | name = "FDKeychain iOS"; 381 | productName = "FDKeychain iOS"; 382 | productReference = 27FCB40C19C212D700BB1123 /* FDKeychain.framework */; 383 | productType = "com.apple.product-type.framework"; 384 | }; 385 | /* End PBXNativeTarget section */ 386 | 387 | /* Begin PBXProject section */ 388 | 27F5117016AF1FEE00B05F89 /* Project object */ = { 389 | isa = PBXProject; 390 | attributes = { 391 | LastUpgradeCheck = 0700; 392 | ORGANIZATIONNAME = "1414 Degrees"; 393 | TargetAttributes = { 394 | 2737F4531BA4C21F00A4BF30 = { 395 | CreatedOnToolsVersion = 7.0; 396 | }; 397 | 2737F4621BA4C22600A4BF30 = { 398 | CreatedOnToolsVersion = 7.0; 399 | }; 400 | 276FF88F1CE9171C00C4CFDE = { 401 | CreatedOnToolsVersion = 7.3.1; 402 | }; 403 | 276FF8981CE9171C00C4CFDE = { 404 | CreatedOnToolsVersion = 7.3.1; 405 | }; 406 | 27FCB40B19C212D700BB1123 = { 407 | CreatedOnToolsVersion = 6.0; 408 | }; 409 | }; 410 | }; 411 | buildConfigurationList = 27F5117316AF1FEE00B05F89 /* Build configuration list for PBXProject "FDKeychain" */; 412 | compatibilityVersion = "Xcode 3.2"; 413 | developmentRegion = English; 414 | hasScannedForEncodings = 0; 415 | knownRegions = ( 416 | en, 417 | ); 418 | mainGroup = 27F5116E16AF1FEE00B05F89; 419 | productRefGroup = 27F5117A16AF1FEE00B05F89 /* Products */; 420 | projectDirPath = ""; 421 | projectRoot = ""; 422 | targets = ( 423 | 27FCB40B19C212D700BB1123 /* FDKeychain iOS */, 424 | 2737F4421BA4C17E00A4BF30 /* FDKeychain watchOS */, 425 | 276FF88F1CE9171C00C4CFDE /* FDKeychain tvOS */, 426 | 2739252519B662790045EA4B /* FDKeychain OS X */, 427 | 2737F4531BA4C21F00A4BF30 /* FDKeychain iOS Tests */, 428 | 2737F4621BA4C22600A4BF30 /* FDKeychain OS X Tests */, 429 | 276FF8981CE9171C00C4CFDE /* FDKeychain tvOS Tests */, 430 | ); 431 | }; 432 | /* End PBXProject section */ 433 | 434 | /* Begin PBXResourcesBuildPhase section */ 435 | 2737F4481BA4C17E00A4BF30 /* Resources */ = { 436 | isa = PBXResourcesBuildPhase; 437 | buildActionMask = 2147483647; 438 | files = ( 439 | ); 440 | runOnlyForDeploymentPostprocessing = 0; 441 | }; 442 | 2737F4521BA4C21F00A4BF30 /* Resources */ = { 443 | isa = PBXResourcesBuildPhase; 444 | buildActionMask = 2147483647; 445 | files = ( 446 | ); 447 | runOnlyForDeploymentPostprocessing = 0; 448 | }; 449 | 2737F4611BA4C22600A4BF30 /* Resources */ = { 450 | isa = PBXResourcesBuildPhase; 451 | buildActionMask = 2147483647; 452 | files = ( 453 | ); 454 | runOnlyForDeploymentPostprocessing = 0; 455 | }; 456 | 2739252419B662790045EA4B /* Resources */ = { 457 | isa = PBXResourcesBuildPhase; 458 | buildActionMask = 2147483647; 459 | files = ( 460 | ); 461 | runOnlyForDeploymentPostprocessing = 0; 462 | }; 463 | 276FF88E1CE9171C00C4CFDE /* Resources */ = { 464 | isa = PBXResourcesBuildPhase; 465 | buildActionMask = 2147483647; 466 | files = ( 467 | ); 468 | runOnlyForDeploymentPostprocessing = 0; 469 | }; 470 | 276FF8971CE9171C00C4CFDE /* Resources */ = { 471 | isa = PBXResourcesBuildPhase; 472 | buildActionMask = 2147483647; 473 | files = ( 474 | ); 475 | runOnlyForDeploymentPostprocessing = 0; 476 | }; 477 | 27FCB40A19C212D700BB1123 /* Resources */ = { 478 | isa = PBXResourcesBuildPhase; 479 | buildActionMask = 2147483647; 480 | files = ( 481 | ); 482 | runOnlyForDeploymentPostprocessing = 0; 483 | }; 484 | /* End PBXResourcesBuildPhase section */ 485 | 486 | /* Begin PBXSourcesBuildPhase section */ 487 | 2737F4431BA4C17E00A4BF30 /* Sources */ = { 488 | isa = PBXSourcesBuildPhase; 489 | buildActionMask = 2147483647; 490 | files = ( 491 | 2737F4441BA4C17E00A4BF30 /* FDKeychain.m in Sources */, 492 | ); 493 | runOnlyForDeploymentPostprocessing = 0; 494 | }; 495 | 2737F4501BA4C21F00A4BF30 /* Sources */ = { 496 | isa = PBXSourcesBuildPhase; 497 | buildActionMask = 2147483647; 498 | files = ( 499 | 2737F4721BA4C27800A4BF30 /* FDKeychainTests.m in Sources */, 500 | ); 501 | runOnlyForDeploymentPostprocessing = 0; 502 | }; 503 | 2737F45F1BA4C22600A4BF30 /* Sources */ = { 504 | isa = PBXSourcesBuildPhase; 505 | buildActionMask = 2147483647; 506 | files = ( 507 | 2737F4731BA4C27800A4BF30 /* FDKeychainTests.m in Sources */, 508 | ); 509 | runOnlyForDeploymentPostprocessing = 0; 510 | }; 511 | 2739252119B662790045EA4B /* Sources */ = { 512 | isa = PBXSourcesBuildPhase; 513 | buildActionMask = 2147483647; 514 | files = ( 515 | 279762CA19B6638C00B55F7B /* FDKeychain.m in Sources */, 516 | ); 517 | runOnlyForDeploymentPostprocessing = 0; 518 | }; 519 | 276FF88B1CE9171C00C4CFDE /* Sources */ = { 520 | isa = PBXSourcesBuildPhase; 521 | buildActionMask = 2147483647; 522 | files = ( 523 | 276FF8AB1CE9195F00C4CFDE /* FDKeychain.m in Sources */, 524 | ); 525 | runOnlyForDeploymentPostprocessing = 0; 526 | }; 527 | 276FF8951CE9171C00C4CFDE /* Sources */ = { 528 | isa = PBXSourcesBuildPhase; 529 | buildActionMask = 2147483647; 530 | files = ( 531 | 276FF8AA1CE9177A00C4CFDE /* FDKeychainTests.m in Sources */, 532 | ); 533 | runOnlyForDeploymentPostprocessing = 0; 534 | }; 535 | 27FCB40719C212D700BB1123 /* Sources */ = { 536 | isa = PBXSourcesBuildPhase; 537 | buildActionMask = 2147483647; 538 | files = ( 539 | 27FCB43019C2147E00BB1123 /* FDKeychain.m in Sources */, 540 | ); 541 | runOnlyForDeploymentPostprocessing = 0; 542 | }; 543 | /* End PBXSourcesBuildPhase section */ 544 | 545 | /* Begin PBXTargetDependency section */ 546 | 2737F45B1BA4C21F00A4BF30 /* PBXTargetDependency */ = { 547 | isa = PBXTargetDependency; 548 | target = 27FCB40B19C212D700BB1123 /* FDKeychain iOS */; 549 | targetProxy = 2737F45A1BA4C21F00A4BF30 /* PBXContainerItemProxy */; 550 | }; 551 | 2737F4771BA4C6D600A4BF30 /* PBXTargetDependency */ = { 552 | isa = PBXTargetDependency; 553 | target = 2739252519B662790045EA4B /* FDKeychain OS X */; 554 | targetProxy = 2737F4761BA4C6D600A4BF30 /* PBXContainerItemProxy */; 555 | }; 556 | 276FF89C1CE9171C00C4CFDE /* PBXTargetDependency */ = { 557 | isa = PBXTargetDependency; 558 | target = 276FF88F1CE9171C00C4CFDE /* FDKeychain tvOS */; 559 | targetProxy = 276FF89B1CE9171C00C4CFDE /* PBXContainerItemProxy */; 560 | }; 561 | /* End PBXTargetDependency section */ 562 | 563 | /* Begin XCBuildConfiguration section */ 564 | 2737F44A1BA4C17E00A4BF30 /* Debug */ = { 565 | isa = XCBuildConfiguration; 566 | buildSettings = { 567 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 568 | CURRENT_PROJECT_VERSION = 1; 569 | DEFINES_MODULE = YES; 570 | DYLIB_COMPATIBILITY_VERSION = 1; 571 | DYLIB_CURRENT_VERSION = 1; 572 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 573 | INFOPLIST_FILE = "watchOS Supporting Files/Info.plist"; 574 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 575 | SDKROOT = watchos; 576 | SKIP_INSTALL = YES; 577 | VERSIONING_SYSTEM = "apple-generic"; 578 | VERSION_INFO_PREFIX = ""; 579 | }; 580 | name = Debug; 581 | }; 582 | 2737F44B1BA4C17E00A4BF30 /* Release */ = { 583 | isa = XCBuildConfiguration; 584 | buildSettings = { 585 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; 586 | CURRENT_PROJECT_VERSION = 1; 587 | DEFINES_MODULE = YES; 588 | DYLIB_COMPATIBILITY_VERSION = 1; 589 | DYLIB_CURRENT_VERSION = 1; 590 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 591 | INFOPLIST_FILE = "watchOS Supporting Files/Info.plist"; 592 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 593 | SDKROOT = watchos; 594 | SKIP_INSTALL = YES; 595 | VERSIONING_SYSTEM = "apple-generic"; 596 | VERSION_INFO_PREFIX = ""; 597 | }; 598 | name = Release; 599 | }; 600 | 2737F45D1BA4C21F00A4BF30 /* Debug */ = { 601 | isa = XCBuildConfiguration; 602 | buildSettings = { 603 | INFOPLIST_FILE = "FDKeychain Tests/Supporting Files/Info.plist"; 604 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 605 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 606 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.ios.tests; 607 | PRODUCT_NAME = "$(TARGET_NAME)"; 608 | SDKROOT = iphoneos; 609 | }; 610 | name = Debug; 611 | }; 612 | 2737F45E1BA4C21F00A4BF30 /* Release */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | INFOPLIST_FILE = "FDKeychain Tests/Supporting Files/Info.plist"; 616 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 617 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 618 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.ios.tests; 619 | PRODUCT_NAME = "$(TARGET_NAME)"; 620 | SDKROOT = iphoneos; 621 | }; 622 | name = Release; 623 | }; 624 | 2737F46C1BA4C22600A4BF30 /* Debug */ = { 625 | isa = XCBuildConfiguration; 626 | buildSettings = { 627 | COMBINE_HIDPI_IMAGES = YES; 628 | INFOPLIST_FILE = "FDKeychain Tests/Supporting Files/Info.plist"; 629 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 630 | MACOSX_DEPLOYMENT_TARGET = 10.9; 631 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.osx.tests; 632 | PRODUCT_NAME = "$(TARGET_NAME)"; 633 | SDKROOT = macosx; 634 | }; 635 | name = Debug; 636 | }; 637 | 2737F46D1BA4C22600A4BF30 /* Release */ = { 638 | isa = XCBuildConfiguration; 639 | buildSettings = { 640 | COMBINE_HIDPI_IMAGES = YES; 641 | INFOPLIST_FILE = "FDKeychain Tests/Supporting Files/Info.plist"; 642 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 643 | MACOSX_DEPLOYMENT_TARGET = 10.9; 644 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.osx.tests; 645 | PRODUCT_NAME = "$(TARGET_NAME)"; 646 | SDKROOT = macosx; 647 | }; 648 | name = Release; 649 | }; 650 | 2739254B19B662790045EA4B /* Debug */ = { 651 | isa = XCBuildConfiguration; 652 | buildSettings = { 653 | COMBINE_HIDPI_IMAGES = YES; 654 | CURRENT_PROJECT_VERSION = 1; 655 | DEFINES_MODULE = YES; 656 | DYLIB_COMPATIBILITY_VERSION = 1; 657 | DYLIB_CURRENT_VERSION = 1; 658 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 659 | FRAMEWORK_VERSION = A; 660 | INFOPLIST_FILE = "OS X Supporting Files/Info.plist"; 661 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 662 | MACOSX_DEPLOYMENT_TARGET = 10.9; 663 | SDKROOT = macosx; 664 | SKIP_INSTALL = YES; 665 | VERSIONING_SYSTEM = "apple-generic"; 666 | VERSION_INFO_SUFFIX = ""; 667 | }; 668 | name = Debug; 669 | }; 670 | 2739254C19B662790045EA4B /* Release */ = { 671 | isa = XCBuildConfiguration; 672 | buildSettings = { 673 | COMBINE_HIDPI_IMAGES = YES; 674 | CURRENT_PROJECT_VERSION = 1; 675 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 676 | DEFINES_MODULE = YES; 677 | DYLIB_COMPATIBILITY_VERSION = 1; 678 | DYLIB_CURRENT_VERSION = 1; 679 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 680 | FRAMEWORK_VERSION = A; 681 | INFOPLIST_FILE = "OS X Supporting Files/Info.plist"; 682 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 683 | MACOSX_DEPLOYMENT_TARGET = 10.9; 684 | SDKROOT = macosx; 685 | SKIP_INSTALL = YES; 686 | VERSIONING_SYSTEM = "apple-generic"; 687 | VERSION_INFO_SUFFIX = ""; 688 | }; 689 | name = Release; 690 | }; 691 | 276FF8A11CE9171C00C4CFDE /* Debug */ = { 692 | isa = XCBuildConfiguration; 693 | buildSettings = { 694 | CLANG_ANALYZER_NONNULL = YES; 695 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 696 | CLANG_CXX_LIBRARY = "libc++"; 697 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; 698 | CURRENT_PROJECT_VERSION = 1; 699 | DEFINES_MODULE = YES; 700 | DYLIB_COMPATIBILITY_VERSION = 1; 701 | DYLIB_CURRENT_VERSION = 1; 702 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 703 | GCC_C_LANGUAGE_STANDARD = gnu99; 704 | GCC_NO_COMMON_BLOCKS = YES; 705 | GCC_PREPROCESSOR_DEFINITIONS = ( 706 | "DEBUG=1", 707 | "$(inherited)", 708 | ); 709 | INFOPLIST_FILE = "tvOS Supporting Files/Info.plist"; 710 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 711 | MTL_ENABLE_DEBUG_INFO = YES; 712 | SDKROOT = appletvos; 713 | SKIP_INSTALL = YES; 714 | TARGETED_DEVICE_FAMILY = 3; 715 | TVOS_DEPLOYMENT_TARGET = 9.0; 716 | VERSIONING_SYSTEM = "apple-generic"; 717 | VERSION_INFO_PREFIX = ""; 718 | }; 719 | name = Debug; 720 | }; 721 | 276FF8A21CE9171C00C4CFDE /* Release */ = { 722 | isa = XCBuildConfiguration; 723 | buildSettings = { 724 | CLANG_ANALYZER_NONNULL = YES; 725 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 726 | CLANG_CXX_LIBRARY = "libc++"; 727 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution"; 728 | CURRENT_PROJECT_VERSION = 1; 729 | DEFINES_MODULE = YES; 730 | DYLIB_COMPATIBILITY_VERSION = 1; 731 | DYLIB_CURRENT_VERSION = 1; 732 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 733 | GCC_C_LANGUAGE_STANDARD = gnu99; 734 | GCC_NO_COMMON_BLOCKS = YES; 735 | INFOPLIST_FILE = "tvOS Supporting Files/Info.plist"; 736 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 737 | MTL_ENABLE_DEBUG_INFO = NO; 738 | SDKROOT = appletvos; 739 | SKIP_INSTALL = YES; 740 | TARGETED_DEVICE_FAMILY = 3; 741 | TVOS_DEPLOYMENT_TARGET = 9.0; 742 | VERSIONING_SYSTEM = "apple-generic"; 743 | VERSION_INFO_PREFIX = ""; 744 | }; 745 | name = Release; 746 | }; 747 | 276FF8A31CE9171C00C4CFDE /* Debug */ = { 748 | isa = XCBuildConfiguration; 749 | buildSettings = { 750 | INFOPLIST_FILE = "FDKeychain Tests/Supporting Files/Info.plist"; 751 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 752 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.tvos.tests; 753 | PRODUCT_NAME = "FDKeychain tvOS Tests"; 754 | SDKROOT = appletvos; 755 | TVOS_DEPLOYMENT_TARGET = 9.2; 756 | }; 757 | name = Debug; 758 | }; 759 | 276FF8A41CE9171C00C4CFDE /* Release */ = { 760 | isa = XCBuildConfiguration; 761 | buildSettings = { 762 | INFOPLIST_FILE = "FDKeychain Tests/Supporting Files/Info.plist"; 763 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 764 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain.tvos.tests; 765 | PRODUCT_NAME = "FDKeychain tvOS Tests"; 766 | SDKROOT = appletvos; 767 | TVOS_DEPLOYMENT_TARGET = 9.2; 768 | }; 769 | name = Release; 770 | }; 771 | 27F5118516AF1FEE00B05F89 /* Debug */ = { 772 | isa = XCBuildConfiguration; 773 | buildSettings = { 774 | ALWAYS_SEARCH_USER_PATHS = NO; 775 | CLANG_ENABLE_MODULES = YES; 776 | CLANG_ENABLE_OBJC_ARC = YES; 777 | CLANG_WARN_BOOL_CONVERSION = YES; 778 | CLANG_WARN_CONSTANT_CONVERSION = YES; 779 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 780 | CLANG_WARN_EMPTY_BODY = YES; 781 | CLANG_WARN_ENUM_CONVERSION = YES; 782 | CLANG_WARN_INT_CONVERSION = YES; 783 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 784 | CLANG_WARN_UNREACHABLE_CODE = YES; 785 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 786 | COPY_PHASE_STRIP = NO; 787 | ENABLE_STRICT_OBJC_MSGSEND = YES; 788 | ENABLE_TESTABILITY = YES; 789 | GCC_DYNAMIC_NO_PIC = NO; 790 | GCC_OPTIMIZATION_LEVEL = 0; 791 | GCC_PREPROCESSOR_DEFINITIONS = DEBUG; 792 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 793 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 794 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 795 | GCC_WARN_UNDECLARED_SELECTOR = YES; 796 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 797 | GCC_WARN_UNUSED_FUNCTION = YES; 798 | GCC_WARN_UNUSED_VARIABLE = YES; 799 | ONLY_ACTIVE_ARCH = YES; 800 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain; 801 | PRODUCT_NAME = FDKeychain; 802 | }; 803 | name = Debug; 804 | }; 805 | 27F5118616AF1FEE00B05F89 /* Release */ = { 806 | isa = XCBuildConfiguration; 807 | buildSettings = { 808 | ALWAYS_SEARCH_USER_PATHS = NO; 809 | CLANG_ENABLE_MODULES = YES; 810 | CLANG_ENABLE_OBJC_ARC = YES; 811 | CLANG_WARN_BOOL_CONVERSION = YES; 812 | CLANG_WARN_CONSTANT_CONVERSION = YES; 813 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 814 | CLANG_WARN_EMPTY_BODY = YES; 815 | CLANG_WARN_ENUM_CONVERSION = YES; 816 | CLANG_WARN_INT_CONVERSION = YES; 817 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 818 | CLANG_WARN_UNREACHABLE_CODE = YES; 819 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 820 | COPY_PHASE_STRIP = YES; 821 | ENABLE_NS_ASSERTIONS = NO; 822 | ENABLE_STRICT_OBJC_MSGSEND = YES; 823 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 824 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 825 | GCC_WARN_UNDECLARED_SELECTOR = YES; 826 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 827 | GCC_WARN_UNUSED_FUNCTION = YES; 828 | GCC_WARN_UNUSED_VARIABLE = YES; 829 | PRODUCT_BUNDLE_IDENTIFIER = com.1414degrees.keychain; 830 | PRODUCT_NAME = FDKeychain; 831 | VALIDATE_PRODUCT = YES; 832 | }; 833 | name = Release; 834 | }; 835 | 27FCB41D19C212D700BB1123 /* Debug */ = { 836 | isa = XCBuildConfiguration; 837 | buildSettings = { 838 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 839 | CURRENT_PROJECT_VERSION = 1; 840 | DEFINES_MODULE = YES; 841 | DYLIB_COMPATIBILITY_VERSION = 1; 842 | DYLIB_CURRENT_VERSION = 1; 843 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 844 | INFOPLIST_FILE = "iOS Supporting Files/Info.plist"; 845 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 846 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 847 | SDKROOT = iphoneos; 848 | SKIP_INSTALL = YES; 849 | TARGETED_DEVICE_FAMILY = "1,2"; 850 | VERSIONING_SYSTEM = "apple-generic"; 851 | VERSION_INFO_PREFIX = ""; 852 | }; 853 | name = Debug; 854 | }; 855 | 27FCB41E19C212D700BB1123 /* Release */ = { 856 | isa = XCBuildConfiguration; 857 | buildSettings = { 858 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; 859 | CURRENT_PROJECT_VERSION = 1; 860 | DEFINES_MODULE = YES; 861 | DYLIB_COMPATIBILITY_VERSION = 1; 862 | DYLIB_CURRENT_VERSION = 1; 863 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 864 | INFOPLIST_FILE = "iOS Supporting Files/Info.plist"; 865 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 866 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 867 | SDKROOT = iphoneos; 868 | SKIP_INSTALL = YES; 869 | TARGETED_DEVICE_FAMILY = "1,2"; 870 | VERSIONING_SYSTEM = "apple-generic"; 871 | VERSION_INFO_PREFIX = ""; 872 | }; 873 | name = Release; 874 | }; 875 | /* End XCBuildConfiguration section */ 876 | 877 | /* Begin XCConfigurationList section */ 878 | 2737F4491BA4C17E00A4BF30 /* Build configuration list for PBXNativeTarget "FDKeychain watchOS" */ = { 879 | isa = XCConfigurationList; 880 | buildConfigurations = ( 881 | 2737F44A1BA4C17E00A4BF30 /* Debug */, 882 | 2737F44B1BA4C17E00A4BF30 /* Release */, 883 | ); 884 | defaultConfigurationIsVisible = 0; 885 | defaultConfigurationName = Release; 886 | }; 887 | 2737F45C1BA4C21F00A4BF30 /* Build configuration list for PBXNativeTarget "FDKeychain iOS Tests" */ = { 888 | isa = XCConfigurationList; 889 | buildConfigurations = ( 890 | 2737F45D1BA4C21F00A4BF30 /* Debug */, 891 | 2737F45E1BA4C21F00A4BF30 /* Release */, 892 | ); 893 | defaultConfigurationIsVisible = 0; 894 | defaultConfigurationName = Release; 895 | }; 896 | 2737F46B1BA4C22600A4BF30 /* Build configuration list for PBXNativeTarget "FDKeychain OS X Tests" */ = { 897 | isa = XCConfigurationList; 898 | buildConfigurations = ( 899 | 2737F46C1BA4C22600A4BF30 /* Debug */, 900 | 2737F46D1BA4C22600A4BF30 /* Release */, 901 | ); 902 | defaultConfigurationIsVisible = 0; 903 | defaultConfigurationName = Release; 904 | }; 905 | 2739254F19B662790045EA4B /* Build configuration list for PBXNativeTarget "FDKeychain OS X" */ = { 906 | isa = XCConfigurationList; 907 | buildConfigurations = ( 908 | 2739254B19B662790045EA4B /* Debug */, 909 | 2739254C19B662790045EA4B /* Release */, 910 | ); 911 | defaultConfigurationIsVisible = 0; 912 | defaultConfigurationName = Release; 913 | }; 914 | 276FF8A51CE9171C00C4CFDE /* Build configuration list for PBXNativeTarget "FDKeychain tvOS" */ = { 915 | isa = XCConfigurationList; 916 | buildConfigurations = ( 917 | 276FF8A11CE9171C00C4CFDE /* Debug */, 918 | 276FF8A21CE9171C00C4CFDE /* Release */, 919 | ); 920 | defaultConfigurationIsVisible = 0; 921 | defaultConfigurationName = Release; 922 | }; 923 | 276FF8A61CE9171C00C4CFDE /* Build configuration list for PBXNativeTarget "FDKeychain tvOS Tests" */ = { 924 | isa = XCConfigurationList; 925 | buildConfigurations = ( 926 | 276FF8A31CE9171C00C4CFDE /* Debug */, 927 | 276FF8A41CE9171C00C4CFDE /* Release */, 928 | ); 929 | defaultConfigurationIsVisible = 0; 930 | defaultConfigurationName = Release; 931 | }; 932 | 27F5117316AF1FEE00B05F89 /* Build configuration list for PBXProject "FDKeychain" */ = { 933 | isa = XCConfigurationList; 934 | buildConfigurations = ( 935 | 27F5118516AF1FEE00B05F89 /* Debug */, 936 | 27F5118616AF1FEE00B05F89 /* Release */, 937 | ); 938 | defaultConfigurationIsVisible = 0; 939 | defaultConfigurationName = Release; 940 | }; 941 | 27FCB41C19C212D700BB1123 /* Build configuration list for PBXNativeTarget "FDKeychain iOS" */ = { 942 | isa = XCConfigurationList; 943 | buildConfigurations = ( 944 | 27FCB41D19C212D700BB1123 /* Debug */, 945 | 27FCB41E19C212D700BB1123 /* Release */, 946 | ); 947 | defaultConfigurationIsVisible = 0; 948 | defaultConfigurationName = Release; 949 | }; 950 | /* End XCConfigurationList section */ 951 | }; 952 | rootObject = 27F5117016AF1FEE00B05F89 /* Project object */; 953 | } 954 | -------------------------------------------------------------------------------- /Framework Project/FDKeychain.xcodeproj/xcshareddata/xcschemes/FDKeychain OS X.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /Framework Project/FDKeychain.xcodeproj/xcshareddata/xcschemes/FDKeychain iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /Framework Project/FDKeychain.xcodeproj/xcshareddata/xcschemes/FDKeychain tVOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /Framework Project/FDKeychain.xcodeproj/xcshareddata/xcschemes/FDKeychain watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | 66 | 72 | 73 | 79 | 80 | 81 | 82 | 84 | 85 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /Framework Project/OS X Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | NSHumanReadableCopyright 26 | Copyright © 2014 1414 Degrees. All rights reserved. 27 | NSPrincipalClass 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Framework Project/iOS Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Framework Project/tvOS Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Framework Project/watchOS Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | --------------------- 3 | Copyright (c) 2016 Reid Main 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | When I first started programming iOS apps, NSUserDefaults seemed like the ideal place to store user preferences. I made the novice mistake (like a lot of programmers do) of storing username/password or tokens in NSUserDefaults as well. When I realized that NSUserDefaults was completely insecure I looked for an alternative and found that Apple had built-in support for the keychain since iOS 2.0. However, the API for the keychain was entirely in C and I was hoping for a simple "object for key" interface similar to NSDictionary. I wanted to take any object/key pair and save it to the keychain and then retrieve the same object by using the corresponding key. So what did I do? Well, like any self respecting programmer, I wrote this interface. 3 | 4 | Over the span of three projects I refined my class until I created what we have here: the FDKeychain. This is a static class that has three simple methods: save, load, delete. You can take any object that conforms to the NSCoding protocol and save it to the keychain. That key can then be used to load or delete that object from the keychain. 5 | 6 | If you're not familar with the keychain it is a simple password management system that is not application specific. It is built into the operating system which gives it two major benefits: 7 | 8 | 1. Anything you save to the keychain persists through application deletion. This is incredibly useful for generating a Universally Unique Identifier (UUID) which you can then save to the keychain so that even if an application is deleted you can still tell that the user has used your application before. You can also uniquely track a user's multiple devices which is especially important now that Apple has depreciated `[UIDevice +uniqueIdentifier]`. 9 | 2. Any applications that share the same App Id can share access groups in the keychain. By default an application has access to the access group which matches its application identifier (e.g. XXXXXXXXXX.com.1414degrees.keychain). If you give your target an Entitlements file you can specify your keychain access groups and if two appplications reference the same access group, they share items. 10 | 11 | # Installation 12 | There are three supported methods for FDKeychain. All three methods assume your Xcode project is using modules. 13 | 14 | ### 1. Subprojects 15 | 1. Add the "FDKeychain" project inside the "Framework Project" directory as a subproject or add it to your workspace. 16 | 2. Add "FDKeychain (iOS/watchOS|tvOS|Mac)" to the "Target Dependencies" section of your target. 17 | 3. Use "@import FDKeychain" inside any file that will be using FDKeychain. 18 | 19 | ### 2. CocoaPods 20 | Simply add `pod "FDKeychain", "~> 1.3"` to your Podfile. 21 | 22 | ### 3. Copy source code files 23 | Copy the FDKeychain.h and FDKeychain.m files into your project and link your project against the Security framework. 24 | 25 | # Usage 26 | Let us pretend you have an application named "Trambopoline" and you have a password that you want to store securely. 27 | 28 | To save the password to the keychain: 29 | 30 | NSString *password = @"My super secret password"; 31 | NSError *error = nil; 32 | 33 | [FDKeychain saveItem: password 34 | forKey: @"password" 35 | forService: @"Trambopoline" 36 | error: &error]; 37 | 38 | To get the password from the keychain: 39 | 40 | NSError *error = nil; 41 | 42 | NSString *password = [FDKeychain itemForKey: @"password" 43 | forService: @"Trambopoline" 44 | error: &error]; 45 | 46 | To delete the password from the keychain: 47 | 48 | NSError *error = nil; 49 | 50 | [FDKeychain deleteItemForKey: @"password" 51 | forService: @"Trambopoline" 52 | error: &error]; 53 | 54 | Now let us pretend you have two applications named "Moon Unit Alpha" and "Moon Until Zappa" and you want them to share a OAuth token so the user does not need to login to both applications. First, you will need to add an entitlements file to the target of both applications and ensure "XXXXXXXXXX.com.1414degrees.moonunit" is one of the possible keychain access groups (Replace XXXXXXXXXX with the App Id of the provisioning profile you are using to sign the application). 55 | 56 | Saving: 57 | 58 | NSError *error = nil; 59 | 60 | [FDKeychain saveItem: token 61 | forKey: @"token" 62 | forService: @"Moon Unit" 63 | inAccessGroup: @"XXXXXXXXXX.com.1414degrees.moonunit" 64 | withAccessibility: FDKeychainAccessibleAfterFirstUnlock 65 | error: &error]; 66 | 67 | Loading: 68 | 69 | NSError *error = nil; 70 | 71 | OAuthToken *token = [FDKeychain itemForKey: @"token" 72 | forService: @"Moon Unit" 73 | inAccessGroup: @"XXXXXXXXXX.com.1414degrees.moonunit" 74 | error: &error]; 75 | 76 | Deleting: 77 | 78 | NSError *error = nil; 79 | 80 | [FDKeychain deleteItemForKey: @"token" 81 | forService: @"Moon Unit" 82 | inAccessGroup: @"XXXXXXXXXX.com.1414degrees.moonunit" 83 | error: &error]; 84 | 85 | This code will allow you to manipulate the same keychain item in both apps. 86 | 87 | # Example Projects 88 | 89 | ### iOS 90 | The iOS example project has three targets. Each target will install an application that shows two UITextFields: one for local password and another for shared password. Anything you enter in the "Local Password" field will be accessible only in the application it was entered and anything entered in "Shared Password" will be shared amongst the three applications. 91 | 92 | If you change the access group in FDRootViewController.m to have the App Id of the provisioning profile you are going to use to sign the app you can then install all three targets to your device and see an example of shared keychain items. 93 | 94 | ### Mac 95 | The Mac example project is incredibly rudimentary at the moment. It brings up a simple window with a text field and any information in that text field is saved to the keychain. 96 | --------------------------------------------------------------------------------