├── .gitignore ├── .travis.yml ├── Examples └── Example-iOS │ ├── Example-iOS.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── Example-iOS.xcscheme │ └── Example-iOS │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Example-iOS.entitlements │ ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── Info.plist │ ├── LaunchScreen.storyboard │ ├── ViewController.h │ ├── ViewController.m │ └── main.m ├── LICENSE ├── Lib ├── Certificates │ ├── KeychainAccess_Tests.provisionprofile.enc │ ├── apple.cer │ ├── developer_id_app.p12.enc │ ├── iOS_Development.mobileprovision.enc │ ├── ios_developer.p12.enc │ └── tvOS_Development.mobileprovision.enc ├── Configurations │ ├── Base.xcconfig │ ├── Debug.xcconfig │ ├── Release.xcconfig │ ├── TestHost.xcconfig │ ├── Tests.xcconfig │ ├── UICKeyChainStore.xcconfig │ └── libUICKeyChainStore.xcconfig ├── Gemfile ├── Gemfile.lock ├── Rakefile ├── Scripts │ ├── add_key.sh │ └── decode_cert.sh ├── TestHost │ ├── Info.plist │ ├── TestHost.entitlements │ └── main.m ├── UICKeyChainStore.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ ├── TestHost.xcscheme │ │ ├── UICKeyChainStore.xcscheme │ │ └── libUICKeyChainStore.xcscheme ├── UICKeyChainStore │ ├── Info.plist │ ├── UICKeyChainStore.h │ └── UICKeyChainStore.m └── UICKeyChainStoreTests │ ├── Info.plist │ ├── UICKeyChainStoreForwardCompatibilityTests.m │ ├── UICKeyChainStoreTests.m │ └── v1.1.1-Lib │ ├── UICv1KeyChainStore.h │ └── UICv1KeyChainStore.m ├── Package.swift ├── README.md ├── UICKeyChainStore.podspec └── UICKeyChainStore.xcworkspace ├── contents.xcworkspacedata └── xcshareddata ├── IDEWorkspaceChecks.plist └── UICKeyChainStore.xccheckout /.gitignore: -------------------------------------------------------------------------------- 1 | ### https://raw.github.com/github/gitignore/2a4de265d37eca626309d8e115218d18985b5435/Swift.gitignore 2 | 3 | # Xcode 4 | # 5 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 6 | 7 | ## User settings 8 | xcuserdata/ 9 | 10 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 11 | *.xcscmblueprint 12 | *.xccheckout 13 | 14 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 15 | build/ 16 | DerivedData/ 17 | *.moved-aside 18 | *.pbxuser 19 | !default.pbxuser 20 | *.mode1v3 21 | !default.mode1v3 22 | *.mode2v3 23 | !default.mode2v3 24 | *.perspectivev3 25 | !default.perspectivev3 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | 30 | ## App packaging 31 | *.ipa 32 | *.dSYM.zip 33 | *.dSYM 34 | 35 | ## Playgrounds 36 | timeline.xctimeline 37 | playground.xcworkspace 38 | 39 | # Swift Package Manager 40 | # 41 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 42 | # Packages/ 43 | # Package.pins 44 | # Package.resolved 45 | # *.xcodeproj 46 | # 47 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 48 | # hence it is not needed unless you have added a package configuration file to your project 49 | # .swiftpm 50 | 51 | .build/ 52 | 53 | # CocoaPods 54 | # 55 | # We recommend against adding the Pods directory to your .gitignore. However 56 | # you should judge for yourself, the pros and cons are mentioned at: 57 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 58 | # 59 | # Pods/ 60 | # 61 | # Add this line if you want to avoid checking in source code from the Xcode workspace 62 | # *.xcworkspace 63 | 64 | # Carthage 65 | # 66 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 67 | # Carthage/Checkouts 68 | 69 | Carthage/Build/ 70 | 71 | # Accio dependency management 72 | Dependencies/ 73 | .accio/ 74 | 75 | # fastlane 76 | # 77 | # It is recommended to not store the screenshots in the git repo. 78 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 79 | # For more information about the recommended setup visit: 80 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 81 | 82 | fastlane/report.xml 83 | fastlane/Preview.html 84 | fastlane/screenshots/**/*.png 85 | fastlane/test_output 86 | 87 | # Code Injection 88 | # 89 | # After new code Injection tools there's a generated folder /iOSInjectionProject 90 | # https://github.com/johnno1962/injectionforxcode 91 | 92 | iOSInjectionProject/ 93 | 94 | 95 | ### https://raw.github.com/github/gitignore/2a4de265d37eca626309d8e115218d18985b5435/Global/macOS.gitignore 96 | 97 | # General 98 | .DS_Store 99 | .AppleDouble 100 | .LSOverride 101 | 102 | # Icon must end with two \r 103 | Icon 104 | 105 | # Thumbnails 106 | ._* 107 | 108 | # Files that might appear in the root of a volume 109 | .DocumentRevisions-V100 110 | .fseventsd 111 | .Spotlight-V100 112 | .TemporaryItems 113 | .Trashes 114 | .VolumeIcon.icns 115 | .com.apple.timemachine.donotpresent 116 | 117 | # Directories potentially created on remote AFP share 118 | .AppleDB 119 | .AppleDesktop 120 | Network Trash Folder 121 | Temporary Items 122 | .apdisk 123 | 124 | 125 | ### https://raw.github.com/github/gitignore/2a4de265d37eca626309d8e115218d18985b5435/Ruby.gitignore 126 | 127 | *.gem 128 | *.rbc 129 | /.config 130 | /coverage/ 131 | /InstalledFiles 132 | /pkg/ 133 | /spec/reports/ 134 | /spec/examples.txt 135 | /test/tmp/ 136 | /test/version_tmp/ 137 | /tmp/ 138 | 139 | # Used by dotenv library to load environment variables. 140 | # .env 141 | 142 | # Ignore Byebug command history file. 143 | .byebug_history 144 | 145 | ## Specific to RubyMotion: 146 | .dat* 147 | .repl_history 148 | build/ 149 | *.bridgesupport 150 | build-iPhoneOS/ 151 | build-iPhoneSimulator/ 152 | 153 | ## Specific to RubyMotion (use of CocoaPods): 154 | # 155 | # We recommend against adding the Pods directory to your .gitignore. However 156 | # you should judge for yourself, the pros and cons are mentioned at: 157 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 158 | # 159 | # vendor/Pods/ 160 | 161 | ## Documentation cache and generated files: 162 | /.yardoc/ 163 | /_yardoc/ 164 | /doc/ 165 | /rdoc/ 166 | 167 | ## Environment normalization: 168 | /.bundle/ 169 | /vendor/bundle 170 | /lib/bundler/man/ 171 | 172 | # for a library or gem, you might want to ignore these files since the code is 173 | # intended to run in multiple environments; otherwise, check them in: 174 | # Gemfile.lock 175 | # .ruby-version 176 | # .ruby-gemset 177 | 178 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 179 | .rvmrc 180 | 181 | # Used by RuboCop. Remote config files pulled in from inherit_from directive. 182 | # .rubocop-https?--* 183 | 184 | 185 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | cache: 3 | directories: 4 | - Lib/vendor/bundle 5 | install: 6 | - (cd Lib && bundle install --path=vendor/bundle --binstubs=vendor/bin) 7 | before_script: 8 | - ./Lib/Scripts/decode_cert.sh || true 9 | - ./Lib/Scripts/add_key.sh || true 10 | script: 11 | - '(cd Lib && travis_retry bundle exec rake $ACTION)' 12 | branches: 13 | only: 14 | - master 15 | matrix: 16 | include: 17 | - osx_image: xcode10 18 | env: ACTION=build 19 | - osx_image: xcode10 20 | env: ACTION='test:iphonesimulator' 21 | - osx_image: xcode10 22 | env: ACTION='test:appletvsimulator' 23 | - osx_image: xcode10 24 | env: ACTION='test:macosx' 25 | env: 26 | global: 27 | - LANG=en_US.UTF-8 28 | - LC_ALL=en_US.UTF-8 29 | - secure: Fw0I2kQLC6j5BxOw7thOuGwTS6B6thpyM2xdF06Turek8TRGyzjU+QGtH1fdhJd03sDaX7LJTwn3wE2ffMTyfy/7uXGNroHJVfBz4yGjEhvL3z93FLWrLrXQqh1s+apWCJcwuE7kVqDUsjg4/HkIBq3nnGhS/nzlYNxacVx01oI= 30 | - secure: lKWscex7qoKykLXdWZ830mxvnIz27Vz9T4ryb6Ets8H9C58DEWWz/dNqNm8cYIWmTb+xcvPybDwKmggIEvCvumSwI6XtJMfJviQSWpdOg2vIS1LiiILgDLRmpHL8Eb+FXr8MY7PYYc6rnIYp4HvuovnAIgjqUtLZ+vPuL4KEUV4= 31 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 141851491BD2668E005DF9AB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 141851481BD2668E005DF9AB /* LaunchScreen.storyboard */; }; 11 | 145BF3FA1A66C24500D01D0D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 145BF3F91A66C24500D01D0D /* main.m */; }; 12 | 145BF3FD1A66C24500D01D0D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 145BF3FC1A66C24500D01D0D /* AppDelegate.m */; }; 13 | 145BF4001A66C24500D01D0D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 145BF3FF1A66C24500D01D0D /* ViewController.m */; }; 14 | 145BF4051A66C24500D01D0D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 145BF4041A66C24500D01D0D /* Images.xcassets */; }; 15 | 148E865B1F75FEFD00A69105 /* UICKeyChainStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 148E865A1F75FEFD00A69105 /* UICKeyChainStore.framework */; }; 16 | 148E865C1F75FEFD00A69105 /* UICKeyChainStore.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 148E865A1F75FEFD00A69105 /* UICKeyChainStore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 145BF4391A66C45000D01D0D /* CopyFiles */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | 148E865C1F75FEFD00A69105 /* UICKeyChainStore.framework in CopyFiles */, 27 | ); 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 141851481BD2668E005DF9AB /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 34 | 145BF3F41A66C24500D01D0D /* Example-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 145BF3F81A66C24500D01D0D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 145BF3F91A66C24500D01D0D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 37 | 145BF3FB1A66C24500D01D0D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 38 | 145BF3FC1A66C24500D01D0D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 39 | 145BF3FE1A66C24500D01D0D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 40 | 145BF3FF1A66C24500D01D0D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 41 | 145BF4041A66C24500D01D0D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 42 | 148E865A1F75FEFD00A69105 /* UICKeyChainStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UICKeyChainStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 14F2A0081D8F2927000B135F /* Example-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Example-iOS.entitlements"; sourceTree = ""; }; 44 | /* End PBXFileReference section */ 45 | 46 | /* Begin PBXFrameworksBuildPhase section */ 47 | 145BF3F11A66C24500D01D0D /* Frameworks */ = { 48 | isa = PBXFrameworksBuildPhase; 49 | buildActionMask = 2147483647; 50 | files = ( 51 | 148E865B1F75FEFD00A69105 /* UICKeyChainStore.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 145BF3EB1A66C24500D01D0D = { 59 | isa = PBXGroup; 60 | children = ( 61 | 145BF3F61A66C24500D01D0D /* Example-iOS */, 62 | 14C5DBC61F7820020021D0AD /* Frameworks */, 63 | 145BF3F51A66C24500D01D0D /* Products */, 64 | ); 65 | sourceTree = ""; 66 | }; 67 | 145BF3F51A66C24500D01D0D /* Products */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 145BF3F41A66C24500D01D0D /* Example-iOS.app */, 71 | ); 72 | name = Products; 73 | sourceTree = ""; 74 | }; 75 | 145BF3F61A66C24500D01D0D /* Example-iOS */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 145BF3FB1A66C24500D01D0D /* AppDelegate.h */, 79 | 145BF3FC1A66C24500D01D0D /* AppDelegate.m */, 80 | 145BF3FE1A66C24500D01D0D /* ViewController.h */, 81 | 145BF3FF1A66C24500D01D0D /* ViewController.m */, 82 | 141851481BD2668E005DF9AB /* LaunchScreen.storyboard */, 83 | 145BF4041A66C24500D01D0D /* Images.xcassets */, 84 | 145BF3F71A66C24500D01D0D /* Supporting Files */, 85 | ); 86 | path = "Example-iOS"; 87 | sourceTree = ""; 88 | }; 89 | 145BF3F71A66C24500D01D0D /* Supporting Files */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 145BF3F81A66C24500D01D0D /* Info.plist */, 93 | 14F2A0081D8F2927000B135F /* Example-iOS.entitlements */, 94 | 145BF3F91A66C24500D01D0D /* main.m */, 95 | ); 96 | name = "Supporting Files"; 97 | sourceTree = ""; 98 | }; 99 | 14C5DBC61F7820020021D0AD /* Frameworks */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 148E865A1F75FEFD00A69105 /* UICKeyChainStore.framework */, 103 | ); 104 | name = Frameworks; 105 | sourceTree = ""; 106 | }; 107 | /* End PBXGroup section */ 108 | 109 | /* Begin PBXNativeTarget section */ 110 | 145BF3F31A66C24500D01D0D /* Example-iOS */ = { 111 | isa = PBXNativeTarget; 112 | buildConfigurationList = 145BF4171A66C24500D01D0D /* Build configuration list for PBXNativeTarget "Example-iOS" */; 113 | buildPhases = ( 114 | 145BF3F01A66C24500D01D0D /* Sources */, 115 | 145BF3F11A66C24500D01D0D /* Frameworks */, 116 | 145BF3F21A66C24500D01D0D /* Resources */, 117 | 145BF4391A66C45000D01D0D /* CopyFiles */, 118 | ); 119 | buildRules = ( 120 | ); 121 | dependencies = ( 122 | ); 123 | name = "Example-iOS"; 124 | productName = "Example-iOS"; 125 | productReference = 145BF3F41A66C24500D01D0D /* Example-iOS.app */; 126 | productType = "com.apple.product-type.application"; 127 | }; 128 | /* End PBXNativeTarget section */ 129 | 130 | /* Begin PBXProject section */ 131 | 145BF3EC1A66C24500D01D0D /* Project object */ = { 132 | isa = PBXProject; 133 | attributes = { 134 | LastUpgradeCheck = 1200; 135 | ORGANIZATIONNAME = "kishikawa katsumi"; 136 | TargetAttributes = { 137 | 145BF3F31A66C24500D01D0D = { 138 | CreatedOnToolsVersion = 6.1.1; 139 | DevelopmentTeam = 27AEDK3C9F; 140 | }; 141 | }; 142 | }; 143 | buildConfigurationList = 145BF3EF1A66C24500D01D0D /* Build configuration list for PBXProject "Example-iOS" */; 144 | compatibilityVersion = "Xcode 3.2"; 145 | developmentRegion = en; 146 | hasScannedForEncodings = 0; 147 | knownRegions = ( 148 | en, 149 | Base, 150 | ); 151 | mainGroup = 145BF3EB1A66C24500D01D0D; 152 | productRefGroup = 145BF3F51A66C24500D01D0D /* Products */; 153 | projectDirPath = ""; 154 | projectRoot = ""; 155 | targets = ( 156 | 145BF3F31A66C24500D01D0D /* Example-iOS */, 157 | ); 158 | }; 159 | /* End PBXProject section */ 160 | 161 | /* Begin PBXResourcesBuildPhase section */ 162 | 145BF3F21A66C24500D01D0D /* Resources */ = { 163 | isa = PBXResourcesBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | 145BF4051A66C24500D01D0D /* Images.xcassets in Resources */, 167 | 141851491BD2668E005DF9AB /* LaunchScreen.storyboard in Resources */, 168 | ); 169 | runOnlyForDeploymentPostprocessing = 0; 170 | }; 171 | /* End PBXResourcesBuildPhase section */ 172 | 173 | /* Begin PBXSourcesBuildPhase section */ 174 | 145BF3F01A66C24500D01D0D /* Sources */ = { 175 | isa = PBXSourcesBuildPhase; 176 | buildActionMask = 2147483647; 177 | files = ( 178 | 145BF4001A66C24500D01D0D /* ViewController.m in Sources */, 179 | 145BF3FD1A66C24500D01D0D /* AppDelegate.m in Sources */, 180 | 145BF3FA1A66C24500D01D0D /* main.m in Sources */, 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | }; 184 | /* End PBXSourcesBuildPhase section */ 185 | 186 | /* Begin XCBuildConfiguration section */ 187 | 145BF4151A66C24500D01D0D /* Debug */ = { 188 | isa = XCBuildConfiguration; 189 | buildSettings = { 190 | ALWAYS_SEARCH_USER_PATHS = NO; 191 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 192 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 193 | CLANG_CXX_LIBRARY = "libc++"; 194 | CLANG_ENABLE_MODULES = YES; 195 | CLANG_ENABLE_OBJC_ARC = YES; 196 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 197 | CLANG_WARN_BOOL_CONVERSION = YES; 198 | CLANG_WARN_COMMA = YES; 199 | CLANG_WARN_CONSTANT_CONVERSION = YES; 200 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 201 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 202 | CLANG_WARN_EMPTY_BODY = YES; 203 | CLANG_WARN_ENUM_CONVERSION = YES; 204 | CLANG_WARN_INFINITE_RECURSION = YES; 205 | CLANG_WARN_INT_CONVERSION = YES; 206 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 207 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 208 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 209 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 210 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 211 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 212 | CLANG_WARN_STRICT_PROTOTYPES = YES; 213 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 214 | CLANG_WARN_UNREACHABLE_CODE = YES; 215 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 216 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 217 | COPY_PHASE_STRIP = NO; 218 | ENABLE_STRICT_OBJC_MSGSEND = YES; 219 | ENABLE_TESTABILITY = YES; 220 | GCC_C_LANGUAGE_STANDARD = gnu99; 221 | GCC_DYNAMIC_NO_PIC = NO; 222 | GCC_NO_COMMON_BLOCKS = YES; 223 | GCC_OPTIMIZATION_LEVEL = 0; 224 | GCC_PREPROCESSOR_DEFINITIONS = ( 225 | "DEBUG=1", 226 | "$(inherited)", 227 | ); 228 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 229 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 230 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 231 | GCC_WARN_UNDECLARED_SELECTOR = YES; 232 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 233 | GCC_WARN_UNUSED_FUNCTION = YES; 234 | GCC_WARN_UNUSED_VARIABLE = YES; 235 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 236 | MTL_ENABLE_DEBUG_INFO = YES; 237 | ONLY_ACTIVE_ARCH = YES; 238 | SDKROOT = iphoneos; 239 | }; 240 | name = Debug; 241 | }; 242 | 145BF4161A66C24500D01D0D /* Release */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | ALWAYS_SEARCH_USER_PATHS = NO; 246 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 247 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 248 | CLANG_CXX_LIBRARY = "libc++"; 249 | CLANG_ENABLE_MODULES = YES; 250 | CLANG_ENABLE_OBJC_ARC = YES; 251 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 252 | CLANG_WARN_BOOL_CONVERSION = YES; 253 | CLANG_WARN_COMMA = YES; 254 | CLANG_WARN_CONSTANT_CONVERSION = YES; 255 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 256 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 257 | CLANG_WARN_EMPTY_BODY = YES; 258 | CLANG_WARN_ENUM_CONVERSION = YES; 259 | CLANG_WARN_INFINITE_RECURSION = YES; 260 | CLANG_WARN_INT_CONVERSION = YES; 261 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 262 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 263 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 264 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 265 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 266 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 267 | CLANG_WARN_STRICT_PROTOTYPES = YES; 268 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 269 | CLANG_WARN_UNREACHABLE_CODE = YES; 270 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 271 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 272 | COPY_PHASE_STRIP = YES; 273 | ENABLE_NS_ASSERTIONS = NO; 274 | ENABLE_STRICT_OBJC_MSGSEND = YES; 275 | GCC_C_LANGUAGE_STANDARD = gnu99; 276 | GCC_NO_COMMON_BLOCKS = YES; 277 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 278 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 279 | GCC_WARN_UNDECLARED_SELECTOR = YES; 280 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 281 | GCC_WARN_UNUSED_FUNCTION = YES; 282 | GCC_WARN_UNUSED_VARIABLE = YES; 283 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 284 | MTL_ENABLE_DEBUG_INFO = NO; 285 | SDKROOT = iphoneos; 286 | VALIDATE_PRODUCT = YES; 287 | }; 288 | name = Release; 289 | }; 290 | 145BF4181A66C24500D01D0D /* Debug */ = { 291 | isa = XCBuildConfiguration; 292 | buildSettings = { 293 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 294 | CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements"; 295 | DEVELOPMENT_TEAM = 27AEDK3C9F; 296 | INFOPLIST_FILE = "Example-iOS/Info.plist"; 297 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 298 | PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)"; 299 | PRODUCT_NAME = "$(TARGET_NAME)"; 300 | }; 301 | name = Debug; 302 | }; 303 | 145BF4191A66C24500D01D0D /* Release */ = { 304 | isa = XCBuildConfiguration; 305 | buildSettings = { 306 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 307 | CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements"; 308 | DEVELOPMENT_TEAM = 27AEDK3C9F; 309 | INFOPLIST_FILE = "Example-iOS/Info.plist"; 310 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 311 | PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)"; 312 | PRODUCT_NAME = "$(TARGET_NAME)"; 313 | }; 314 | name = Release; 315 | }; 316 | /* End XCBuildConfiguration section */ 317 | 318 | /* Begin XCConfigurationList section */ 319 | 145BF3EF1A66C24500D01D0D /* Build configuration list for PBXProject "Example-iOS" */ = { 320 | isa = XCConfigurationList; 321 | buildConfigurations = ( 322 | 145BF4151A66C24500D01D0D /* Debug */, 323 | 145BF4161A66C24500D01D0D /* Release */, 324 | ); 325 | defaultConfigurationIsVisible = 0; 326 | defaultConfigurationName = Release; 327 | }; 328 | 145BF4171A66C24500D01D0D /* Build configuration list for PBXNativeTarget "Example-iOS" */ = { 329 | isa = XCConfigurationList; 330 | buildConfigurations = ( 331 | 145BF4181A66C24500D01D0D /* Debug */, 332 | 145BF4191A66C24500D01D0D /* Release */, 333 | ); 334 | defaultConfigurationIsVisible = 0; 335 | defaultConfigurationName = Release; 336 | }; 337 | /* End XCConfigurationList section */ 338 | }; 339 | rootObject = 145BF3EC1A66C24500D01D0D /* Project object */; 340 | } 341 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 78 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Example-iOS 4 | // 5 | // Created by kishikawa katsumi on 2015/01/15. 6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Example-iOS 4 | // 5 | // Created by kishikawa katsumi on 2015/01/15. 6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import 11 | 12 | @interface AppDelegate () 13 | 14 | @end 15 | 16 | @implementation AppDelegate 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | UICKeyChainStore *keychainStore = [UICKeyChainStore keyChainStore]; 20 | keychainStore[@"password"] = @"abcd1234"; 21 | 22 | NSLog(@"%@", keychainStore[@"password"]); 23 | 24 | return YES; 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/Example-iOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)com.kishikawakatsumi.Example-iOS 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/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 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // Example-iOS 4 | // 5 | // Created by kishikawa katsumi on 2015/01/15. 6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // Example-iOS 4 | // 5 | // Created by kishikawa katsumi on 2015/01/15. 6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import 11 | 12 | @interface ViewController () 13 | 14 | @end 15 | 16 | @implementation ViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | } 21 | 22 | - (void)didReceiveMemoryWarning { 23 | [super didReceiveMemoryWarning]; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Examples/Example-iOS/Example-iOS/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Example-iOS 4 | // 5 | // Created by kishikawa katsumi on 2015/01/15. 6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2011 kishikawa katsumi 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. -------------------------------------------------------------------------------- /Lib/Certificates/KeychainAccess_Tests.provisionprofile.enc: -------------------------------------------------------------------------------- 1 | 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 158 | m1nn1kcLs46WQmS7a7XSHQ== 159 | -------------------------------------------------------------------------------- /Lib/Certificates/apple.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kishikawakatsumi/UICKeyChainStore/db869212bc69b6198a62efe03e2f5fc8e19c6b65/Lib/Certificates/apple.cer -------------------------------------------------------------------------------- /Lib/Certificates/developer_id_app.p12.enc: -------------------------------------------------------------------------------- 1 | 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 68 | -------------------------------------------------------------------------------- /Lib/Certificates/iOS_Development.mobileprovision.enc: -------------------------------------------------------------------------------- 1 | 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 189 | -------------------------------------------------------------------------------- /Lib/Certificates/ios_developer.p12.enc: -------------------------------------------------------------------------------- 1 | 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 131 | hfJJH1uvIO2vkPfr+fxvTQ== 132 | -------------------------------------------------------------------------------- /Lib/Certificates/tvOS_Development.mobileprovision.enc: -------------------------------------------------------------------------------- 1 | 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 159 | -------------------------------------------------------------------------------- /Lib/Configurations/Base.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_SEARCH_USER_PATHS = NO; 2 | CURRENT_PROJECT_VERSION = 1; 3 | ENABLE_STRICT_OBJC_MSGSEND = YES; 4 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 5 | CLANG_ANALYZER_NONNULL = YES; 6 | CLANG_CXX_LANGUAGE_STANDARD = gnu++0x; 7 | CLANG_CXX_LIBRARY = libc++; 8 | CLANG_ENABLE_MODULES = YES; 9 | CLANG_ENABLE_OBJC_ARC = YES; 10 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 11 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 12 | CLANG_WARN_BOOL_CONVERSION = YES; 13 | CLANG_WARN_COMMA = YES; 14 | CLANG_WARN_CONSTANT_CONVERSION = YES; 15 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 16 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 17 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 18 | CLANG_WARN_EMPTY_BODY = YES; 19 | CLANG_WARN_ENUM_CONVERSION = YES; 20 | CLANG_WARN_INFINITE_RECURSION = YES; 21 | CLANG_WARN_INT_CONVERSION = YES; 22 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 23 | CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; 24 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 25 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 26 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 27 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 28 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 29 | CLANG_WARN_STRICT_PROTOTYPES = YES; 30 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 31 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 32 | CLANG_WARN_UNREACHABLE_CODE = YES; 33 | GCC_NO_COMMON_BLOCKS = YES; 34 | GCC_C_LANGUAGE_STANDARD = gnu99; 35 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 36 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 37 | GCC_WARN_UNDECLARED_SELECTOR = YES; 38 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 39 | GCC_WARN_UNUSED_FUNCTION = YES; 40 | GCC_WARN_UNUSED_VARIABLE = YES; 41 | 42 | VERSION_INFO_PREFIX = ; 43 | VERSIONING_SYSTEM = apple-generic; 44 | 45 | CODE_SIGN_IDENTITY = ; 46 | DEVELOPMENT_TEAM = ; 47 | 48 | MACOSX_DEPLOYMENT_TARGET = 10.9; 49 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 50 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 51 | TVOS_DEPLOYMENT_TARGET = 9.0; 52 | -------------------------------------------------------------------------------- /Lib/Configurations/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Base.xcconfig" 2 | 3 | BITCODE_GENERATION_MODE = marker; 4 | COPY_PHASE_STRIP = NO; 5 | ENABLE_TESTABILITY = YES; 6 | GCC_DYNAMIC_NO_PIC = NO; 7 | GCC_OPTIMIZATION_LEVEL = 0; 8 | GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited); 9 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 10 | MTL_ENABLE_DEBUG_INFO = YES; 11 | ONLY_ACTIVE_ARCH = YES; 12 | -------------------------------------------------------------------------------- /Lib/Configurations/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Base.xcconfig" 2 | 3 | BITCODE_GENERATION_MODE = bitcode; 4 | DEBUG_INFORMATION_FORMAT = dwarf-with-dsym; 5 | COPY_PHASE_STRIP = YES; 6 | ENABLE_NS_ASSERTIONS = NO; 7 | MTL_ENABLE_DEBUG_INFO = NO; 8 | VALIDATE_PRODUCT = YES; 9 | -------------------------------------------------------------------------------- /Lib/Configurations/TestHost.xcconfig: -------------------------------------------------------------------------------- 1 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator; 2 | TARGETED_DEVICE_FAMILY = 1,2,3; 3 | 4 | COMBINE_HIDPI_IMAGES = YES; 5 | COPY_PHASE_STRIP = NO; 6 | INFOPLIST_FILE = TestHost/Info.plist; 7 | PRODUCT_NAME = $(TARGET_NAME); 8 | CLANG_MODULES_AUTOLINK = NO; 9 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 10 | 11 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.KeychainAccess.TestHost; 12 | 13 | CODE_SIGN_ENTITLEMENTS = TestHost/TestHost.entitlements; 14 | 15 | CODE_SIGN_IDENTITY[sdk=iphone*] = iPhone Developer; 16 | CODE_SIGN_IDENTITY[sdk=macosx*] = Developer ID Application; 17 | PROVISIONING_PROFILE_SPECIFIER[sdk=iphone*] = iOS Development; 18 | PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = KeychainAccess Tests; 19 | 20 | DEVELOPMENT_TEAM = 27AEDK3C9F; 21 | 22 | OTHER_LDFLAGS[sdk=iphone*] = -framework UIKit; 23 | OTHER_LDFLAGS[sdk=appletv*] = -framework UIKit; 24 | OTHER_LDFLAGS[sdk=macosx*] = -framework Cocoa; 25 | 26 | PRINCIPAL_CLASS[sdk=iphone*] = UIApplication; 27 | PRINCIPAL_CLASS[sdk=appletv*] = UIApplication; 28 | PRINCIPAL_CLASS[sdk=macosx*] = NSApplication; 29 | 30 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 31 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 32 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 33 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks; 34 | -------------------------------------------------------------------------------- /Lib/Configurations/Tests.xcconfig: -------------------------------------------------------------------------------- 1 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator; 2 | 3 | COMBINE_HIDPI_IMAGES = YES; 4 | FRAMEWORK_SEARCH_PATHS = $(inherited); 5 | INFOPLIST_FILE = UICKeyChainStoreTests/Info.plist; 6 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier); 7 | PRODUCT_NAME = $(TARGET_NAME); 8 | 9 | TEST_HOST[sdk=iphone*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/TestHost; 10 | TEST_HOST[sdk=appletv*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/TestHost; 11 | TEST_HOST[sdk=macosx*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/Contents/MacOS/TestHost; 12 | 13 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks; 14 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 15 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 16 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 17 | 18 | DEVELOPMENT_TEAM = 27AEDK3C9F; 19 | -------------------------------------------------------------------------------- /Lib/Configurations/UICKeyChainStore.xcconfig: -------------------------------------------------------------------------------- 1 | COMBINE_HIDPI_IMAGES = YES; 2 | DEFINES_MODULE = YES; 3 | DYLIB_COMPATIBILITY_VERSION = 1; 4 | DYLIB_CURRENT_VERSION = 1; 5 | DYLIB_INSTALL_NAME_BASE = @rpath; 6 | APPLICATION_EXTENSION_API_ONLY = YES; 7 | INFOPLIST_FILE = UICKeyChainStore/Info.plist; 8 | INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Frameworks; 9 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier); 10 | PRODUCT_NAME = $(PROJECT_NAME); 11 | SKIP_INSTALL = YES; 12 | 13 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchos watchsimulator appletvos appletvsimulator; 14 | TARGETED_DEVICE_FAMILY = 1,2,3,4; 15 | SUPPORTS_MACCATALYST = YES; 16 | DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES; 17 | 18 | ENABLE_BITCODE[sdk=iphone*] = YES; 19 | ENABLE_BITCODE[sdk=watch*] = YES; 20 | ENABLE_BITCODE[sdk=appletv*] = YES; 21 | 22 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks; 23 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 24 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 25 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 26 | -------------------------------------------------------------------------------- /Lib/Configurations/libUICKeyChainStore.xcconfig: -------------------------------------------------------------------------------- 1 | COMBINE_HIDPI_IMAGES = YES; 2 | DEFINES_MODULE = YES; 3 | DYLIB_COMPATIBILITY_VERSION = 1; 4 | DYLIB_CURRENT_VERSION = 1; 5 | DYLIB_INSTALL_NAME_BASE = @rpath; 6 | APPLICATION_EXTENSION_API_ONLY = YES; 7 | EXECUTABLE_PREFIX = lib; 8 | INFOPLIST_FILE = UICKeyChainStore/Info.plist; 9 | INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Frameworks; 10 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier); 11 | PRODUCT_NAME = $(PROJECT_NAME); 12 | SKIP_INSTALL = YES; 13 | 14 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchos watchsimulator appletvos appletvsimulator; 15 | TARGETED_DEVICE_FAMILY = 1,2,3,4; 16 | 17 | MACOSX_DEPLOYMENT_TARGET = 10.6; 18 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 19 | 20 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks; 21 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 22 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 23 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks; 24 | -------------------------------------------------------------------------------- /Lib/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'rake' 4 | gem 'xcpretty' 5 | gem 'xcjobs' 6 | -------------------------------------------------------------------------------- /Lib/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | rake (13.0.1) 5 | rouge (2.0.7) 6 | xcjobs (0.10.0) 7 | xcpretty (0.3.0) 8 | rouge (~> 2.0.7) 9 | 10 | PLATFORMS 11 | ruby 12 | 13 | DEPENDENCIES 14 | rake 15 | xcjobs 16 | xcpretty 17 | 18 | BUNDLED WITH 19 | 2.1.4 20 | -------------------------------------------------------------------------------- /Lib/Rakefile: -------------------------------------------------------------------------------- 1 | require 'xcjobs' 2 | 3 | xcode_version = `xcodebuild -version`.split("\n").first.scan(/\d+/).join('.') 4 | 5 | if xcode_version.start_with?('10') 6 | def destinations(platform: 'iphonesimulator') 7 | if platform == 'iphonesimulator' 8 | [ 'name=iPhone X,OS=12.0' 9 | ] 10 | elsif platform == 'watchsimulator' 11 | [ 'name=Apple Watch Series 4 - 40mm,OS=5.0', 12 | 'name=Apple Watch Series 4 - 44mm,OS=5.0' 13 | ] 14 | elsif platform == 'appletvsimulator' 15 | [ 'name=Apple TV 4K,OS=12.0' 16 | ] 17 | else 18 | [ 19 | 'platform=OS X,arch=x86_64' 20 | ] 21 | end 22 | end 23 | elsif xcode_version.start_with?('9.4') 24 | def destinations(platform: 'iphonesimulator') 25 | if platform == 'iphonesimulator' 26 | [ 'name=iPhone 7,OS=11.4', 27 | 'name=iPhone 8,OS=11.4', 28 | 'name=iPhone X,OS=11.4' 29 | ] 30 | elsif platform == 'watchsimulator' 31 | [ 'name=Apple Watch - 38mm,OS=4.0', 32 | 'name=Apple Watch - 42mm,OS=4.0' 33 | ] 34 | elsif platform == 'appletvsimulator' 35 | [ 'name=Apple TV 4K,OS=11.0' 36 | ] 37 | else 38 | [ 39 | 'platform=OS X,arch=x86_64' 40 | ] 41 | end 42 | end 43 | elsif xcode_version.start_with?('9') 44 | def destinations(platform: 'iphonesimulator') 45 | if platform == 'iphonesimulator' 46 | [ 'name=iPhone 6s Plus,OS=11.0', 47 | 'name=iPhone SE,OS=11.0', 48 | 'name=iPhone 7,OS=11.0', 49 | 'name=iPhone 8,OS=11.0', 50 | 'name=iPhone X,OS=11.0', 51 | 'name=iPad Air 2,OS=11.0', 52 | 'name=iPad Pro (9.7-inch),OS=11.0', 53 | 'name=iPad Pro (12.9-inch),OS=11.0' 54 | ] 55 | elsif platform == 'watchsimulator' 56 | [ 'name=Apple Watch - 38mm,OS=4.0', 57 | 'name=Apple Watch - 42mm,OS=4.0' 58 | ] 59 | elsif platform == 'appletvsimulator' 60 | [ 'name=Apple TV 1080p,OS=11.0' 61 | ] 62 | else 63 | [ 64 | 'platform=OS X,arch=x86_64' 65 | ] 66 | end 67 | end 68 | elsif xcode_version.start_with?('8.3') 69 | def destinations(platform: 'iphonesimulator') 70 | if platform == 'iphonesimulator' 71 | [ 'name=iPhone 5,OS=10.3.1', 72 | 'name=iPhone 5s,OS=10.3.1', 73 | 'name=iPhone 6,OS=10.3.1', 74 | 'name=iPhone 6s Plus,OS=10.3.1', 75 | 'name=iPhone SE,OS=10.3.1', 76 | 'name=iPad Air 2,OS=10.3.1', 77 | 'name=iPad Pro (9.7-inch),OS=10.3.1', 78 | 'name=iPad Pro (12.9-inch),OS=10.3.1' 79 | ] 80 | elsif platform == 'watchsimulator' 81 | [ 'name=Apple Watch - 38mm,OS=3.0', 82 | 'name=Apple Watch - 42mm,OS=3.0' 83 | ] 84 | elsif platform == 'appletvsimulator' 85 | [ 'name=Apple TV 1080p,OS=10.0' 86 | ] 87 | else 88 | [ 89 | 'platform=OS X,arch=x86_64' 90 | ] 91 | end 92 | end 93 | elsif xcode_version.start_with?('8.0') 94 | def destinations(platform: 'iphonesimulator') 95 | if platform == 'iphonesimulator' 96 | [ 'name=iPhone 5,OS=10.0', 97 | 'name=iPhone 5s,OS=10.0', 98 | 'name=iPhone 6,OS=10.0', 99 | 'name=iPhone 6s Plus,OS=10.0', 100 | 'name=iPhone SE,OS=10.0', 101 | 'name=iPad Air 2,OS=10.0', 102 | 'name=iPad Pro (9.7 inch),OS=10.0', 103 | 'name=iPad Pro (12.9 inch),OS=10.0' 104 | ] 105 | elsif platform == 'watchsimulator' 106 | [ 'name=Apple Watch - 38mm,OS=3.0', 107 | 'name=Apple Watch - 42mm,OS=3.0' 108 | ] 109 | elsif platform == 'appletvsimulator' 110 | [ 'name=Apple TV 1080p,OS=10.0' 111 | ] 112 | else 113 | [ 114 | 'platform=OS X,arch=x86_64' 115 | ] 116 | end 117 | end 118 | elsif xcode_version.start_with?('7.3') || xcode_version.start_with?('7.2') 119 | def destinations(platform: 'iphonesimulator') 120 | if platform == 'iphonesimulator' 121 | [ 'name=iPad 2,OS=8.1', 122 | 'name=iPad Air,OS=8.1', 123 | 'name=iPhone 4s,OS=8.1', 124 | 'name=iPhone 4s,OS=8.3', 125 | 'name=iPhone 4s,OS=8.4', 126 | 'name=iPhone 4s,OS=9.0', 127 | 'name=iPhone 4s,OS=9.2', 128 | 'name=iPhone 5,OS=8.1', 129 | 'name=iPhone 5s,OS=8.1', 130 | 'name=iPhone 6,OS=8.1', 131 | 'name=iPhone 6,OS=8.2', 132 | 'name=iPhone 6,OS=8.3', 133 | 'name=iPhone 6,OS=8.4', 134 | 'name=iPhone 6,OS=9.0', 135 | 'name=iPhone 6,OS=9.2', 136 | 'name=iPhone 6 Plus,OS=8.1', 137 | 'name=iPhone 6 Plus,OS=8.2', 138 | 'name=iPhone 6 Plus,OS=8.3', 139 | 'name=iPhone 6 Plus,OS=8.4', 140 | 'name=iPhone 6 Plus,OS=9.0', 141 | 'name=iPhone 6 Plus,OS=9.2' 142 | ] 143 | elsif platform == 'watchsimulator' 144 | [ 'name=Apple Watch - 38mm,OS=2.0', 145 | 'name=Apple Watch - 42mm,OS=2.0', 146 | 'name=Apple Watch - 38mm,OS=2.1', 147 | 'name=Apple Watch - 42mm,OS=2.1', 148 | ] 149 | elsif platform == 'appletvsimulator' 150 | [ 'name=Apple TV 1080p,OS=9.0', 151 | 'name=Apple TV 1080p,OS=9.1', 152 | ] 153 | else 154 | [ 155 | 'platform=OS X,arch=x86_64' 156 | ] 157 | end 158 | end 159 | elsif xcode_version.start_with?('7.1') 160 | def destinations(platform: 'iphonesimulator') 161 | if platform == 'iphonesimulator' 162 | [ 'name=iPad 2,OS=8.1', 163 | 'name=iPad Air,OS=8.1', 164 | 'name=iPhone 4s,OS=8.1', 165 | 'name=iPhone 4s,OS=8.3', 166 | 'name=iPhone 4s,OS=8.4', 167 | 'name=iPhone 4s,OS=9.0', 168 | 'name=iPhone 4s,OS=9.1', 169 | 'name=iPhone 5,OS=8.1', 170 | 'name=iPhone 5s,OS=8.1', 171 | 'name=iPhone 6,OS=8.1', 172 | 'name=iPhone 6,OS=8.2', 173 | 'name=iPhone 6,OS=8.3', 174 | 'name=iPhone 6,OS=8.4', 175 | 'name=iPhone 6,OS=9.0', 176 | 'name=iPhone 6,OS=9.1', 177 | 'name=iPhone 6 Plus,OS=8.1', 178 | 'name=iPhone 6 Plus,OS=8.2', 179 | 'name=iPhone 6 Plus,OS=8.3', 180 | 'name=iPhone 6 Plus,OS=8.4', 181 | 'name=iPhone 6 Plus,OS=9.0', 182 | 'name=iPhone 6 Plus,OS=9.1' 183 | ] 184 | elsif platform == 'watchsimulator' 185 | [ 'name=Apple Watch - 38mm,OS=2.0', 186 | 'name=Apple Watch - 42mm,OS=2.0', 187 | ] 188 | elsif platform == 'appletvsimulator' 189 | [ 'name=Apple TV 1080p,OS=9.0', 190 | ] 191 | else 192 | [ 193 | 'platform=OS X,arch=x86_64' 194 | ] 195 | end 196 | end 197 | elsif xcode_version.start_with?('7.0') 198 | def destinations(platform: 'iphonesimulator') 199 | if platform == 'iphonesimulator' 200 | [ 'name=iPad 2,OS=8.1', 201 | 'name=iPad Air,OS=8.1', 202 | 'name=iPhone 4s,OS=8.1', 203 | 'name=iPhone 4s,OS=8.3', 204 | 'name=iPhone 4s,OS=8.4', 205 | 'name=iPhone 4s,OS=9.0', 206 | 'name=iPhone 5,OS=8.1', 207 | 'name=iPhone 5s,OS=8.1', 208 | 'name=iPhone 6,OS=8.1', 209 | 'name=iPhone 6,OS=8.2', 210 | 'name=iPhone 6,OS=8.3', 211 | 'name=iPhone 6,OS=8.4', 212 | 'name=iPhone 6,OS=9.0', 213 | 'name=iPhone 6 Plus,OS=8.1', 214 | 'name=iPhone 6 Plus,OS=8.2', 215 | 'name=iPhone 6 Plus,OS=8.3', 216 | 'name=iPhone 6 Plus,OS=8.4', 217 | 'name=iPhone 6 Plus,OS=9.0', 218 | ] 219 | elsif platform == 'watchsimulator' 220 | [ 'name=Apple Watch - 38mm,OS=2.0', 221 | 'name=Apple Watch - 42mm,OS=2.0', 222 | ] 223 | else 224 | [ 225 | 'platform=OS X,arch=x86_64' 226 | ] 227 | end 228 | end 229 | else 230 | def destinations(platform: 'iphonesimulator') 231 | if platform == 'iphonesimulator' 232 | [ 'name=iPad 2,OS=8.1', 233 | 'name=iPad Air,OS=8.1', 234 | 'name=iPhone 4s,OS=8.1', 235 | 'name=iPhone 4s,OS=8.4', 236 | 'name=iPhone 5,OS=8.1', 237 | 'name=iPhone 5s,OS=8.1', 238 | 'name=iPhone 6,OS=8.1', 239 | 'name=iPhone 6,OS=8.2', 240 | 'name=iPhone 6,OS=8.4', 241 | 'name=iPhone 6 Plus,OS=8.1', 242 | 'name=iPhone 6 Plus,OS=8.2', 243 | 'name=iPhone 6 Plus,OS=8.4', 244 | ] 245 | elsif platform == 'watchsimulator' 246 | [ 'name=Apple Watch - 38mm,OS=2.0', 247 | 'name=Apple Watch - 42mm,OS=2.0', 248 | ] 249 | else 250 | [ 251 | 'platform=OS X,arch=x86_64' 252 | ] 253 | end 254 | end 255 | end 256 | 257 | def schemes 258 | ['UICKeyChainStore', 'libUICKeyChainStore'] 259 | end 260 | 261 | if xcode_version.start_with?('7.0') 262 | def supportedPlatforms 263 | ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator'] 264 | end 265 | elsif xcode_version.start_with?('6') 266 | def supportedPlatforms 267 | ['macosx', 'iphoneos', 'iphonesimulator'] 268 | end 269 | else 270 | def supportedPlatforms 271 | ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator', 'appletvos', 'appletvsimulator'] 272 | end 273 | end 274 | 275 | def configurations 276 | ['Debug', 'Release'] 277 | end 278 | 279 | desc "build for all platforms" 280 | task :build do |t| 281 | supportedPlatforms 282 | .product(configurations) 283 | .map { |platform, configuration| Rake::Task["build:#{platform}:#{configuration.downcase}"] } 284 | .map(&:invoke) 285 | end 286 | 287 | namespace :build do 288 | schemes.each do |scheme| 289 | supportedPlatforms.product(configurations).each do |platform, configuration| 290 | XCJobs::Build.new("#{platform}:#{configuration.downcase}") do |t| 291 | t.project = 'UICKeyChainStore' 292 | t.scheme = scheme 293 | t.sdk = platform 294 | t.configuration = configuration 295 | if xcode_version.start_with?('10') 296 | if platform == 'iphonesimulator' 297 | t.add_destination('name=iPhone X,OS=12.0') 298 | elsif platform == 'watchsimulator' 299 | t.add_destination('name=Apple Watch Series 4 - 44mm,OS=5.0') 300 | elsif platform == 'appletvsimulator' 301 | t.add_destination('name=Apple TV 4K,OS=12.0') 302 | end 303 | elsif xcode_version.start_with?('9.4') 304 | if platform == 'iphonesimulator' 305 | t.add_destination('name=iPhone 7,OS=11.4') 306 | elsif platform == 'watchsimulator' 307 | t.add_destination('name=Apple Watch - 42mm,OS=3.2') 308 | elsif platform == 'appletvsimulator' 309 | t.add_destination('name=Apple TV 4K,OS=11.0') 310 | end 311 | elsif xcode_version.start_with?('9.0') 312 | if platform == 'iphonesimulator' 313 | t.add_destination('name=iPhone 6,OS=11.0') 314 | elsif platform == 'watchsimulator' 315 | t.add_destination('name=Apple Watch - 42mm,OS=3.1') 316 | elsif platform == 'appletvsimulator' 317 | t.add_destination('name=Apple TV 1080p,OS=11.0') 318 | end 319 | elsif xcode_version.start_with?('8.0') 320 | if platform == 'iphonesimulator' 321 | t.add_destination('name=iPhone 6,OS=10.0') 322 | elsif platform == 'watchsimulator' 323 | t.add_destination('name=Apple Watch - 42mm,OS=3.0') 324 | elsif platform == 'appletvsimulator' 325 | t.add_destination('name=Apple TV 1080p,OS=10.0') 326 | end 327 | elsif xcode_version.start_with?('7.3') || xcode_version.start_with?('7.2') 328 | if platform == 'iphonesimulator' 329 | t.add_destination('name=iPhone 6,OS=9.2') 330 | elsif platform == 'watchsimulator' 331 | t.add_destination('name=Apple Watch - 42mm,OS=2.1') 332 | elsif platform == 'appletvsimulator' 333 | t.add_destination('name=Apple TV 1080p,OS=9.1') 334 | end 335 | end 336 | t.build_dir = 'build' 337 | t.hide_shell_script_environment = true 338 | t.formatter = 'xcpretty -c' 339 | if ENV['CI'] 340 | t.add_build_setting('CODE_SIGN_IDENTITY', '') 341 | t.add_build_setting('CODE_SIGNING_REQUIRED', 'NO') 342 | end 343 | end 344 | end 345 | end 346 | end 347 | 348 | namespace :test do 349 | supportedPlatforms 350 | .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' } 351 | .each do |platform| 352 | task platform do |t| 353 | configurations.each do |configuration| 354 | destinations(platform: platform) 355 | .map { |destination| Rake::Task["test:#{platform}:#{configuration.downcase}:#{destination}"] } 356 | .map(&:invoke) 357 | end 358 | end 359 | end 360 | end 361 | 362 | namespace :test do 363 | supportedPlatforms 364 | .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' } 365 | .product(configurations) 366 | .each do |platform, configuration| 367 | destinations(platform: platform).each do |destination| 368 | XCJobs::Test.new("#{platform}:#{configuration.downcase}:#{destination}") do |t| 369 | t.project = 'UICKeyChainStore' 370 | t.scheme = 'UICKeyChainStore' 371 | t.sdk = platform 372 | t.configuration = configuration 373 | t.add_destination(destination) 374 | t.coverage = true 375 | t.build_dir = 'build' 376 | t.hide_shell_script_environment = true 377 | t.after_action do 378 | build_coverage_reports() 379 | puts `curl -L https://codecov.io/bash | bash -s -- -f 'coverage.txt'` 380 | end 381 | end 382 | end 383 | end 384 | end 385 | 386 | def build_coverage_reports() 387 | project_name = 'UICKeyChainStore' 388 | profdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first 389 | Dir.glob(File.join('build', "/**/#{project_name}")) do |target| 390 | output = `xcrun llvm-cov report -instr-profile "#{profdata}" "#{target}" -arch=x86_64` 391 | if $?.success? 392 | puts output 393 | `xcrun llvm-cov show -instr-profile "#{profdata}" "#{target}" -arch=x86_64 -use-color=0 > coverage.txt` 394 | break 395 | end 396 | end 397 | end 398 | -------------------------------------------------------------------------------- /Lib/Scripts/add_key.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | security create-keychain -p travis build.keychain 4 | security default-keychain -s build.keychain 5 | security unlock-keychain -p travis build.keychain 6 | security set-keychain-settings -t 3600 -l ~/Library/Keychains/build.keychain 7 | 8 | security import ./Lib/Certificates/apple.cer -k ~/Library/Keychains/build.keychain -T /usr/bin/codesign 9 | security import ./Lib/Certificates/ios_developer.p12 -k ~/Library/Keychains/build.keychain -P $PASSPHRASE -T /usr/bin/codesign 10 | security import ./Lib/Certificates/developer_id_app.p12 -k ~/Library/Keychains/build.keychain -P $PASSPHRASE -T /usr/bin/codesign 11 | 12 | security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k travis build.keychain 13 | 14 | mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles 15 | cp ./Lib/Certificates/*.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/ 16 | cp ./Lib/Certificates/*.provisionprofile ~/Library/MobileDevice/Provisioning\ Profiles/ 17 | -------------------------------------------------------------------------------- /Lib/Scripts/decode_cert.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | CERT_DIR="./Lib/Certificates" 4 | FILES=('ios_developer.p12' 'developer_id_app.p12' 'iOS_Development.mobileprovision'\ 5 | 'tvOS_Development.mobileprovision' 'KeychainAccess_Tests.provisionprofile') 6 | 7 | for file in ${FILES[@]}; do 8 | openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in "$CERT_DIR"/"$file".enc -d -a -out "$CERT_DIR"/"$file" 9 | done 10 | -------------------------------------------------------------------------------- /Lib/TestHost/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 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIRequiredDeviceCapabilities 24 | 25 | armv7 26 | 27 | UISupportedInterfaceOrientations 28 | 29 | UIInterfaceOrientationPortrait 30 | 31 | NSPrincipalClass 32 | $(PRINCIPAL_CLASS) 33 | 34 | 35 | -------------------------------------------------------------------------------- /Lib/TestHost/TestHost.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)com.kishikawakatsumi.KeychainAccess.TestHost 8 | $(AppIdentifierPrefix)shared 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Lib/TestHost/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // TestHost 4 | // 5 | // Created by kishikawakatsumi on 9/19/16. 6 | // Copyright © 2016 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #if TARGET_OS_WATCH 12 | 13 | // watchOS doesn't support testing at this time. 14 | int main(int argc, const char *argv[]) { 15 | } 16 | 17 | #elif TARGET_OS_IPHONE || TARGET_OS_TV 18 | 19 | #import 20 | 21 | @interface AppDelegate : UIResponder 22 | @property (strong, nonatomic) UIWindow *window; 23 | @end 24 | 25 | @implementation AppDelegate 26 | @end 27 | 28 | int main(int argc, char *argv[]) { 29 | @autoreleasepool { 30 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 31 | } 32 | } 33 | 34 | #else 35 | 36 | #import 37 | 38 | int main(int argc, const char *argv[]) { 39 | @autoreleasepool { 40 | return NSApplicationMain(argc, argv); 41 | } 42 | } 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 14796A481C1CD9A500169D09 /* UICKeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 14A59CD71A62D4C3006561CC /* UICKeyChainStore.m */; }; 11 | 14796A4B1C1CD9A500169D09 /* UICKeyChainStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A59CA21A62CF6E006561CC /* UICKeyChainStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 14796A561C1CD9B500169D09 /* UICKeyChainStoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14A59CAF1A62CF6E006561CC /* UICKeyChainStoreTests.m */; }; 13 | 14796A571C1CD9B500169D09 /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */; }; 14 | 14796A581C1CD9B500169D09 /* UICv1KeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */; }; 15 | 14796A631C1CD9C900169D09 /* UICKeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 14A59CD71A62D4C3006561CC /* UICKeyChainStore.m */; }; 16 | 148993CA1D8F24DB000132F7 /* UICKeyChainStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14796A501C1CD9A500169D09 /* UICKeyChainStore.framework */; }; 17 | 148993D31D8F2515000132F7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 148993D21D8F2515000132F7 /* main.m */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 14021B942169FD00006AD6AE /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 14A59C941A62CF6E006561CC /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 148993CE1D8F2515000132F7; 26 | remoteInfo = TestHost; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXCopyFilesBuildPhase section */ 31 | 14796A651C1CD9C900169D09 /* CopyFiles */ = { 32 | isa = PBXCopyFilesBuildPhase; 33 | buildActionMask = 2147483647; 34 | dstPath = "include/$(PRODUCT_NAME)"; 35 | dstSubfolderSpec = 16; 36 | files = ( 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXCopyFilesBuildPhase section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | 143BF28E1C1CD598002BE6B3 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Base.xcconfig; path = Configurations/Base.xcconfig; sourceTree = ""; }; 44 | 143BF28F1C1CD598002BE6B3 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Configurations/Debug.xcconfig; sourceTree = ""; }; 45 | 143BF2901C1CD598002BE6B3 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Configurations/Release.xcconfig; sourceTree = ""; }; 46 | 143BF2911C1CD598002BE6B3 /* Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Tests.xcconfig; path = Configurations/Tests.xcconfig; sourceTree = ""; }; 47 | 143BF2921C1CD598002BE6B3 /* UICKeyChainStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = UICKeyChainStore.xcconfig; path = Configurations/UICKeyChainStore.xcconfig; sourceTree = ""; }; 48 | 1478088D1D8F285E007FA638 /* TestHost.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TestHost.entitlements; sourceTree = ""; }; 49 | 14796A501C1CD9A500169D09 /* UICKeyChainStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UICKeyChainStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | 14796A5F1C1CD9B500169D09 /* UICKeyChainStoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UICKeyChainStoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 14796A691C1CD9C900169D09 /* libUICKeyChainStore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libUICKeyChainStore.a; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 14796A791C1CDB8A00169D09 /* libUICKeyChainStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = libUICKeyChainStore.xcconfig; path = Configurations/libUICKeyChainStore.xcconfig; sourceTree = ""; }; 53 | 148993CF1D8F2515000132F7 /* TestHost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestHost.app; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 148993D21D8F2515000132F7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 55 | 148993E21D8F2515000132F7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 14A59CA11A62CF6E006561CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | 14A59CA21A62CF6E006561CC /* UICKeyChainStore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UICKeyChainStore.h; sourceTree = ""; }; 58 | 14A59CAE1A62CF6E006561CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | 14A59CAF1A62CF6E006561CC /* UICKeyChainStoreTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UICKeyChainStoreTests.m; sourceTree = ""; }; 60 | 14A59CD71A62D4C3006561CC /* UICKeyChainStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICKeyChainStore.m; sourceTree = ""; }; 61 | 14F2A00B1D8F31A3000B135F /* TestHost.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = TestHost.xcconfig; path = Configurations/TestHost.xcconfig; sourceTree = ""; }; 62 | 3ACDC27D1A931BCE00C7A63A /* UICv1KeyChainStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICv1KeyChainStore.h; sourceTree = ""; }; 63 | 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICv1KeyChainStore.m; sourceTree = ""; }; 64 | 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICKeyChainStoreForwardCompatibilityTests.m; sourceTree = ""; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 14796A491C1CD9A500169D09 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | 14796A591C1CD9B500169D09 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 148993CA1D8F24DB000132F7 /* UICKeyChainStore.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | 14796A641C1CD9C900169D09 /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | 148993CC1D8F2515000132F7 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | 143BF28D1C1CD57C002BE6B3 /* Configurations */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 143BF28E1C1CD598002BE6B3 /* Base.xcconfig */, 104 | 143BF28F1C1CD598002BE6B3 /* Debug.xcconfig */, 105 | 143BF2901C1CD598002BE6B3 /* Release.xcconfig */, 106 | 143BF2921C1CD598002BE6B3 /* UICKeyChainStore.xcconfig */, 107 | 14796A791C1CDB8A00169D09 /* libUICKeyChainStore.xcconfig */, 108 | 143BF2911C1CD598002BE6B3 /* Tests.xcconfig */, 109 | 14F2A00B1D8F31A3000B135F /* TestHost.xcconfig */, 110 | ); 111 | name = Configurations; 112 | sourceTree = ""; 113 | }; 114 | 148993D01D8F2515000132F7 /* TestHost */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 148993D21D8F2515000132F7 /* main.m */, 118 | 148993E21D8F2515000132F7 /* Info.plist */, 119 | 1478088D1D8F285E007FA638 /* TestHost.entitlements */, 120 | ); 121 | path = TestHost; 122 | sourceTree = ""; 123 | }; 124 | 14A59C931A62CF6E006561CC = { 125 | isa = PBXGroup; 126 | children = ( 127 | 14A59C9F1A62CF6E006561CC /* UICKeyChainStore */, 128 | 14A59CAC1A62CF6E006561CC /* UICKeyChainStoreTests */, 129 | 143BF28D1C1CD57C002BE6B3 /* Configurations */, 130 | 148993D01D8F2515000132F7 /* TestHost */, 131 | 14A59C9E1A62CF6E006561CC /* Products */, 132 | ); 133 | sourceTree = ""; 134 | }; 135 | 14A59C9E1A62CF6E006561CC /* Products */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | 14796A501C1CD9A500169D09 /* UICKeyChainStore.framework */, 139 | 14796A5F1C1CD9B500169D09 /* UICKeyChainStoreTests.xctest */, 140 | 14796A691C1CD9C900169D09 /* libUICKeyChainStore.a */, 141 | 148993CF1D8F2515000132F7 /* TestHost.app */, 142 | ); 143 | name = Products; 144 | sourceTree = ""; 145 | }; 146 | 14A59C9F1A62CF6E006561CC /* UICKeyChainStore */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 14A59CA21A62CF6E006561CC /* UICKeyChainStore.h */, 150 | 14A59CD71A62D4C3006561CC /* UICKeyChainStore.m */, 151 | 14A59CA01A62CF6E006561CC /* Supporting Files */, 152 | ); 153 | path = UICKeyChainStore; 154 | sourceTree = ""; 155 | }; 156 | 14A59CA01A62CF6E006561CC /* Supporting Files */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 14A59CA11A62CF6E006561CC /* Info.plist */, 160 | ); 161 | name = "Supporting Files"; 162 | sourceTree = ""; 163 | }; 164 | 14A59CAC1A62CF6E006561CC /* UICKeyChainStoreTests */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | 3ACDC27C1A931BCE00C7A63A /* v1.1.1-Lib */, 168 | 14A59CAF1A62CF6E006561CC /* UICKeyChainStoreTests.m */, 169 | 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */, 170 | 14A59CAD1A62CF6E006561CC /* Supporting Files */, 171 | ); 172 | path = UICKeyChainStoreTests; 173 | sourceTree = ""; 174 | }; 175 | 14A59CAD1A62CF6E006561CC /* Supporting Files */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | 14A59CAE1A62CF6E006561CC /* Info.plist */, 179 | ); 180 | name = "Supporting Files"; 181 | sourceTree = ""; 182 | }; 183 | 3ACDC27C1A931BCE00C7A63A /* v1.1.1-Lib */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | 3ACDC27D1A931BCE00C7A63A /* UICv1KeyChainStore.h */, 187 | 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */, 188 | ); 189 | path = "v1.1.1-Lib"; 190 | sourceTree = ""; 191 | }; 192 | /* End PBXGroup section */ 193 | 194 | /* Begin PBXHeadersBuildPhase section */ 195 | 14796A4A1C1CD9A500169D09 /* Headers */ = { 196 | isa = PBXHeadersBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | 14796A4B1C1CD9A500169D09 /* UICKeyChainStore.h in Headers */, 200 | ); 201 | runOnlyForDeploymentPostprocessing = 0; 202 | }; 203 | /* End PBXHeadersBuildPhase section */ 204 | 205 | /* Begin PBXNativeTarget section */ 206 | 14796A461C1CD9A500169D09 /* UICKeyChainStore */ = { 207 | isa = PBXNativeTarget; 208 | buildConfigurationList = 14796A4D1C1CD9A500169D09 /* Build configuration list for PBXNativeTarget "UICKeyChainStore" */; 209 | buildPhases = ( 210 | 14796A471C1CD9A500169D09 /* Sources */, 211 | 14796A491C1CD9A500169D09 /* Frameworks */, 212 | 14796A4A1C1CD9A500169D09 /* Headers */, 213 | 14796A4C1C1CD9A500169D09 /* Resources */, 214 | ); 215 | buildRules = ( 216 | ); 217 | dependencies = ( 218 | ); 219 | name = UICKeyChainStore; 220 | productName = UICKeyChainStore; 221 | productReference = 14796A501C1CD9A500169D09 /* UICKeyChainStore.framework */; 222 | productType = "com.apple.product-type.framework"; 223 | }; 224 | 14796A521C1CD9B500169D09 /* UICKeyChainStoreTests */ = { 225 | isa = PBXNativeTarget; 226 | buildConfigurationList = 14796A5C1C1CD9B500169D09 /* Build configuration list for PBXNativeTarget "UICKeyChainStoreTests" */; 227 | buildPhases = ( 228 | 14796A551C1CD9B500169D09 /* Sources */, 229 | 14796A591C1CD9B500169D09 /* Frameworks */, 230 | 14796A5B1C1CD9B500169D09 /* Resources */, 231 | ); 232 | buildRules = ( 233 | ); 234 | dependencies = ( 235 | 14021B952169FD00006AD6AE /* PBXTargetDependency */, 236 | ); 237 | name = UICKeyChainStoreTests; 238 | productName = UICKeyChainStoreTests; 239 | productReference = 14796A5F1C1CD9B500169D09 /* UICKeyChainStoreTests.xctest */; 240 | productType = "com.apple.product-type.bundle.unit-test"; 241 | }; 242 | 14796A611C1CD9C900169D09 /* libUICKeyChainStore */ = { 243 | isa = PBXNativeTarget; 244 | buildConfigurationList = 14796A661C1CD9C900169D09 /* Build configuration list for PBXNativeTarget "libUICKeyChainStore" */; 245 | buildPhases = ( 246 | 14796A621C1CD9C900169D09 /* Sources */, 247 | 14796A641C1CD9C900169D09 /* Frameworks */, 248 | 14796A651C1CD9C900169D09 /* CopyFiles */, 249 | ); 250 | buildRules = ( 251 | ); 252 | dependencies = ( 253 | ); 254 | name = libUICKeyChainStore; 255 | productName = UICKeyChainStore; 256 | productReference = 14796A691C1CD9C900169D09 /* libUICKeyChainStore.a */; 257 | productType = "com.apple.product-type.library.static"; 258 | }; 259 | 148993CE1D8F2515000132F7 /* TestHost */ = { 260 | isa = PBXNativeTarget; 261 | buildConfigurationList = 148993E31D8F2515000132F7 /* Build configuration list for PBXNativeTarget "TestHost" */; 262 | buildPhases = ( 263 | 148993CB1D8F2515000132F7 /* Sources */, 264 | 148993CC1D8F2515000132F7 /* Frameworks */, 265 | 148993CD1D8F2515000132F7 /* Resources */, 266 | ); 267 | buildRules = ( 268 | ); 269 | dependencies = ( 270 | ); 271 | name = TestHost; 272 | productName = TestHost; 273 | productReference = 148993CF1D8F2515000132F7 /* TestHost.app */; 274 | productType = "com.apple.product-type.application"; 275 | }; 276 | /* End PBXNativeTarget section */ 277 | 278 | /* Begin PBXProject section */ 279 | 14A59C941A62CF6E006561CC /* Project object */ = { 280 | isa = PBXProject; 281 | attributes = { 282 | LastUpgradeCheck = 1200; 283 | ORGANIZATIONNAME = "kishikawa katsumi"; 284 | TargetAttributes = { 285 | 14796A461C1CD9A500169D09 = { 286 | ProvisioningStyle = Automatic; 287 | }; 288 | 14796A521C1CD9B500169D09 = { 289 | DevelopmentTeam = 27AEDK3C9F; 290 | }; 291 | 148993CE1D8F2515000132F7 = { 292 | CreatedOnToolsVersion = 8.0; 293 | DevelopmentTeam = 27AEDK3C9F; 294 | ProvisioningStyle = Manual; 295 | SystemCapabilities = { 296 | com.apple.Keychain = { 297 | enabled = 1; 298 | }; 299 | }; 300 | }; 301 | }; 302 | }; 303 | buildConfigurationList = 14A59C971A62CF6E006561CC /* Build configuration list for PBXProject "UICKeyChainStore" */; 304 | compatibilityVersion = "Xcode 3.2"; 305 | developmentRegion = en; 306 | hasScannedForEncodings = 0; 307 | knownRegions = ( 308 | en, 309 | Base, 310 | ); 311 | mainGroup = 14A59C931A62CF6E006561CC; 312 | productRefGroup = 14A59C9E1A62CF6E006561CC /* Products */; 313 | projectDirPath = ""; 314 | projectRoot = ""; 315 | targets = ( 316 | 14796A461C1CD9A500169D09 /* UICKeyChainStore */, 317 | 14796A611C1CD9C900169D09 /* libUICKeyChainStore */, 318 | 14796A521C1CD9B500169D09 /* UICKeyChainStoreTests */, 319 | 148993CE1D8F2515000132F7 /* TestHost */, 320 | ); 321 | }; 322 | /* End PBXProject section */ 323 | 324 | /* Begin PBXResourcesBuildPhase section */ 325 | 14796A4C1C1CD9A500169D09 /* Resources */ = { 326 | isa = PBXResourcesBuildPhase; 327 | buildActionMask = 2147483647; 328 | files = ( 329 | ); 330 | runOnlyForDeploymentPostprocessing = 0; 331 | }; 332 | 14796A5B1C1CD9B500169D09 /* Resources */ = { 333 | isa = PBXResourcesBuildPhase; 334 | buildActionMask = 2147483647; 335 | files = ( 336 | ); 337 | runOnlyForDeploymentPostprocessing = 0; 338 | }; 339 | 148993CD1D8F2515000132F7 /* Resources */ = { 340 | isa = PBXResourcesBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | ); 344 | runOnlyForDeploymentPostprocessing = 0; 345 | }; 346 | /* End PBXResourcesBuildPhase section */ 347 | 348 | /* Begin PBXSourcesBuildPhase section */ 349 | 14796A471C1CD9A500169D09 /* Sources */ = { 350 | isa = PBXSourcesBuildPhase; 351 | buildActionMask = 2147483647; 352 | files = ( 353 | 14796A481C1CD9A500169D09 /* UICKeyChainStore.m in Sources */, 354 | ); 355 | runOnlyForDeploymentPostprocessing = 0; 356 | }; 357 | 14796A551C1CD9B500169D09 /* Sources */ = { 358 | isa = PBXSourcesBuildPhase; 359 | buildActionMask = 2147483647; 360 | files = ( 361 | 14796A561C1CD9B500169D09 /* UICKeyChainStoreTests.m in Sources */, 362 | 14796A571C1CD9B500169D09 /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */, 363 | 14796A581C1CD9B500169D09 /* UICv1KeyChainStore.m in Sources */, 364 | ); 365 | runOnlyForDeploymentPostprocessing = 0; 366 | }; 367 | 14796A621C1CD9C900169D09 /* Sources */ = { 368 | isa = PBXSourcesBuildPhase; 369 | buildActionMask = 2147483647; 370 | files = ( 371 | 14796A631C1CD9C900169D09 /* UICKeyChainStore.m in Sources */, 372 | ); 373 | runOnlyForDeploymentPostprocessing = 0; 374 | }; 375 | 148993CB1D8F2515000132F7 /* Sources */ = { 376 | isa = PBXSourcesBuildPhase; 377 | buildActionMask = 2147483647; 378 | files = ( 379 | 148993D31D8F2515000132F7 /* main.m in Sources */, 380 | ); 381 | runOnlyForDeploymentPostprocessing = 0; 382 | }; 383 | /* End PBXSourcesBuildPhase section */ 384 | 385 | /* Begin PBXTargetDependency section */ 386 | 14021B952169FD00006AD6AE /* PBXTargetDependency */ = { 387 | isa = PBXTargetDependency; 388 | target = 148993CE1D8F2515000132F7 /* TestHost */; 389 | targetProxy = 14021B942169FD00006AD6AE /* PBXContainerItemProxy */; 390 | }; 391 | /* End PBXTargetDependency section */ 392 | 393 | /* Begin XCBuildConfiguration section */ 394 | 14796A4E1C1CD9A500169D09 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | baseConfigurationReference = 143BF2921C1CD598002BE6B3 /* UICKeyChainStore.xcconfig */; 397 | buildSettings = { 398 | }; 399 | name = Debug; 400 | }; 401 | 14796A4F1C1CD9A500169D09 /* Release */ = { 402 | isa = XCBuildConfiguration; 403 | baseConfigurationReference = 143BF2921C1CD598002BE6B3 /* UICKeyChainStore.xcconfig */; 404 | buildSettings = { 405 | }; 406 | name = Release; 407 | }; 408 | 14796A5D1C1CD9B500169D09 /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 143BF2911C1CD598002BE6B3 /* Tests.xcconfig */; 411 | buildSettings = { 412 | }; 413 | name = Debug; 414 | }; 415 | 14796A5E1C1CD9B500169D09 /* Release */ = { 416 | isa = XCBuildConfiguration; 417 | baseConfigurationReference = 143BF2911C1CD598002BE6B3 /* Tests.xcconfig */; 418 | buildSettings = { 419 | }; 420 | name = Release; 421 | }; 422 | 14796A671C1CD9C900169D09 /* Debug */ = { 423 | isa = XCBuildConfiguration; 424 | baseConfigurationReference = 14796A791C1CDB8A00169D09 /* libUICKeyChainStore.xcconfig */; 425 | buildSettings = { 426 | }; 427 | name = Debug; 428 | }; 429 | 14796A681C1CD9C900169D09 /* Release */ = { 430 | isa = XCBuildConfiguration; 431 | baseConfigurationReference = 14796A791C1CDB8A00169D09 /* libUICKeyChainStore.xcconfig */; 432 | buildSettings = { 433 | }; 434 | name = Release; 435 | }; 436 | 148993E41D8F2515000132F7 /* Debug */ = { 437 | isa = XCBuildConfiguration; 438 | baseConfigurationReference = 14F2A00B1D8F31A3000B135F /* TestHost.xcconfig */; 439 | buildSettings = { 440 | }; 441 | name = Debug; 442 | }; 443 | 148993E51D8F2515000132F7 /* Release */ = { 444 | isa = XCBuildConfiguration; 445 | baseConfigurationReference = 14F2A00B1D8F31A3000B135F /* TestHost.xcconfig */; 446 | buildSettings = { 447 | }; 448 | name = Release; 449 | }; 450 | 14A59CB11A62CF6E006561CC /* Debug */ = { 451 | isa = XCBuildConfiguration; 452 | baseConfigurationReference = 143BF28F1C1CD598002BE6B3 /* Debug.xcconfig */; 453 | buildSettings = { 454 | }; 455 | name = Debug; 456 | }; 457 | 14A59CB21A62CF6E006561CC /* Release */ = { 458 | isa = XCBuildConfiguration; 459 | baseConfigurationReference = 143BF2901C1CD598002BE6B3 /* Release.xcconfig */; 460 | buildSettings = { 461 | }; 462 | name = Release; 463 | }; 464 | /* End XCBuildConfiguration section */ 465 | 466 | /* Begin XCConfigurationList section */ 467 | 14796A4D1C1CD9A500169D09 /* Build configuration list for PBXNativeTarget "UICKeyChainStore" */ = { 468 | isa = XCConfigurationList; 469 | buildConfigurations = ( 470 | 14796A4E1C1CD9A500169D09 /* Debug */, 471 | 14796A4F1C1CD9A500169D09 /* Release */, 472 | ); 473 | defaultConfigurationIsVisible = 0; 474 | defaultConfigurationName = Release; 475 | }; 476 | 14796A5C1C1CD9B500169D09 /* Build configuration list for PBXNativeTarget "UICKeyChainStoreTests" */ = { 477 | isa = XCConfigurationList; 478 | buildConfigurations = ( 479 | 14796A5D1C1CD9B500169D09 /* Debug */, 480 | 14796A5E1C1CD9B500169D09 /* Release */, 481 | ); 482 | defaultConfigurationIsVisible = 0; 483 | defaultConfigurationName = Release; 484 | }; 485 | 14796A661C1CD9C900169D09 /* Build configuration list for PBXNativeTarget "libUICKeyChainStore" */ = { 486 | isa = XCConfigurationList; 487 | buildConfigurations = ( 488 | 14796A671C1CD9C900169D09 /* Debug */, 489 | 14796A681C1CD9C900169D09 /* Release */, 490 | ); 491 | defaultConfigurationIsVisible = 0; 492 | defaultConfigurationName = Release; 493 | }; 494 | 148993E31D8F2515000132F7 /* Build configuration list for PBXNativeTarget "TestHost" */ = { 495 | isa = XCConfigurationList; 496 | buildConfigurations = ( 497 | 148993E41D8F2515000132F7 /* Debug */, 498 | 148993E51D8F2515000132F7 /* Release */, 499 | ); 500 | defaultConfigurationIsVisible = 0; 501 | defaultConfigurationName = Release; 502 | }; 503 | 14A59C971A62CF6E006561CC /* Build configuration list for PBXProject "UICKeyChainStore" */ = { 504 | isa = XCConfigurationList; 505 | buildConfigurations = ( 506 | 14A59CB11A62CF6E006561CC /* Debug */, 507 | 14A59CB21A62CF6E006561CC /* Release */, 508 | ); 509 | defaultConfigurationIsVisible = 0; 510 | defaultConfigurationName = Release; 511 | }; 512 | /* End XCConfigurationList section */ 513 | }; 514 | rootObject = 14A59C941A62CF6E006561CC /* Project object */; 515 | } 516 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore.xcodeproj/xcshareddata/xcschemes/TestHost.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore.xcodeproj/xcshareddata/xcschemes/UICKeyChainStore.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 77 | 83 | 84 | 85 | 86 | 92 | 93 | 99 | 100 | 101 | 102 | 104 | 105 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore.xcodeproj/xcshareddata/xcschemes/libUICKeyChainStore.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 51 | 52 | 53 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 76 | 77 | 83 | 84 | 85 | 86 | 92 | 93 | 99 | 100 | 101 | 102 | 104 | 105 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore/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 | 2.2.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStore/UICKeyChainStore.h: -------------------------------------------------------------------------------- 1 | // 2 | // UICKeyChainStore.h 3 | // UICKeyChainStore 4 | // 5 | // Created by Kishikawa Katsumi on 11/11/20. 6 | // Copyright (c) 2011 Kishikawa Katsumi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #if !__has_feature(nullability) 12 | #define NS_ASSUME_NONNULL_BEGIN 13 | #define NS_ASSUME_NONNULL_END 14 | #define nullable 15 | #define nonnull 16 | #define null_unspecified 17 | #define null_resettable 18 | #define __nullable 19 | #define __nonnull 20 | #define __null_unspecified 21 | #endif 22 | 23 | #if __has_extension(objc_generics) 24 | #define UIC_KEY_TYPE 25 | #define UIC_CREDENTIAL_TYPE *> 26 | #else 27 | #define UIC_KEY_TYPE 28 | #define UIC_CREDENTIAL_TYPE 29 | #endif 30 | 31 | NS_ASSUME_NONNULL_BEGIN 32 | 33 | extern NSString * const UICKeyChainStoreErrorDomain; 34 | 35 | typedef NS_ENUM(NSInteger, UICKeyChainStoreErrorCode) { 36 | UICKeyChainStoreErrorInvalidArguments = 1, 37 | }; 38 | 39 | typedef NS_ENUM(NSInteger, UICKeyChainStoreItemClass) { 40 | UICKeyChainStoreItemClassGenericPassword = 1, 41 | UICKeyChainStoreItemClassInternetPassword, 42 | }; 43 | 44 | typedef NS_ENUM(NSInteger, UICKeyChainStoreProtocolType) { 45 | UICKeyChainStoreProtocolTypeFTP = 1, 46 | UICKeyChainStoreProtocolTypeFTPAccount, 47 | UICKeyChainStoreProtocolTypeHTTP, 48 | UICKeyChainStoreProtocolTypeIRC, 49 | UICKeyChainStoreProtocolTypeNNTP, 50 | UICKeyChainStoreProtocolTypePOP3, 51 | UICKeyChainStoreProtocolTypeSMTP, 52 | UICKeyChainStoreProtocolTypeSOCKS, 53 | UICKeyChainStoreProtocolTypeIMAP, 54 | UICKeyChainStoreProtocolTypeLDAP, 55 | UICKeyChainStoreProtocolTypeAppleTalk, 56 | UICKeyChainStoreProtocolTypeAFP, 57 | UICKeyChainStoreProtocolTypeTelnet, 58 | UICKeyChainStoreProtocolTypeSSH, 59 | UICKeyChainStoreProtocolTypeFTPS, 60 | UICKeyChainStoreProtocolTypeHTTPS, 61 | UICKeyChainStoreProtocolTypeHTTPProxy, 62 | UICKeyChainStoreProtocolTypeHTTPSProxy, 63 | UICKeyChainStoreProtocolTypeFTPProxy, 64 | UICKeyChainStoreProtocolTypeSMB, 65 | UICKeyChainStoreProtocolTypeRTSP, 66 | UICKeyChainStoreProtocolTypeRTSPProxy, 67 | UICKeyChainStoreProtocolTypeDAAP, 68 | UICKeyChainStoreProtocolTypeEPPC, 69 | UICKeyChainStoreProtocolTypeNNTPS, 70 | UICKeyChainStoreProtocolTypeLDAPS, 71 | UICKeyChainStoreProtocolTypeTelnetS, 72 | UICKeyChainStoreProtocolTypeIRCS, 73 | UICKeyChainStoreProtocolTypePOP3S, 74 | }; 75 | 76 | typedef NS_ENUM(NSInteger, UICKeyChainStoreAuthenticationType) { 77 | UICKeyChainStoreAuthenticationTypeNTLM = 1, 78 | UICKeyChainStoreAuthenticationTypeMSN, 79 | UICKeyChainStoreAuthenticationTypeDPA, 80 | UICKeyChainStoreAuthenticationTypeRPA, 81 | UICKeyChainStoreAuthenticationTypeHTTPBasic, 82 | UICKeyChainStoreAuthenticationTypeHTTPDigest, 83 | UICKeyChainStoreAuthenticationTypeHTMLForm, 84 | UICKeyChainStoreAuthenticationTypeDefault, 85 | }; 86 | 87 | typedef NS_ENUM(NSInteger, UICKeyChainStoreAccessibility) { 88 | UICKeyChainStoreAccessibilityWhenUnlocked = 1, 89 | UICKeyChainStoreAccessibilityAfterFirstUnlock, 90 | UICKeyChainStoreAccessibilityAlways, 91 | UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly 92 | __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0), 93 | UICKeyChainStoreAccessibilityWhenUnlockedThisDeviceOnly, 94 | UICKeyChainStoreAccessibilityAfterFirstUnlockThisDeviceOnly, 95 | UICKeyChainStoreAccessibilityAlwaysThisDeviceOnly, 96 | } 97 | __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_4_0); 98 | 99 | typedef NS_ENUM(unsigned long, UICKeyChainStoreAuthenticationPolicy) { 100 | UICKeyChainStoreAuthenticationPolicyUserPresence = 1 << 0, 101 | UICKeyChainStoreAuthenticationPolicyTouchIDAny NS_ENUM_AVAILABLE(10_12_1, 9_0) = 1u << 1, 102 | UICKeyChainStoreAuthenticationPolicyTouchIDCurrentSet NS_ENUM_AVAILABLE(10_12_1, 9_0) = 1u << 3, 103 | UICKeyChainStoreAuthenticationPolicyDevicePasscode NS_ENUM_AVAILABLE(10_11, 9_0) = 1u << 4, 104 | UICKeyChainStoreAuthenticationPolicyControlOr NS_ENUM_AVAILABLE(10_12_1, 9_0) = 1u << 14, 105 | UICKeyChainStoreAuthenticationPolicyControlAnd NS_ENUM_AVAILABLE(10_12_1, 9_0) = 1u << 15, 106 | UICKeyChainStoreAuthenticationPolicyPrivateKeyUsage NS_ENUM_AVAILABLE(10_12_1, 9_0) = 1u << 30, 107 | UICKeyChainStoreAuthenticationPolicyApplicationPassword NS_ENUM_AVAILABLE(10_12_1, 9_0) = 1u << 31, 108 | }__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); 109 | 110 | @interface UICKeyChainStore : NSObject 111 | 112 | @property (nonatomic, readonly) UICKeyChainStoreItemClass itemClass; 113 | 114 | @property (nonatomic, readonly, nullable) NSString *service; 115 | @property (nonatomic, readonly, nullable) NSString *accessGroup; 116 | 117 | @property (nonatomic, readonly, nullable) NSURL *server; 118 | @property (nonatomic, readonly) UICKeyChainStoreProtocolType protocolType; 119 | @property (nonatomic, readonly) UICKeyChainStoreAuthenticationType authenticationType; 120 | 121 | @property (nonatomic) UICKeyChainStoreAccessibility accessibility; 122 | @property (nonatomic, readonly) UICKeyChainStoreAuthenticationPolicy authenticationPolicy 123 | __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); 124 | @property (nonatomic) BOOL useAuthenticationUI; 125 | 126 | @property (nonatomic) BOOL synchronizable; 127 | 128 | @property (nonatomic, nullable) NSString *authenticationPrompt 129 | __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0); 130 | 131 | @property (nonatomic, readonly, nullable) NSArray UIC_KEY_TYPE *allKeys; 132 | @property (nonatomic, readonly, nullable) NSArray *allItems; 133 | 134 | + (NSString *)defaultService; 135 | + (void)setDefaultService:(NSString *)defaultService; 136 | 137 | + (UICKeyChainStore *)keyChainStore; 138 | + (UICKeyChainStore *)keyChainStoreWithService:(nullable NSString *)service; 139 | + (UICKeyChainStore *)keyChainStoreWithService:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 140 | 141 | + (UICKeyChainStore *)keyChainStoreWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType; 142 | + (UICKeyChainStore *)keyChainStoreWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType authenticationType:(UICKeyChainStoreAuthenticationType)authenticationType; 143 | 144 | - (instancetype)init; 145 | - (instancetype)initWithService:(nullable NSString *)service; 146 | - (instancetype)initWithService:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 147 | 148 | - (instancetype)initWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType; 149 | - (instancetype)initWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType authenticationType:(UICKeyChainStoreAuthenticationType)authenticationType; 150 | 151 | + (nullable NSString *)stringForKey:(NSString *)key; 152 | + (nullable NSString *)stringForKey:(NSString *)key service:(nullable NSString *)service; 153 | + (nullable NSString *)stringForKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 154 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key; 155 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service; 156 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 157 | 158 | + (nullable NSData *)dataForKey:(NSString *)key; 159 | + (nullable NSData *)dataForKey:(NSString *)key service:(nullable NSString *)service; 160 | + (nullable NSData *)dataForKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 161 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key; 162 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service; 163 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 164 | 165 | - (BOOL)contains:(nullable NSString *)key; 166 | 167 | - (BOOL)setString:(nullable NSString *)string forKey:(nullable NSString *)key; 168 | - (BOOL)setString:(nullable NSString *)string forKey:(nullable NSString *)key label:(nullable NSString *)label comment:(nullable NSString *)comment; 169 | - (nullable NSString *)stringForKey:(NSString *)key; 170 | 171 | - (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key; 172 | - (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key label:(nullable NSString *)label comment:(nullable NSString *)comment; 173 | - (nullable NSData *)dataForKey:(NSString *)key; 174 | 175 | + (BOOL)removeItemForKey:(NSString *)key; 176 | + (BOOL)removeItemForKey:(NSString *)key service:(nullable NSString *)service; 177 | + (BOOL)removeItemForKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 178 | 179 | + (BOOL)removeAllItems; 180 | + (BOOL)removeAllItemsForService:(nullable NSString *)service; 181 | + (BOOL)removeAllItemsForService:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup; 182 | 183 | - (BOOL)removeItemForKey:(NSString *)key; 184 | 185 | - (BOOL)removeAllItems; 186 | 187 | - (nullable NSString *)objectForKeyedSubscript:(NSString *)key; 188 | - (void)setObject:(nullable NSString *)obj forKeyedSubscript:(NSString *)key; 189 | 190 | + (nullable NSArray UIC_KEY_TYPE *)allKeysWithItemClass:(UICKeyChainStoreItemClass)itemClass; 191 | - (nullable NSArray UIC_KEY_TYPE *)allKeys; 192 | 193 | + (nullable NSArray *)allItemsWithItemClass:(UICKeyChainStoreItemClass)itemClass; 194 | - (nullable NSArray *)allItems; 195 | 196 | - (void)setAccessibility:(UICKeyChainStoreAccessibility)accessibility authenticationPolicy:(UICKeyChainStoreAuthenticationPolicy)authenticationPolicy 197 | __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); 198 | 199 | #if TARGET_OS_IOS 200 | - (void)sharedPasswordWithCompletion:(nullable void (^)(NSString * __nullable account, NSString * __nullable password, NSError * __nullable error))completion; 201 | - (void)sharedPasswordForAccount:(NSString *)account completion:(nullable void (^)(NSString * __nullable password, NSError * __nullable error))completion; 202 | 203 | - (void)setSharedPassword:(nullable NSString *)password forAccount:(NSString *)account completion:(nullable void (^)(NSError * __nullable error))completion; 204 | - (void)removeSharedPasswordForAccount:(NSString *)account completion:(nullable void (^)(NSError * __nullable error))completion; 205 | 206 | + (void)requestSharedWebCredentialWithCompletion:(nullable void (^)(NSArray UIC_CREDENTIAL_TYPE *credentials, NSError * __nullable error))completion; 207 | + (void)requestSharedWebCredentialForDomain:(nullable NSString *)domain account:(nullable NSString *)account completion:(nullable void (^)(NSArray UIC_CREDENTIAL_TYPE *credentials, NSError * __nullable error))completion; 208 | 209 | + (NSString *)generatePassword; 210 | #endif 211 | 212 | @end 213 | 214 | @interface UICKeyChainStore (ErrorHandling) 215 | 216 | + (nullable NSString *)stringForKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 217 | + (nullable NSString *)stringForKey:(NSString *)key service:(nullable NSString *)service error:(NSError * __nullable __autoreleasing * __nullable)error; 218 | + (nullable NSString *)stringForKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup error:(NSError * __nullable __autoreleasing * __nullable)error; 219 | 220 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 221 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service error:(NSError * __nullable __autoreleasing * __nullable)error; 222 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup error:(NSError * __nullable __autoreleasing * __nullable)error; 223 | 224 | + (nullable NSData *)dataForKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 225 | + (nullable NSData *)dataForKey:(NSString *)key service:(nullable NSString *)service error:(NSError * __nullable __autoreleasing * __nullable)error; 226 | + (nullable NSData *)dataForKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup error:(NSError * __nullable __autoreleasing * __nullable)error; 227 | 228 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 229 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service error:(NSError * __nullable __autoreleasing * __nullable)error; 230 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup error:(NSError * __nullable __autoreleasing * __nullable)error; 231 | 232 | - (BOOL)setString:(nullable NSString *)string forKey:(NSString * )key error:(NSError * __nullable __autoreleasing * __nullable)error; 233 | - (BOOL)setString:(nullable NSString *)string forKey:(NSString * )key label:(nullable NSString *)label comment:(nullable NSString *)comment error:(NSError * __nullable __autoreleasing * __nullable)error; 234 | 235 | - (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 236 | - (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key label:(nullable NSString *)label comment:(nullable NSString *)comment error:(NSError * __nullable __autoreleasing * __nullable)error; 237 | 238 | - (nullable NSString *)stringForKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 239 | - (nullable NSData *)dataForKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 240 | 241 | + (BOOL)removeItemForKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 242 | + (BOOL)removeItemForKey:(NSString *)key service:(nullable NSString *)service error:(NSError * __nullable __autoreleasing * __nullable)error; 243 | + (BOOL)removeItemForKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup error:(NSError * __nullable __autoreleasing * __nullable)error; 244 | 245 | + (BOOL)removeAllItemsWithError:(NSError * __nullable __autoreleasing * __nullable)error; 246 | + (BOOL)removeAllItemsForService:(nullable NSString *)service error:(NSError * __nullable __autoreleasing * __nullable)error; 247 | + (BOOL)removeAllItemsForService:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup error:(NSError * __nullable __autoreleasing * __nullable)error; 248 | 249 | - (BOOL)removeItemForKey:(NSString *)key error:(NSError * __nullable __autoreleasing * __nullable)error; 250 | - (BOOL)removeAllItemsWithError:(NSError * __nullable __autoreleasing * __nullable)error; 251 | 252 | @end 253 | 254 | @interface UICKeyChainStore (ForwardCompatibility) 255 | 256 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute; 257 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 258 | 259 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service genericAttribute:(nullable id)genericAttribute; 260 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 261 | 262 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup genericAttribute:(nullable id)genericAttribute; 263 | + (BOOL)setString:(nullable NSString *)value forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 264 | 265 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute; 266 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 267 | 268 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service genericAttribute:(nullable id)genericAttribute; 269 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 270 | 271 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup genericAttribute:(nullable id)genericAttribute; 272 | + (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key service:(nullable NSString *)service accessGroup:(nullable NSString *)accessGroup genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 273 | 274 | - (BOOL)setString:(nullable NSString *)string forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute; 275 | - (BOOL)setString:(nullable NSString *)string forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 276 | 277 | - (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute; 278 | - (BOOL)setData:(nullable NSData *)data forKey:(NSString *)key genericAttribute:(nullable id)genericAttribute error:(NSError * __nullable __autoreleasing * __nullable)error; 279 | 280 | @end 281 | 282 | @interface UICKeyChainStore (Deprecation) 283 | 284 | - (void)synchronize __attribute__((deprecated("calling this method is no longer required"))); 285 | - (BOOL)synchronizeWithError:(NSError * __nullable __autoreleasing * __nullable)error __attribute__((deprecated("calling this method is no longer required"))); 286 | 287 | @end 288 | 289 | NS_ASSUME_NONNULL_END 290 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStoreTests/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.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStoreTests/UICKeyChainStoreForwardCompatibilityTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // UICKeyChainStoreForwardCompatibilityTests.m 3 | // UICKeyChainStore 4 | // 5 | // Created by goro-fuji on 2/17/15. 6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "UICKeyChainStore.h" 12 | #import "UICv1KeyChainStore.h" 13 | 14 | @interface UICKeyChainStoreForwardCompatibilityTests : XCTestCase 15 | 16 | @end 17 | 18 | @implementation UICKeyChainStoreForwardCompatibilityTests 19 | 20 | - (void)setUp 21 | { 22 | [super setUp]; 23 | 24 | [UICKeyChainStore setDefaultService:@(__FILE__)]; 25 | [UICv1KeyChainStore setDefaultService:@(__FILE__)]; 26 | 27 | [UICKeyChainStore removeAllItems]; 28 | } 29 | 30 | - (void)tearDown 31 | { 32 | [UICKeyChainStore removeAllItems]; 33 | 34 | [super tearDown]; 35 | } 36 | 37 | - (void)testReadV1DataFromV2 38 | { 39 | [UICv1KeyChainStore setString:@"http://example.com/" forKey:@"url"]; 40 | 41 | XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"url"], @"http://example.com/"); 42 | } 43 | 44 | - (void)testReadV2DataFromV1 45 | { 46 | [UICKeyChainStore setString:@"http://example.com/" forKey:@"url" genericAttribute:@"url"]; 47 | 48 | XCTAssertEqualObjects([UICv1KeyChainStore stringForKey:@"url"], @"http://example.com/"); 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStoreTests/v1.1.1-Lib/UICv1KeyChainStore.h: -------------------------------------------------------------------------------- 1 | // 2 | // a copy of UICKeyChainStore.h v1.1.1 for testing 3 | // 4 | // Created by Kishikawa Katsumi on 11/11/20. 5 | // Copyright (c) 2011 Kishikawa Katsumi. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | extern NSString * const UICv1KeyChainStoreErrorDomain; 11 | 12 | typedef NS_ENUM(NSInteger, UICv1KeyChainStoreErrorCode) { 13 | UICv1KeyChainStoreErrorInvalidArguments = 1, 14 | }; 15 | 16 | @interface UICv1KeyChainStore : NSObject 17 | 18 | @property (nonatomic, readonly) NSString *service; 19 | @property (nonatomic, readonly) NSString *accessGroup; 20 | 21 | + (NSString *)defaultService; 22 | + (void)setDefaultService:(NSString *)defaultService; 23 | 24 | + (UICv1KeyChainStore *)keyChainStore; 25 | + (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service; 26 | + (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service accessGroup:(NSString *)accessGroup; 27 | 28 | - (instancetype)init; 29 | - (instancetype)initWithService:(NSString *)service; 30 | - (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup; 31 | 32 | + (NSString *)stringForKey:(NSString *)key; 33 | + (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error; 34 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service; 35 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error; 36 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup; 37 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error; 38 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key; 39 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError * __autoreleasing *)error; 40 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service; 41 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error; 42 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup; 43 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error; 44 | 45 | + (NSData *)dataForKey:(NSString *)key; 46 | + (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error; 47 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service; 48 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error; 49 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup; 50 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error; 51 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key; 52 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error; 53 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service; 54 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error; 55 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup; 56 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error; 57 | 58 | - (void)setString:(NSString *)string forKey:(NSString *)key; 59 | - (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError * __autoreleasing *)error; 60 | - (NSString *)stringForKey:(NSString *)key; 61 | - (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error; 62 | 63 | - (void)setData:(NSData *)data forKey:(NSString *)key; 64 | - (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error; 65 | - (NSData *)dataForKey:(NSString *)key; 66 | - (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error; 67 | 68 | + (BOOL)removeItemForKey:(NSString *)key; 69 | + (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error; 70 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service; 71 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error; 72 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup; 73 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error; 74 | + (BOOL)removeAllItems; 75 | + (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error; 76 | + (BOOL)removeAllItemsForService:(NSString *)service; 77 | + (BOOL)removeAllItemsForService:(NSString *)service error:(NSError * __autoreleasing *)error; 78 | + (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup; 79 | + (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error; 80 | 81 | - (void)removeItemForKey:(NSString *)key; 82 | - (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error; 83 | - (void)removeAllItems; 84 | - (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error; 85 | 86 | - (void)synchronize; 87 | - (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error; 88 | 89 | // object subscripting 90 | 91 | - (NSString *)objectForKeyedSubscript:(NSString *)key; 92 | - (void)setObject:(NSString *)obj forKeyedSubscript:(NSString *)key; 93 | 94 | @end 95 | -------------------------------------------------------------------------------- /Lib/UICKeyChainStoreTests/v1.1.1-Lib/UICv1KeyChainStore.m: -------------------------------------------------------------------------------- 1 | // 2 | // a copy of UICKeyChainStore.m v1.1.1 for testing 3 | // 4 | // Created by Kishikawa Katsumi on 11/11/20. 5 | // Copyright (c) 2011 Kishikawa Katsumi. All rights reserved. 6 | // 7 | 8 | #import "UICv1KeyChainStore.h" 9 | 10 | NSString * const UICv1KeyChainStoreErrorDomain = @"com.kishikawakatsumi.uickeychainstore"; 11 | static NSString *_defaultService; 12 | 13 | @interface UICv1KeyChainStore () { 14 | NSMutableDictionary *itemsToUpdate; 15 | } 16 | 17 | @end 18 | 19 | @implementation UICv1KeyChainStore 20 | 21 | + (NSString *)defaultService 22 | { 23 | if (!_defaultService) { 24 | _defaultService = [[NSBundle mainBundle] bundleIdentifier]; 25 | } 26 | 27 | return _defaultService; 28 | } 29 | 30 | + (void)setDefaultService:(NSString *)defaultService 31 | { 32 | _defaultService = defaultService; 33 | } 34 | 35 | #pragma mark - 36 | 37 | + (UICv1KeyChainStore *)keyChainStore 38 | { 39 | return [[self alloc] initWithService:[self defaultService]]; 40 | } 41 | 42 | + (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service 43 | { 44 | return [[self alloc] initWithService:service]; 45 | } 46 | 47 | + (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service accessGroup:(NSString *)accessGroup 48 | { 49 | return [[self alloc] initWithService:service accessGroup:accessGroup]; 50 | } 51 | 52 | - (instancetype)init 53 | { 54 | return [self initWithService:[self.class defaultService] accessGroup:nil]; 55 | } 56 | 57 | - (instancetype)initWithService:(NSString *)service 58 | { 59 | return [self initWithService:service accessGroup:nil]; 60 | } 61 | 62 | - (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup 63 | { 64 | self = [super init]; 65 | if (self) { 66 | if (!service) { 67 | service = [self.class defaultService]; 68 | } 69 | _service = [service copy]; 70 | _accessGroup = [accessGroup copy]; 71 | 72 | itemsToUpdate = [[NSMutableDictionary alloc] init]; 73 | } 74 | 75 | return self; 76 | } 77 | 78 | #pragma mark - 79 | 80 | + (NSString *)stringForKey:(NSString *)key 81 | { 82 | return [self stringForKey:key error:nil]; 83 | } 84 | 85 | + (NSString *)stringForKey:(NSString *)key error:(NSError *__autoreleasing *)error 86 | { 87 | return [self stringForKey:key service:nil error:error]; 88 | } 89 | 90 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service 91 | { 92 | return [self stringForKey:key service:service error:nil]; 93 | } 94 | 95 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error 96 | { 97 | return [self stringForKey:key service:service accessGroup:nil error:error]; 98 | } 99 | 100 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup 101 | { 102 | return [self stringForKey:key service:service accessGroup:accessGroup error:nil]; 103 | } 104 | 105 | + (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error 106 | { 107 | NSData *data = [self dataForKey:key service:service accessGroup:accessGroup error:error]; 108 | if (data) { 109 | return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 110 | } 111 | 112 | return nil; 113 | } 114 | 115 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key 116 | { 117 | return [self setString:value forKey:key error:nil]; 118 | } 119 | 120 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error 121 | { 122 | return [self setString:value forKey:key service:nil error:error]; 123 | } 124 | 125 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service 126 | { 127 | return [self setString:value forKey:key service:service error:nil]; 128 | } 129 | 130 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error 131 | { 132 | return [self setString:value forKey:key service:service accessGroup:nil error:error]; 133 | } 134 | 135 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup 136 | { 137 | return [self setString:value forKey:key service:service accessGroup:accessGroup error:nil]; 138 | } 139 | 140 | + (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error 141 | { 142 | NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding]; 143 | return [self setData:data forKey:key service:service accessGroup:accessGroup error:error]; 144 | } 145 | 146 | #pragma mark - 147 | 148 | + (NSData *)dataForKey:(NSString *)key 149 | { 150 | return [self dataForKey:key error:nil]; 151 | } 152 | 153 | + (NSData *)dataForKey:(NSString *)key error:(NSError *__autoreleasing *)error 154 | { 155 | return [self dataForKey:key service:nil error:error]; 156 | } 157 | 158 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service 159 | { 160 | return [self dataForKey:key service:service error:nil]; 161 | } 162 | 163 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error 164 | { 165 | return [self dataForKey:key service:service accessGroup:nil error:error]; 166 | } 167 | 168 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup 169 | { 170 | return [self dataForKey:key service:service accessGroup:accessGroup error:nil]; 171 | } 172 | 173 | + (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error 174 | { 175 | if (!key) { 176 | if (error) { 177 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}]; 178 | } 179 | return nil; 180 | } 181 | if (!service) { 182 | service = [self defaultService]; 183 | } 184 | 185 | NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 186 | [query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 187 | [query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 188 | [query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 189 | [query setObject:service forKey:(__bridge id)kSecAttrService]; 190 | [query setObject:key forKey:(__bridge id)kSecAttrGeneric]; 191 | [query setObject:key forKey:(__bridge id)kSecAttrAccount]; 192 | #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 193 | if (accessGroup) { 194 | [query setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 195 | } 196 | #endif 197 | 198 | CFTypeRef data = nil; 199 | OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &data); 200 | if (status != errSecSuccess) { 201 | if (status != errSecItemNotFound) { 202 | if (error) { 203 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil]; 204 | } 205 | } 206 | return nil; 207 | } 208 | 209 | NSData *ret = [NSData dataWithData:(__bridge NSData *)data]; 210 | if (data) { 211 | CFRelease(data); 212 | } 213 | 214 | return ret; 215 | } 216 | 217 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key 218 | { 219 | return [self setData:data forKey:key error:nil]; 220 | } 221 | 222 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error 223 | { 224 | return [self setData:data forKey:key service:nil error:error]; 225 | } 226 | 227 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service 228 | { 229 | return [self setData:data forKey:key service:service error:nil]; 230 | } 231 | 232 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error 233 | { 234 | return [self setData:data forKey:key service:service accessGroup:nil error:error]; 235 | } 236 | 237 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup 238 | { 239 | return [self setData:data forKey:key service:service accessGroup:accessGroup error:nil]; 240 | } 241 | 242 | + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error 243 | { 244 | if (!key) { 245 | if (error) { 246 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}]; 247 | } 248 | return NO; 249 | } 250 | if (!service) { 251 | service = [self defaultService]; 252 | } 253 | 254 | NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 255 | [query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 256 | [query setObject:service forKey:(__bridge id)kSecAttrService]; 257 | [query setObject:key forKey:(__bridge id)kSecAttrGeneric]; 258 | [query setObject:key forKey:(__bridge id)kSecAttrAccount]; 259 | #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 260 | if (accessGroup) { 261 | [query setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 262 | } 263 | #endif 264 | 265 | OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL); 266 | if (status == errSecSuccess) { 267 | if (data) { 268 | NSMutableDictionary *attributesToUpdate = [[NSMutableDictionary alloc] init]; 269 | [attributesToUpdate setObject:data forKey:(__bridge id)kSecValueData]; 270 | 271 | status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributesToUpdate); 272 | if (status != errSecSuccess) { 273 | if (error) { 274 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil]; 275 | } 276 | return NO; 277 | } 278 | } else { 279 | [self removeItemForKey:key service:service accessGroup:accessGroup]; 280 | } 281 | } else if (status == errSecItemNotFound) { 282 | if (!data) { 283 | return YES; 284 | } 285 | NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init]; 286 | [attributes setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 287 | [attributes setObject:service forKey:(__bridge id)kSecAttrService]; 288 | [attributes setObject:key forKey:(__bridge id)kSecAttrGeneric]; 289 | [attributes setObject:key forKey:(__bridge id)kSecAttrAccount]; 290 | #if TARGET_OS_IPHONE || (defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) 291 | [attributes setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id)kSecAttrAccessible]; 292 | #endif 293 | [attributes setObject:data forKey:(__bridge id)kSecValueData]; 294 | #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 295 | if (accessGroup) { 296 | [attributes setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 297 | } 298 | #endif 299 | 300 | status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL); 301 | if (status != errSecSuccess) { 302 | if (error) { 303 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil]; 304 | } 305 | return NO; 306 | } 307 | } else { 308 | if (error) { 309 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil]; 310 | } 311 | return NO; 312 | } 313 | 314 | return YES; 315 | } 316 | 317 | #pragma mark - 318 | 319 | - (void)setString:(NSString *)string forKey:(NSString *)key 320 | { 321 | [self setData:[string dataUsingEncoding:NSUTF8StringEncoding] forKey:key error:nil]; 322 | } 323 | 324 | - (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError *__autoreleasing *)error 325 | { 326 | [self setData:[string dataUsingEncoding:NSUTF8StringEncoding] forKey:key error:error]; 327 | return error == nil; 328 | } 329 | 330 | - (NSString *)stringForKey:(id)key 331 | { 332 | return [self stringForKey:key error:nil]; 333 | } 334 | 335 | - (NSString *)stringForKey:(id)key error:(NSError *__autoreleasing *)error 336 | { 337 | NSData *data = [self dataForKey:key error:error]; 338 | if (data) { 339 | return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 340 | } 341 | 342 | return nil; 343 | } 344 | 345 | #pragma mark - 346 | 347 | - (void)setData:(NSData *)data forKey:(NSString *)key 348 | { 349 | [self setData:data forKey:key error:nil]; 350 | } 351 | 352 | - (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error 353 | { 354 | if (!key) { 355 | if (error) { 356 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}]; 357 | } 358 | return error == nil; 359 | } 360 | if (!data) { 361 | [self removeItemForKey:key error:error]; 362 | } else { 363 | [itemsToUpdate setObject:data forKey:key]; 364 | } 365 | return error == nil; 366 | } 367 | 368 | - (NSData *)dataForKey:(NSString *)key 369 | { 370 | return [self dataForKey:key error:nil]; 371 | } 372 | 373 | - (NSData *)dataForKey:(NSString *)key error:(NSError *__autoreleasing *)error 374 | { 375 | NSData *data = [itemsToUpdate objectForKey:key]; 376 | if (!data) { 377 | data = [self.class dataForKey:key service:self.service accessGroup:self.accessGroup error:error]; 378 | } 379 | 380 | return data; 381 | } 382 | 383 | #pragma mark - 384 | 385 | + (BOOL)removeItemForKey:(NSString *)key 386 | { 387 | return [self removeItemForKey:key error:nil]; 388 | } 389 | 390 | + (BOOL)removeItemForKey:(NSString *)key error:(NSError *__autoreleasing *)error 391 | { 392 | return [self removeItemForKey:key service:nil error:error]; 393 | } 394 | 395 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service 396 | { 397 | return [self removeItemForKey:key service:service error:nil]; 398 | } 399 | 400 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error 401 | { 402 | return [self removeItemForKey:key service:service accessGroup:nil error:error]; 403 | } 404 | 405 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup 406 | { 407 | return [self removeItemForKey:key service:service accessGroup:accessGroup error:nil]; 408 | } 409 | 410 | + (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error 411 | { 412 | if (!key) { 413 | if (error) { 414 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}]; 415 | } 416 | return NO; 417 | } 418 | if (!service) { 419 | service = [self defaultService]; 420 | } 421 | 422 | NSMutableDictionary *itemToDelete = [[NSMutableDictionary alloc] init]; 423 | [itemToDelete setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 424 | [itemToDelete setObject:service forKey:(__bridge id)kSecAttrService]; 425 | [itemToDelete setObject:key forKey:(__bridge id)kSecAttrGeneric]; 426 | [itemToDelete setObject:key forKey:(__bridge id)kSecAttrAccount]; 427 | #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 428 | if (accessGroup) { 429 | [itemToDelete setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 430 | } 431 | #endif 432 | 433 | CFDictionaryRef cfquery = (CFDictionaryRef)CFBridgingRetain(itemToDelete); 434 | OSStatus status = SecItemDelete(cfquery); 435 | CFRelease(cfquery); 436 | if (status != errSecSuccess && status != errSecItemNotFound) { 437 | if (error) { 438 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil]; 439 | } 440 | return NO; 441 | } 442 | 443 | return YES; 444 | } 445 | 446 | + (NSArray *)itemsForService:(NSString *)service accessGroup:(NSString *)accessGroup 447 | { 448 | if (!service) { 449 | service = [self defaultService]; 450 | } 451 | 452 | NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 453 | [query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 454 | [query setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnAttributes]; 455 | [query setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 456 | [query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit]; 457 | [query setObject:service forKey:(__bridge id)kSecAttrService]; 458 | #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 459 | if (accessGroup) { 460 | [query setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 461 | } 462 | #endif 463 | 464 | CFArrayRef result = nil; 465 | CFDictionaryRef cfquery = (CFDictionaryRef)CFBridgingRetain(query); 466 | OSStatus status = SecItemCopyMatching(cfquery, (CFTypeRef *)&result); 467 | CFRelease(cfquery); 468 | if (status == errSecSuccess || status == errSecItemNotFound) { 469 | return CFBridgingRelease(result); 470 | } else { 471 | return nil; 472 | } 473 | } 474 | 475 | + (BOOL)removeAllItems 476 | { 477 | return [self removeAllItemsWithError:nil]; 478 | } 479 | 480 | + (BOOL)removeAllItemsWithError:(NSError *__autoreleasing *)error 481 | { 482 | return [self removeAllItemsForService:nil error:error]; 483 | } 484 | 485 | + (BOOL)removeAllItemsForService:(NSString *)service 486 | { 487 | return [self removeAllItemsForService:service error:nil]; 488 | } 489 | 490 | + (BOOL)removeAllItemsForService:(NSString *)service error:(NSError *__autoreleasing *)error 491 | { 492 | return [self removeAllItemsForService:service accessGroup:nil error:error]; 493 | } 494 | 495 | + (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup 496 | { 497 | return [self removeAllItemsForService:service accessGroup:accessGroup error:nil]; 498 | } 499 | 500 | + (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error 501 | { 502 | NSArray *items = [UICv1KeyChainStore itemsForService:service accessGroup:accessGroup]; 503 | for (NSDictionary *item in items) { 504 | NSMutableDictionary *itemToDelete = [[NSMutableDictionary alloc] initWithDictionary:item]; 505 | [itemToDelete setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 506 | 507 | OSStatus status = SecItemDelete((__bridge CFDictionaryRef)itemToDelete); 508 | if (status != errSecSuccess) { 509 | if (error) { 510 | *error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil]; 511 | } 512 | return NO; 513 | } 514 | } 515 | 516 | return YES; 517 | } 518 | 519 | #pragma mark - 520 | 521 | - (void)removeItemForKey:(NSString *)key 522 | { 523 | if ([itemsToUpdate objectForKey:key]) { 524 | [itemsToUpdate removeObjectForKey:key]; 525 | } else { 526 | [self.class removeItemForKey:key service:self.service accessGroup:self.accessGroup error:nil]; 527 | } 528 | } 529 | 530 | - (BOOL)removeItemForKey:(NSString *)key error:(NSError *__autoreleasing *)error 531 | { 532 | if ([itemsToUpdate objectForKey:key]) { 533 | [itemsToUpdate removeObjectForKey:key]; 534 | } else { 535 | [self.class removeItemForKey:key service:self.service accessGroup:self.accessGroup error:error]; 536 | } 537 | return error == nil; 538 | } 539 | 540 | - (void)removeAllItems 541 | { 542 | [self removeAllItemsWithError:nil]; 543 | } 544 | 545 | - (BOOL)removeAllItemsWithError:(NSError *__autoreleasing *)error 546 | { 547 | [itemsToUpdate removeAllObjects]; 548 | return [self.class removeAllItemsForService:self.service accessGroup:self.accessGroup error:error]; 549 | } 550 | 551 | #pragma mark - 552 | 553 | - (void)synchronize 554 | { 555 | for (NSString *key in itemsToUpdate) { 556 | [self.class setData:[itemsToUpdate objectForKey:key] forKey:key service:self.service accessGroup:self.accessGroup error:nil]; 557 | } 558 | 559 | [itemsToUpdate removeAllObjects]; 560 | } 561 | 562 | - (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error 563 | { 564 | for (NSString *key in itemsToUpdate) { 565 | [self.class setData:[itemsToUpdate objectForKey:key] forKey:key service:self.service accessGroup:self.accessGroup error:error]; 566 | } 567 | 568 | [itemsToUpdate removeAllObjects]; 569 | return error == nil; 570 | } 571 | 572 | #pragma mark - 573 | 574 | - (NSString *)description 575 | { 576 | NSArray *items = [UICv1KeyChainStore itemsForService:self.service accessGroup:self.accessGroup]; 577 | NSMutableArray *list = [[NSMutableArray alloc] initWithCapacity:items.count]; 578 | for (NSDictionary *attributes in items) { 579 | NSMutableDictionary *attrs = [[NSMutableDictionary alloc] init]; 580 | [attrs setObject:(id)[attributes objectForKey:(__bridge id)kSecAttrService] forKey:@"Service"]; 581 | [attrs setObject:(id)[attributes objectForKey:(__bridge id)kSecAttrAccount] forKey:@"Account"]; 582 | #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 583 | [attrs setObject:(id)[attributes objectForKey:(__bridge id)kSecAttrAccessGroup] forKey:@"AccessGroup"]; 584 | #endif 585 | NSData *data = [attributes objectForKey:(__bridge id)kSecValueData]; 586 | NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 587 | if (string) { 588 | [attrs setObject:string forKey:@"Value"]; 589 | } else { 590 | [attrs setObject:data forKey:@"Value"]; 591 | } 592 | [list addObject:attrs]; 593 | } 594 | 595 | return [list description]; 596 | } 597 | 598 | #pragma mark - Object Subscripting 599 | 600 | - (NSString *)objectForKeyedSubscript:(NSString *)key 601 | { 602 | return [self stringForKey:key]; 603 | } 604 | 605 | - (void)setObject:(NSString *)obj forKeyedSubscript:(NSString *)key 606 | { 607 | [self setString:obj forKey:key]; 608 | } 609 | 610 | @end 611 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "UICKeyChainStore", 7 | platforms: [ 8 | .macOS(.v10_10), .iOS(.v8), .tvOS(.v9), .watchOS(.v2) 9 | ], 10 | products: [ 11 | .library(name: "UICKeyChainStore", targets: ["UICKeyChainStore"]) 12 | ], 13 | targets: [ 14 | .target(name: "UICKeyChainStore", path: "Lib/UICKeyChainStore", publicHeadersPath: ".") 15 | ] 16 | ) 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UICKeyChainStore 2 | [![CI Status](http://img.shields.io/travis/kishikawakatsumi/UICKeyChainStore.svg?style=flat)](https://travis-ci.org/kishikawakatsumi/UICKeyChainStore) 3 | [![Coverage Status](https://img.shields.io/coveralls/kishikawakatsumi/UICKeyChainStore.svg?style=flat)](https://coveralls.io/r/kishikawakatsumi/UICKeyChainStore?branch=master) 4 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 5 | [![Version](https://img.shields.io/cocoapods/v/UICKeyChainStore.svg?style=flat)](http://cocoadocs.org/docsets/UICKeyChainStore) 6 | [![License](https://img.shields.io/cocoapods/l/UICKeyChainStore.svg?style=flat)](http://cocoadocs.org/docsets/UICKeyChainStore) 7 | [![Platform](https://img.shields.io/cocoapods/p/UICKeyChainStore.svg?style=flat)](http://cocoadocs.org/docsets/UICKeyChainStore) 8 | 9 | UICKeyChainStore is a simple wrapper for Keychain that works on iOS and OS X. Makes using Keychain APIs as easy as NSUserDefaults. 10 | 11 | ## Looking for the library written in Swift? 12 | 13 | Try [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess). 14 | [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess) is next generation of UICKeyChainStore. 15 | 16 | ## Transitioning from 1.x to 2.0 17 | 18 | **`synchronize` method is deprecated. Calling this method is no longer required (Just ignored).** 19 | 20 | ## Features 21 | 22 | - Simple interface 23 | - Support access group 24 | - [Support accessibility](#accessibility) 25 | - [Support iCloud sharing](#icloud_sharing) 26 | - **[Support TouchID and Keychain integration (iOS 8+)](#touch_id_integration)** 27 | - **[Support Shared Web Credentials (iOS 8+)](#shared_web_credentials)** 28 | - Works on both iOS & OS X 29 | - Supported watchOS 2 30 | 31 | ## Usage 32 | 33 | ### Basics 34 | 35 | #### Saving Application Password 36 | 37 | ```objective-c 38 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 39 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef"; 40 | ``` 41 | 42 | #### Saving Internet Password 43 | 44 | ```objective-c 45 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 46 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 47 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef"; 48 | ``` 49 | 50 | ### Instantiation 51 | 52 | #### Create Keychain for Application Password 53 | 54 | ```objective-c 55 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 56 | ``` 57 | 58 | ```objective-c 59 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"kishikawakatsumi.git" 60 | accessGroup:@"12ABCD3E4F.shared"]; 61 | ``` 62 | 63 | #### Create Keychain for Internet Password 64 | 65 | ```objective-c 66 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 67 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 68 | ``` 69 | 70 | ```objective-c 71 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 72 | protocolType:UICKeyChainStoreProtocolTypeHTTPS 73 | authenticationType:UICKeyChainStoreAuthenticationTypeHTMLForm]; 74 | ``` 75 | 76 | ### Adding an item 77 | 78 | #### subscripting 79 | 80 | ```objective-c 81 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef" 82 | ``` 83 | 84 | #### set method 85 | 86 | ```objective-c 87 | [keychain setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"]; 88 | ``` 89 | 90 | #### error handling 91 | 92 | ```objective-c 93 | if (![keychain setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"]) { 94 | // error has occurred 95 | } 96 | ``` 97 | 98 | ```objective-c 99 | NSError *error; 100 | [keychain setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi" error:&error]; 101 | if (error) { 102 | NSLog(@"%@", error.localizedDescription); 103 | } 104 | ``` 105 | 106 | ### Obtaining an item 107 | 108 | #### subscripting (automatically converts to string) 109 | 110 | ```objective-c 111 | NSString *token = keychain[@"kishikawakatsumi"] 112 | ``` 113 | 114 | #### get methods 115 | 116 | ##### as String 117 | 118 | ```objective-c 119 | NSString *token = [keychain stringForKey:@"kishikawakatsumi"]; 120 | ``` 121 | 122 | ##### as NSData 123 | 124 | ```objective-c 125 | NSData *data = [keychain dataForKey:@"kishikawakatsumi"]; 126 | ``` 127 | 128 | #### error handling 129 | 130 | **First, get the `failable` (value or error) object** 131 | 132 | ```objective-c 133 | NSError *error; 134 | NSString *token = [keychain stringForKey:@"" error:&error]; 135 | if (error) { 136 | NSLog(@"%@", error.localizedDescription); 137 | } 138 | ``` 139 | 140 | ### Removing an item 141 | 142 | #### subscripting 143 | 144 | ```objective-c 145 | keychain[@"kishikawakatsumi"] = nil 146 | ``` 147 | 148 | #### remove method 149 | 150 | ```objective-c 151 | [keychain removeItemForKey:@"kishikawakatsumi"]; 152 | ``` 153 | 154 | #### error handling 155 | 156 | ```objective-c 157 | if (![keychain removeItemForKey:@"kishikawakatsumi"]) { 158 | // error has occurred 159 | } 160 | ``` 161 | 162 | ```objective-c 163 | NSError *error; 164 | [keychain removeItemForKey:@"kishikawakatsumi" error:&error]; 165 | if (error) { 166 | NSLog(@"%@", error.localizedDescription); 167 | } 168 | ``` 169 | 170 | ### Label and Comment 171 | 172 | ```objective-c 173 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 174 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 175 | [keychain setString:@"01234567-89ab-cdef-0123-456789abcdef" 176 | forKey:@"kishikawakatsumi" 177 | label:@"github.com (kishikawakatsumi)" 178 | comment:@"github access token"]; 179 | ``` 180 | 181 | ### Configuration (Accessibility, Sharing, iCould Sync) 182 | 183 | #### Accessibility 184 | 185 | ##### Default accessibility matches background application (=kSecAttrAccessibleAfterFirstUnlock) 186 | 187 | ```objective-c 188 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 189 | ``` 190 | 191 | ##### For background application 192 | 193 | ###### Creating instance 194 | 195 | ```objective-c 196 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 197 | keychain.accessibility = UICKeyChainStoreAccessibilityAfterFirstUnlock; 198 | 199 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef" 200 | ``` 201 | 202 | ##### For foreground application 203 | 204 | ###### Creating instance 205 | 206 | ```objective-c 207 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 208 | keychain.accessibility = UICKeyChainStoreAccessibilityWhenUnlocked; 209 | 210 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef" 211 | ``` 212 | 213 | #### Sharing Keychain items 214 | 215 | ```objective-c 216 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"kishikawakatsumi.git" 217 | accessGroup:@"12ABCD3E4F.shared"]; 218 | ``` 219 | 220 | #### Synchronizing Keychain items with iCloud 221 | 222 | ###### Creating instance 223 | 224 | ```objective-c 225 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 226 | keychain.synchronizable = YES; 227 | 228 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef" 229 | ``` 230 | 231 | ### Touch ID integration 232 | 233 | **Any Operation that require authentication must be run in the background thread.** 234 | **If you run in the main thread, UI thread will lock for the system to try to display the authentication dialog.** 235 | 236 | #### Adding a Touch ID protected item 237 | 238 | If you want to store the Touch ID protected Keychain item, specify `accessibility` and `authenticationPolicy` attributes. 239 | 240 | ```objective-c 241 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 242 | 243 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 244 | [keychain setAccessibility:UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly 245 | authenticationPolicy:UICKeyChainStoreAuthenticationPolicyUserPresence]; 246 | 247 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef" 248 | }); 249 | ``` 250 | 251 | #### Updating a Touch ID protected item 252 | 253 | The same way as when adding. 254 | 255 | **Do not run in the main thread if there is a possibility that the item you are trying to add already exists, and protected.** 256 | **Because updating protected items requires authentication.** 257 | 258 | Additionally, you want to show custom authentication prompt message when updating, specify an `authenticationPrompt` attribute. 259 | If the item not protected, the `authenticationPrompt` parameter just be ignored. 260 | 261 | ```objective-c 262 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 263 | 264 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 265 | [keychain setAccessibility:UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly 266 | authenticationPolicy:UICKeyChainStoreAuthenticationPolicyUserPresence]; 267 | keychain.authenticationPrompt = @"Authenticate to update your access token"; 268 | 269 | keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef" 270 | }); 271 | ``` 272 | 273 | #### Obtaining a Touch ID protected item 274 | 275 | The same way as when you get a normal item. It will be displayed automatically Touch ID or passcode authentication If the item you try to get is protected. 276 | If you want to show custom authentication prompt message, specify an `authenticationPrompt` attribute. 277 | If the item not protected, the `authenticationPrompt` parameter just be ignored. 278 | 279 | ```objective-c 280 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 281 | 282 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 283 | [keychain setAccessibility:UICKeyChainStoreAccessibilityWhenPasscodeSetThisDeviceOnly 284 | authenticationPolicy:UICKeyChainStoreAuthenticationPolicyUserPresence]; 285 | keychain.authenticationPrompt = @"Authenticate to update your access token"; 286 | 287 | NSString *token = keychain[@"kishikawakatsumi"]; 288 | }); 289 | ``` 290 | 291 | #### Removing a Touch ID protected item 292 | 293 | The same way as when you remove a normal item. 294 | There is no way to show Touch ID or passcode authentication when removing Keychain items. 295 | 296 | ```objective-c 297 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.example.github-token"]; 298 | 299 | keychain[@"kishikawakatsumi"] = nil; 300 | ``` 301 | 302 | ### Shared Web Credentials 303 | 304 | > Shared web credentials is a programming interface that enables native iOS apps to share credentials with their website counterparts. For example, a user may log in to a website in Safari, entering a user name and password, and save those credentials using the iCloud Keychain. Later, the user may run a native app from the same developer, and instead of the app requiring the user to reenter a user name and password, shared web credentials gives it access to the credentials that were entered earlier in Safari. The user can also create new accounts, update passwords, or delete her account from within the app. These changes are then saved and used by Safari. 305 | 306 | 307 | ```objective-c 308 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://kishikawakatsumi.com"] 309 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 310 | NSString *username = @"kishikawakatsumi@mac.com"; 311 | NSString *password = keychain[username]; 312 | if (password) { 313 | // If found password in the Keychain, 314 | // then log into the server 315 | } else { 316 | // If not found password in the Keychain, 317 | // try to read from Shared Web Credentials 318 | [keychain sharedPasswordForAccount:username completion:^(NSString *password, NSError *error) { 319 | if (password) { 320 | // If found password in the Shared Web Credentials, 321 | // then log into the server 322 | // and save the password to the Keychain 323 | 324 | keychain[username] = password 325 | } else { 326 | // If not found password either in the Keychain also Shared Web Credentials, 327 | // prompt for username and password 328 | 329 | // Log into server 330 | 331 | // If the login is successful, 332 | // save the credentials to both the Keychain and the Shared Web Credentials. 333 | 334 | keychain[username] = password 335 | [keychain setSharedPassword:password forAccount:username completion:nil]; 336 | } 337 | }]; 338 | } 339 | ``` 340 | 341 | #### Request all associated domain's credentials 342 | 343 | ```objective-c 344 | [UICKeyChainStore requestSharedWebCredentialWithCompletion:^(NSArray *credentials, NSError *error) { 345 | 346 | }]; 347 | ``` 348 | 349 | #### Generate strong random password 350 | 351 | Generate strong random password that is in the same format used by Safari autofill (xxx-xxx-xxx-xxx). 352 | 353 | ```objective-c 354 | NSString *password = [UICKeyChainStore generatePassword]; 355 | NSLog(@"%@", password); // => Nhu-GKm-s3n-pMx 356 | ``` 357 | 358 | #### How to set up Shared Web Credentials 359 | 360 | > 1. Add a com.apple.developer.associated-domains entitlement to your app. This entitlement must include all the domains with which you want to share credentials. 361 | 362 | > 2. Add an apple-app-site-association file to your website. This file must include application identifiers for all the apps with which the site wants to share credentials, and it must be properly signed. 363 | 364 | > 3. When the app is installed, the system downloads and verifies the site association file for each of its associated domains. If the verification is successful, the app is associated with the domain. 365 | 366 | **More details:** 367 | 368 | 369 | ### Debugging 370 | 371 | #### Display all stored items if print keychain object 372 | 373 | ```objective-c 374 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 375 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 376 | NSLog(@"%@", keychain); 377 | ``` 378 | 379 | ``` 380 | => 381 | ( 382 | { 383 | accessibility = ak; 384 | authenticationType = dflt; 385 | class = InternetPassword; 386 | key = kishikawakatsumi; 387 | protocol = htps; 388 | server = "github.com"; 389 | synchronizable = 0; 390 | value = "01234567-89ab-cdef-0123-456789abcdef"; 391 | } { 392 | accessibility = ck; 393 | authenticationType = dflt; 394 | class = InternetPassword; 395 | key = hirohamada; 396 | protocol = htps; 397 | server = "github.com"; 398 | synchronizable = 1; 399 | value = "11111111-89ab-cdef-1111-456789abcdef"; 400 | } { 401 | accessibility = ak; 402 | authenticationType = dflt; 403 | class = InternetPassword; 404 | key = honeylemon; 405 | protocol = htps; 406 | server = "github.com"; 407 | synchronizable = 0; 408 | value = "22222222-89ab-cdef-2222-456789abcdef"; 409 | }) 410 | ``` 411 | 412 | #### Obtaining all stored keys 413 | 414 | ```objective-c 415 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 416 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 417 | 418 | NSArray *keys = keychain.allKeys; 419 | for (NSString *key in keys) { 420 | NSLog(@"key: %@", key); 421 | } 422 | ``` 423 | 424 | ``` 425 | => 426 | key: kishikawakatsumi 427 | key: hirohamada 428 | key: honeylemon 429 | ``` 430 | 431 | #### Obtaining all stored items 432 | 433 | ```objective-c 434 | UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"] 435 | protocolType:UICKeyChainStoreProtocolTypeHTTPS]; 436 | 437 | NSArray *items = keychain.allItems; 438 | for (NSString *item in items) { 439 | NSLog(@"item: %@", item); 440 | } 441 | ``` 442 | 443 | ``` 444 | => 445 | 446 | item: { 447 | accessibility = ak; 448 | authenticationType = dflt; 449 | class = InternetPassword; 450 | key = kishikawakatsumi; 451 | protocol = htps; 452 | server = "github.com"; 453 | synchronizable = 0; 454 | value = "01234567-89ab-cdef-0123-456789abcdef"; 455 | } 456 | item: { 457 | accessibility = ck; 458 | authenticationType = dflt; 459 | class = InternetPassword; 460 | key = hirohamada; 461 | protocol = htps; 462 | server = "github.com"; 463 | synchronizable = 1; 464 | value = "11111111-89ab-cdef-1111-456789abcdef"; 465 | } 466 | item: { 467 | accessibility = ak; 468 | authenticationType = dflt; 469 | class = InternetPassword; 470 | key = honeylemon; 471 | protocol = htps; 472 | server = "github.com"; 473 | synchronizable = 0; 474 | value = "22222222-89ab-cdef-2222-456789abcdef"; 475 | } 476 | ``` 477 | 478 | ### Convenient class methods 479 | 480 | Add items using default service name (=bundle identifer). 481 | 482 | ```objective-c 483 | [UICKeyChainStore setString:@"01234567-89ab-cdef-0123-456789abcdef" forKey:@"kishikawakatsumi"]; 484 | ``` 485 | 486 | Or specify the service name. 487 | 488 | ```objective-c 489 | [UICKeyChainStore setString:@"01234567-89ab-cdef-0123-456789abcdef" 490 | forKey:@"kishikawakatsumi" 491 | service:@"com.example.github-token"]; 492 | ``` 493 | 494 | --- 495 | Remove items. 496 | 497 | ```objective-c 498 | [UICKeyChainStore removeItemForKey:@"kishikawakatsumi" service:@"com.example.github-token"]; 499 | ``` 500 | 501 | To set nil value also works remove item for the key. 502 | 503 | ```objective-c 504 | [UICKeyChainStore setString:nil forKey:@"kishikawakatsumi" service:@"com.example.github-token"]; 505 | ``` 506 | 507 | ## Requirements 508 | 509 | iOS 4.3 or later 510 | OS X 10.7 or later 511 | 512 | ## Installation 513 | 514 | ### Swift Package Manager 515 | 516 | UICKeyChainStore is now available through [Swift Package Manager](https://github.com/apple/swift-package-manager/). 517 | 518 | #### Xcode 519 | 520 | Select `File > Swift Packages > Add Package Dependency...` 521 | 522 | Type `https://github.com/kishikawakatsumi/UICKeyChainStore` then check the target that appears. 523 | 524 | #### CLI 525 | 526 | Create `Package.swift` file and define the dependency like this 527 | 528 | ```swift 529 | // swift-tools-version:5.0 530 | import PackageDescription 531 | 532 | let package = Package( 533 | name: "MyLibrary", 534 | products: [ 535 | .library(name: "MyLibrary", targets: ["MyLibrary"]), 536 | ], 537 | dependencies: [ 538 | .package(url: "https://github.com/kishikawakatsumi/UICKeyChainStore.git", from: "2.1.2"), 539 | ], 540 | targets: [ 541 | .target(name: "MyLibrary", dependencies: ["UICKeyChainStore"]), 542 | ] 543 | ) 544 | ``` 545 | 546 | Then, type 547 | 548 | ```shell 549 | $ swift build 550 | ``` 551 | 552 | ### CocoaPods 553 | 554 | UICKeyChainStore is available through [CocoaPods](http://cocoapods.org). To install 555 | it, simply add the following line to your Podfile: 556 | 557 | `pod 'UICKeyChainStore'` 558 | 559 | ##### For watchOS 2 560 | 561 | ```ruby 562 | use_frameworks! 563 | 564 | target 'EampleApp' do 565 | pod 'UICKeyChainStore' 566 | end 567 | 568 | target 'EampleApp WatchKit Extension' do 569 | platform :watchos, '2.0' 570 | pod 'UICKeyChainStore' 571 | end 572 | ``` 573 | 574 | ### Carthage 575 | 576 | UICKeyChainStore is available through [Carthage](https://github.com/Carthage/Carthage). To install 577 | it, simply add the following line to your Cartfile: 578 | 579 | `github "kishikawakatsumi/UICKeyChainStore"` 580 | 581 | ### To manually add to your project 582 | 583 | 1. Add `Security.framework` to your target. 584 | 2. Copy files in Lib (`UICKeyChainStore.h` and `UICKeyChainStore.m`) to your project. 585 | 586 | ## Author 587 | 588 | kishikawa katsumi, kishikawakatsumi@mac.com 589 | 590 | ## License 591 | 592 | [Apache]: http://www.apache.org/licenses/LICENSE-2.0 593 | [MIT]: http://www.opensource.org/licenses/mit-license.php 594 | [GPL]: http://www.gnu.org/licenses/gpl.html 595 | [BSD]: http://opensource.org/licenses/bsd-license.php 596 | 597 | UICKeyChainStore is available under the [MIT license][MIT]. See the LICENSE file for more info. 598 | -------------------------------------------------------------------------------- /UICKeyChainStore.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "UICKeyChainStore" 3 | s.version = "2.2.1" 4 | s.summary = "UICKeyChainStore is a simple wrapper for Keychain that works on iOS and OS X. Makes using Keychain APIs as easy as NSUserDefaults." 5 | s.description = <<-DESC 6 | UICKeyChainStore is a simple wrapper for Keychain that works on iOS and OS X. 7 | Makes using Keychain APIs as easy as NSUserDefaults. 8 | 9 | Features 10 | - Simple interface 11 | - Support access group 12 | - [Support accessibility](#accessibility) 13 | - [Support iCloud sharing](#icloud_sharing) 14 | - **[Support TouchID and Keychain integration (iOS 8+)](#touch_id_integration)** 15 | - Works on both iOS & OS X 16 | DESC 17 | s.homepage = "https://github.com/kishikawakatsumi/UICKeyChainStore" 18 | s.license = { :type => "MIT", :file => "LICENSE" } 19 | s.author = { "kishikawa katsumi" => "kishikawakatsumi@mac.com" } 20 | s.source = { :git => "https://github.com/kishikawakatsumi/UICKeyChainStore.git", :tag => "v#{s.version}" } 21 | s.social_media_url = "https://twitter.com/k_katsumi" 22 | 23 | s.ios.deployment_target = "4.3" 24 | s.osx.deployment_target = "10.7" 25 | s.watchos.deployment_target = '2.0' 26 | s.tvos.deployment_target = '9.0' 27 | s.requires_arc = true 28 | 29 | s.source_files = "Lib/UICKeyChainStore/*.{h,m}" 30 | 31 | s.framework = "Security" 32 | end 33 | -------------------------------------------------------------------------------- /UICKeyChainStore.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /UICKeyChainStore.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /UICKeyChainStore.xcworkspace/xcshareddata/UICKeyChainStore.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 4D699DD3-92BE-424F-9444-53BB45ABD997 9 | IDESourceControlProjectName 10 | UICKeyChainStore 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 5928309140879E871CA2C91C35635A4223DBC07C 14 | github.com:kishikawakatsumi/UICKeyChainStore.git 15 | 16 | IDESourceControlProjectPath 17 | UICKeyChainStore.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 5928309140879E871CA2C91C35635A4223DBC07C 21 | .. 22 | 23 | IDESourceControlProjectURL 24 | github.com:kishikawakatsumi/UICKeyChainStore.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 5928309140879E871CA2C91C35635A4223DBC07C 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 5928309140879E871CA2C91C35635A4223DBC07C 36 | IDESourceControlWCCName 37 | UICKeyChainStore 38 | 39 | 40 | 41 | 42 | --------------------------------------------------------------------------------