32 Commits

Author SHA1 Message Date
Zhigang Fang
f9a2fd19e1 Update UICKeyChainStore.m 2015-04-28 12:10:24 +08:00
kishikawa katsumi
930f5c1ec5 Merge pull request #86 from kishikawakatsumi/bundle
Bundle up
2015-04-12 02:11:45 +09:00
kishikawa katsumi
c04aa805fb Bundle up 2015-04-12 02:02:28 +09:00
kishikawa katsumi
fe02ad75a3 Update README.md 2015-04-07 01:02:18 +09:00
kishikawa katsumi
d299f5cc78 Merge pull request #83 from jeffreyjackson/patch-1
Update README.md
2015-04-07 01:01:34 +09:00
Jeffrey Jackson
b9103a69af Update README.md 2015-04-06 11:28:14 -04:00
kishikawa katsumi
e6ad8142a6 Merge pull request #82 from kishikawakatsumi/sample-project
Fix sample project
2015-04-04 00:09:59 +09:00
kishikawa katsumi
c86ff0e182 Fix sample project 2015-04-04 00:03:10 +09:00
kishikawa katsumi
cfee8eba38 Merge pull request #81 from kishikawakatsumi/update-project-settings
Update project settings
2015-04-03 22:33:37 +09:00
kishikawa katsumi
421d5de79f Update project settings 2015-04-03 22:25:28 +09:00
kishikawa katsumi
e3a78b3a9f Merge pull request #78 from hironytic/other-than-swift
Update podspec
2015-03-04 13:29:18 +09:00
Hironori Ichimiya
1e1748e472 Update podspec 2015-03-04 13:05:33 +09:00
kishikawa katsumi
4137d07f3f Bump version to v2.0.4 2015-02-18 03:40:43 +09:00
kishikawa katsumi
d64ef45172 Merge pull request #77 from kishikawakatsumi/organize
Re-organize interface (grouping method)
2015-02-18 03:39:12 +09:00
kishikawa katsumi
164518cfa8 Re-organize interface (grouping method) 2015-02-18 03:10:07 +09:00
kishikawa katsumi
5207f8d9f6 Merge pull request #76 from kishikawakatsumi/gfx-forward-compatibility
Improve forward compatibility
2015-02-18 03:08:15 +09:00
kishikawa katsumi
2a929441f2 Fixed an issue that can not read the data saved with v2.x from v1.x 2015-02-18 02:43:03 +09:00
Fuji, Goro (gfx)
2c0e3e04e9 add failing tests for forward compatibility from v1 2015-02-17 16:16:22 +09:00
kishikawa katsumi
7ebb3ea714 Merge pull request #74 from sirnacnud/error
Made securityError more descriptive for OS X
2015-02-13 04:44:43 +09:00
sir_nacnud
1d2a7953db Fix iOS build
TARGET_OS_MAC will be true for both OS X and iOS, so use TARGET_OS_IPHONE instead.
2015-02-12 12:32:12 -06:00
sir_nacnud
f1d25560b3 Made securityError more descriptive for OS X
Modified securityError to use SecCopyErrorMessageString on OS X for a more descriptive error message.
2015-02-11 20:53:08 -06:00
kishikawa katsumi
34386e5218 Bump version to 2.0.3 2015-02-07 14:17:35 +09:00
kishikawa katsumi
62ca29fbe6 Merge pull request #72 from kishikawakatsumi/cleanup
Clean up
2015-02-07 14:17:08 +09:00
kishikawa katsumi
b8f4101cb5 Clean up 2015-02-07 14:11:57 +09:00
kishikawa katsumi
9cd1a7e16f Merge pull request #70 from minddistrict/ios6-fix
Fix for crash on ios6
2015-02-07 01:48:30 +09:00
Eugen Martynov
eea7e3b15e Fixed MacOs build (Sorry!) 2015-02-06 17:36:18 +01:00
Eugen Martynov
517a997288 Fix for crash on ios6 2015-02-06 17:26:51 +01:00
kishikawa katsumi
6a3b6e8979 Merge pull request #68 from kishikawakatsumi/coverage
Use XCJobs instead cpp-coveralls
2015-02-02 06:32:22 +09:00
kishikawa katsumi
a0a125feef Use XCJobs instead cpp-coveralls 2015-02-02 06:26:50 +09:00
kishikawa katsumi
ff719f53ab Merge pull request #67 from kishikawakatsumi/bundle
Bundle update
2015-02-02 06:25:58 +09:00
kishikawa katsumi
03963135cf Bundle update 2015-02-01 20:36:06 +09:00
kishikawa katsumi
c1ceba7166 Update README.md 2015-01-27 03:45:52 +09:00
23 changed files with 1074 additions and 204 deletions

View File

@@ -1,11 +1,8 @@
language: objective-c
install:
- sudo easy_install cpp-coveralls
- (cd Lib && bundle install --path=vendor/bundle --binstubs=vendor/bin)
script:
- (cd Lib && bundle exec rake test:ios test:osx)
after_success:
- ./Lib/Script/coveralls.sh
- (cd Lib && bundle exec rake test:ios test:osx coverage:coveralls)
branches:
only:
- master

View File

@@ -10,11 +10,9 @@
145BF3FA1A66C24500D01D0D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 145BF3F91A66C24500D01D0D /* main.m */; };
145BF3FD1A66C24500D01D0D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 145BF3FC1A66C24500D01D0D /* AppDelegate.m */; };
145BF4001A66C24500D01D0D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 145BF3FF1A66C24500D01D0D /* ViewController.m */; };
145BF4031A66C24500D01D0D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 145BF4011A66C24500D01D0D /* Main.storyboard */; };
145BF4051A66C24500D01D0D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 145BF4041A66C24500D01D0D /* Images.xcassets */; };
145BF4081A66C24500D01D0D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 145BF4061A66C24500D01D0D /* LaunchScreen.xib */; };
145BF4381A66C34C00D01D0D /* UICKeyChainStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 145BF4291A66C32F00D01D0D /* UICKeyChainStore.framework */; };
145BF43A1A66C46400D01D0D /* UICKeyChainStore.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 145BF4291A66C32F00D01D0D /* UICKeyChainStore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
147FA7E71ACECFE3008EEC3B /* libUICKeyChainStore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 145BF4311A66C32F00D01D0D /* libUICKeyChainStore.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -97,9 +95,7 @@
145BF3FC1A66C24500D01D0D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
145BF3FE1A66C24500D01D0D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
145BF3FF1A66C24500D01D0D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
145BF4021A66C24500D01D0D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
145BF4041A66C24500D01D0D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
145BF4071A66C24500D01D0D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
145BF41D1A66C32F00D01D0D /* UICKeyChainStore.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = UICKeyChainStore.xcodeproj; path = ../../Lib/UICKeyChainStore.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -108,7 +104,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
145BF4381A66C34C00D01D0D /* UICKeyChainStore.framework in Frameworks */,
147FA7E71ACECFE3008EEC3B /* libUICKeyChainStore.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -139,8 +135,6 @@
145BF3FC1A66C24500D01D0D /* AppDelegate.m */,
145BF3FE1A66C24500D01D0D /* ViewController.h */,
145BF3FF1A66C24500D01D0D /* ViewController.m */,
145BF4011A66C24500D01D0D /* Main.storyboard */,
145BF4061A66C24500D01D0D /* LaunchScreen.xib */,
145BF4041A66C24500D01D0D /* Images.xcassets */,
145BF3F71A66C24500D01D0D /* Supporting Files */,
);
@@ -294,8 +288,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
145BF4031A66C24500D01D0D /* Main.storyboard in Resources */,
145BF4081A66C24500D01D0D /* LaunchScreen.xib in Resources */,
145BF4051A66C24500D01D0D /* Images.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -315,25 +307,6 @@
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
145BF4011A66C24500D01D0D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
145BF4021A66C24500D01D0D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
145BF4061A66C24500D01D0D /* LaunchScreen.xib */ = {
isa = PBXVariantGroup;
children = (
145BF4071A66C24500D01D0D /* Base */,
);
name = LaunchScreen.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
145BF4151A66C24500D01D0D /* Debug */ = {
isa = XCBuildConfiguration;
@@ -369,7 +342,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -404,7 +377,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
@@ -415,6 +388,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
INFOPLIST_FILE = "Example-iOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -425,6 +399,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
INFOPLIST_FILE = "Example-iOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0610"
LastUpgradeVersion = "0620"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -72,7 +72,8 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "145BF3F31A66C24500D01D0D"
@@ -90,7 +91,8 @@
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "145BF3F31A66C24500D01D0D"

View File

@@ -7,6 +7,7 @@
//
#import "AppDelegate.h"
#import <UICKeyChainStore/UICKeyChainStore.h>
@interface AppDelegate ()
@@ -15,6 +16,9 @@
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UICKeyChainStore *keychainStore = [UICKeyChainStore keyChainStore];
keychainStore[@"password"] = @"abcd1234";
NSLog(@"%@", keychainStore[@"a"]);
return YES;
}

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6254" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
</document>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="ufC-wZ-h7g">
<objects>
<viewController id="vXZ-lx-hvc" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/>
<viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@@ -0,0 +1,37 @@
{
"images" : [
{
"orientation" : "portrait",
"idiom" : "iphone",
"minimum-system-version" : "7.0",
"subtype" : "retina4",
"scale" : "2x"
},
{
"idiom" : "iphone",
"scale" : "1x",
"orientation" : "portrait"
},
{
"idiom" : "iphone",
"scale" : "2x",
"orientation" : "portrait"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"subtype" : "retina4",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"minimum-system-version" : "7.0",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@@ -22,10 +22,6 @@
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>

View File

@@ -2,8 +2,8 @@ GEM
remote: https://rubygems.org/
specs:
rake (10.4.2)
xcjobs (0.0.4)
xcpretty (0.1.7)
xcjobs (0.1.0)
xcpretty (0.1.8)
PLATFORMS
ruby

View File

@@ -10,7 +10,7 @@ def destinations
'name=iPhone 5s,OS=7.1',
'name=iPhone 5s,OS=8.1',
'name=iPhone 6,OS=8.1',
'name=iPhone 6 Plus,OS=8.1'
'name=iPhone 6 Plus,OS=8.1',
]
end
@@ -54,9 +54,8 @@ XCJobs::Test.new('test:ios') do |t|
destinations.each do |destination|
t.add_destination(destination)
end
t.coverage = true
t.formatter = 'xcpretty -c'
t.add_build_setting('GCC_INSTRUMENT_PROGRAM_FLOW_ARCS', 'YES')
t.add_build_setting('GCC_GENERATE_TEST_COVERAGE_FILES', 'YES')
end
XCJobs::Test.new('test:osx') do |t|
@@ -67,3 +66,8 @@ XCJobs::Test.new('test:osx') do |t|
t.build_dir = 'build'
t.formatter = 'xcpretty -c'
end
XCJobs::Coverage::Coveralls.new() do |t|
t.add_extension('.m')
t.add_exclude('Lib/UICKeyChainStoreTests')
end

View File

@@ -1,19 +0,0 @@
#!/bin/bash -e
if [[ -z "${CI}" ]]; then
exit 0
fi
COVERALLS_SCRIPT_PATH="${SRCROOT}/Script/coveralls.sh"
cat > "${COVERALLS_SCRIPT_PATH}" <<EOF
#!/bin/bash -e
cd "${OBJECT_FILE_DIR_normal}/${CURRENT_ARCH}"
for file in *.gcda; do
gcov "\${file}"
done
coveralls --root "${SRCROOT}/../" --extension ".m" -e "Lib/UICKeyChainStoreTests/" -e "Examples/" -e "Lib/vendor/" --no-gcov
EOF
chmod +x "${COVERALLS_SCRIPT_PATH}"

View File

@@ -21,6 +21,14 @@
14A59D271A62F4DA006561CC /* libUICKeyChainStore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 14A59D1C1A62F4DA006561CC /* libUICKeyChainStore.a */; };
14A59D331A62F510006561CC /* UICKeyChainStoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 14A59CAF1A62CF6E006561CC /* UICKeyChainStoreTests.m */; };
14A59D361A641129006561CC /* UICKeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 14A59CD71A62D4C3006561CC /* UICKeyChainStore.m */; };
3ACDC27F1A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */; };
3ACDC2801A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */; };
3ACDC2811A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */; };
3ACDC2821A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */; };
3ACDC2891A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */; };
3ACDC28A1A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */; };
3ACDC28B1A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */; };
3ACDC28C1A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -80,6 +88,9 @@
14A59D081A62F336006561CC /* libUICKeyChainStore-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "libUICKeyChainStore-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
14A59D1C1A62F4DA006561CC /* libUICKeyChainStore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libUICKeyChainStore.a; sourceTree = BUILT_PRODUCTS_DIR; };
14A59D261A62F4DA006561CC /* libUICKeyChainStore-MacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "libUICKeyChainStore-MacTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
3ACDC27D1A931BCE00C7A63A /* UICv1KeyChainStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UICv1KeyChainStore.h; sourceTree = "<group>"; };
3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICv1KeyChainStore.m; sourceTree = "<group>"; };
3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UICKeyChainStoreForwardCompatibilityTests.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -191,7 +202,9 @@
14A59CAC1A62CF6E006561CC /* UICKeyChainStoreTests */ = {
isa = PBXGroup;
children = (
3ACDC27C1A931BCE00C7A63A /* v1.1.1-Lib */,
14A59CAF1A62CF6E006561CC /* UICKeyChainStoreTests.m */,
3ACDC2881A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m */,
14A59CAD1A62CF6E006561CC /* Supporting Files */,
);
path = UICKeyChainStoreTests;
@@ -205,6 +218,15 @@
name = "Supporting Files";
sourceTree = "<group>";
};
3ACDC27C1A931BCE00C7A63A /* v1.1.1-Lib */ = {
isa = PBXGroup;
children = (
3ACDC27D1A931BCE00C7A63A /* UICv1KeyChainStore.h */,
3ACDC27E1A931BCE00C7A63A /* UICv1KeyChainStore.m */,
);
path = "v1.1.1-Lib";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@@ -313,7 +335,6 @@
14A59CFA1A62F336006561CC /* Sources */,
14A59CFB1A62F336006561CC /* Frameworks */,
14A59CFC1A62F336006561CC /* CopyFiles */,
14A59D171A62F3C5006561CC /* Create Coveralls Script */,
);
buildRules = (
);
@@ -383,7 +404,7 @@
14A59C941A62CF6E006561CC /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0610;
LastUpgradeCheck = 0620;
ORGANIZATIONNAME = "kishikawa katsumi";
TargetAttributes = {
14A59C9C1A62CF6E006561CC = {
@@ -481,23 +502,6 @@
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
14A59D171A62F3C5006561CC /* Create Coveralls Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Create Coveralls Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "Script/create-coveralls-script.sh";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
14A59C981A62CF6E006561CC /* Sources */ = {
isa = PBXSourcesBuildPhase;
@@ -512,6 +516,8 @@
buildActionMask = 2147483647;
files = (
14A59CB01A62CF6E006561CC /* UICKeyChainStoreTests.m in Sources */,
3ACDC2891A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */,
3ACDC27F1A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -528,6 +534,8 @@
buildActionMask = 2147483647;
files = (
14A59CDA1A62D6B0006561CC /* UICKeyChainStoreTests.m in Sources */,
3ACDC28A1A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */,
3ACDC2801A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -544,6 +552,8 @@
buildActionMask = 2147483647;
files = (
14A59D151A62F3BD006561CC /* UICKeyChainStoreTests.m in Sources */,
3ACDC28B1A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */,
3ACDC2811A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -560,6 +570,8 @@
buildActionMask = 2147483647;
files = (
14A59D331A62F510006561CC /* UICKeyChainStoreTests.m in Sources */,
3ACDC28C1A931CE900C7A63A /* UICKeyChainStoreForwardCompatibilityTests.m in Sources */,
3ACDC2821A931BCE00C7A63A /* UICv1KeyChainStore.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -870,6 +882,7 @@
14A59D2E1A62F4DA006561CC /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
EXECUTABLE_PREFIX = lib;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@@ -884,6 +897,7 @@
14A59D2F1A62F4DA006561CC /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
EXECUTABLE_PREFIX = lib;
MACOSX_DEPLOYMENT_TARGET = 10.6;

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0610"
LastUpgradeVersion = "0620"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0610"
LastUpgradeVersion = "0620"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0610"
LastUpgradeVersion = "0620"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0610"
LastUpgradeVersion = "0620"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@@ -119,64 +119,40 @@ __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);
- (instancetype)initWithServer:(NSURL *)server protocolType:(UICKeyChainStoreProtocolType)protocolType authenticationType:(UICKeyChainStoreAuthenticationType)authenticationType;
+ (NSString *)stringForKey:(NSString *)key;
+ (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key;
+ (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
- (BOOL)contains:(NSString *)key;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError * __autoreleasing *)error;
- (NSString *)stringForKey:(NSString *)key;
- (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError * __autoreleasing *)error;
- (NSData *)dataForKey:(NSString *)key;
- (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key;
+ (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItems;
+ (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsForService:(NSString *)service;
+ (BOOL)removeAllItemsForService:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
- (BOOL)removeItemForKey:(NSString *)key;
- (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)removeAllItems;
- (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error;
- (NSString *)objectForKeyedSubscript:(NSString <NSCopying> *)key;
- (void)setObject:(NSString *)obj forKeyedSubscript:(NSString <NSCopying> *)key;
@@ -203,6 +179,78 @@ __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
+ (NSString *)generatePassword;
#endif
@end
@interface UICKeyChainStore (ErrorHandling)
+ (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError * __autoreleasing *)error;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError * __autoreleasing *)error;
- (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsForService:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
- (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error;
@end
@interface UICKeyChainStore (ForwardCompatibility)
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key genericAttribute:(id)genericAttribute;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error;
@end
@interface UICKeyChainStore (Deprecation)
- (void)synchronize __attribute__((deprecated("calling this method is no longer required")));
- (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error __attribute__((deprecated("calling this method is no longer required")));

View File

@@ -167,37 +167,67 @@ static NSString *_defaultService;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key
{
return [self setString:value forKey:key service:nil accessGroup:nil error:nil];
return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:nil error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self setString:value forKey:key service:nil accessGroup:nil error:error];
return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:nil error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key genericAttribute:(id)genericAttribute
{
return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
return [self setString:value forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service
{
return [self setString:value forKey:key service:service accessGroup:nil error:nil];
return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:nil error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self setString:value forKey:key service:service accessGroup:nil error:error];
return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:nil error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute
{
return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
return [self setString:value forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self setString:value forKey:key service:service accessGroup:accessGroup error:nil];
return [self setString:value forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
return [self setString:value forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute
{
return [self setString:value forKey:key service:service accessGroup:accessGroup genericAttribute:genericAttribute error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
if (!value) {
return [self removeItemForKey:key service:service accessGroup:accessGroup error:error];
}
NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
if (data) {
return [self setData:data forKey:key service:service accessGroup:accessGroup error:error];
return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:genericAttribute error:error];
}
NSError *e = [self conversionError:NSLocalizedString(@"failed to convert string to data", nil)];
if (error) {
@@ -254,30 +284,60 @@ static NSString *_defaultService;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key
{
return [self setData:data forKey:key service:nil accessGroup:nil error:nil];
return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:nil error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key service:nil accessGroup:nil error:error];
return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:nil error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute
{
return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
return [self setData:data forKey:key service:nil accessGroup:nil genericAttribute:genericAttribute error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service
{
return [self setData:data forKey:key service:service accessGroup:nil error:nil];
return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:nil error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key service:service accessGroup:nil error:error];
return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:nil error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute
{
return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
return [self setData:data forKey:key service:service accessGroup:nil genericAttribute:genericAttribute error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self setData:data forKey:key service:service accessGroup:accessGroup error:nil];
return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:nil error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute
{
return [self setData:data forKey:key service:service accessGroup:accessGroup genericAttribute:genericAttribute error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
if (!key) {
NSError *e = [self argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
@@ -291,7 +351,7 @@ static NSString *_defaultService;
}
UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
return [keychain setData:data forKey:key error:error];
return [keychain setData:data forKey:key genericAttribute:genericAttribute];
}
#pragma mark -
@@ -334,27 +394,42 @@ static NSString *_defaultService;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key
{
return [self setString:string forKey:key label:nil comment:nil error:nil];
return [self setString:string forKey:key genericAttribute:nil label:nil comment:nil error:nil];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self setString:string forKey:key label:nil comment:nil error:error];
return [self setString:string forKey:key genericAttribute:nil label:nil comment:nil error:error];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute
{
return [self setString:string forKey:key genericAttribute:genericAttribute label:nil comment:nil error:nil];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
return [self setString:string forKey:key genericAttribute:genericAttribute label:nil comment:nil error:error];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment
{
return [self setString:string forKey:key label:label comment:comment error:nil];
return [self setString:string forKey:key genericAttribute:nil label:label comment:comment error:nil];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
{
return [self setString:string forKey:key genericAttribute:nil label:label comment:comment error:error];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key genericAttribute:(id)genericAttribute label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
{
if (!string) {
return [self removeItemForKey:key error:error];
}
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
if (data) {
return [self setData:data forKey:key label:label comment:comment error:error];
return [self setData:data forKey:key genericAttribute:genericAttribute label:label comment:comment error:error];
}
NSError *e = [self.class conversionError:NSLocalizedString(@"failed to convert string to data", nil)];
if (error) {
@@ -408,20 +483,35 @@ static NSString *_defaultService;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key
{
return [self setData:data forKey:key label:nil comment:nil error:nil];
return [self setData:data forKey:key genericAttribute:nil label:nil comment:nil error:nil];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key label:nil comment:nil error:error];
return [self setData:data forKey:key genericAttribute:nil label:nil comment:nil error:error];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute
{
return [self setData:data forKey:key genericAttribute:genericAttribute label:nil comment:nil error:nil];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute error:(NSError * __autoreleasing *)error
{
return [self setData:data forKey:key genericAttribute:genericAttribute label:nil comment:nil error:error];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment
{
return [self setData:data forKey:key label:label comment:comment error:nil];
return [self setData:data forKey:key genericAttribute:nil label:label comment:comment error:nil];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key genericAttribute:nil label:label comment:comment error:error];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key genericAttribute:(id)genericAttribute label:(NSString *)label comment:(NSString *)comment error:(NSError *__autoreleasing *)error
{
if (!key) {
NSError *e = [self.class argumentError:NSLocalizedString(@"the key must not to be nil", nil)];
@@ -450,6 +540,9 @@ static NSString *_defaultService;
NSError *unexpectedError = nil;
NSMutableDictionary *attributes = [self attributesWithKey:nil value:data error:&unexpectedError];
if (genericAttribute) {
attributes[(__bridge __strong id)kSecAttrGeneric] = genericAttribute;
}
if (label) {
attributes[(__bridge __strong id)kSecAttrLabel] = label;
}
@@ -484,6 +577,9 @@ static NSString *_defaultService;
NSError *unexpectedError = nil;
NSMutableDictionary *attributes = [self attributesWithKey:key value:data error:&unexpectedError];
if (genericAttribute) {
attributes[(__bridge __strong id)kSecAttrGeneric] = genericAttribute;
}
if (label) {
attributes[(__bridge __strong id)kSecAttrLabel] = label;
}
@@ -1004,7 +1100,9 @@ static NSString *_defaultService;
CFTypeRef itemClass = [self itemClassObject];
query[(__bridge __strong id)kSecClass] =(__bridge id)itemClass;
query[(__bridge __strong id)kSecAttrSynchronizable] = (__bridge id)kSecAttrSynchronizableAny;
if (floor(NSFoundationVersionNumber) > floor(993.00)) { // iOS 7+ (NSFoundationVersionNumber_iOS_6_1)
query[(__bridge __strong id)kSecAttrSynchronizable] = (__bridge id)kSecAttrSynchronizableAny;
}
if (itemClass == kSecClassGenericPassword) {
query[(__bridge __strong id)(kSecAttrService)] = _service;
@@ -1032,7 +1130,7 @@ static NSString *_defaultService;
#if TARGET_OS_IPHONE
if (_authenticationPrompt) {
if (floor(NSFoundationVersionNumber) > floor(1047.25)) { // iOS 8+
if (floor(NSFoundationVersionNumber) > floor(1047.25)) { // iOS 8+ (NSFoundationVersionNumber_iOS_7_1)
query[(__bridge __strong id)kSecUseOperationPrompt] = _authenticationPrompt;
} else {
NSLog(@"%@", @"Unavailable 'authenticationPrompt' attribute on iOS versions prior to 8.0.");
@@ -1082,7 +1180,6 @@ static NSString *_defaultService;
}
return nil;
}
attributes[(__bridge __strong id)kSecAttrAccessControl] = (__bridge id)accessControl;
} else {
#if TARGET_OS_IPHONE
NSLog(@"%@", @"Unavailable 'Touch ID integration' on iOS versions prior to 8.0.");
@@ -1251,7 +1348,14 @@ static NSString *_defaultService;
+ (NSError *)securityError:(OSStatus)status
{
NSError *error = [NSError errorWithDomain:UICKeyChainStoreErrorDomain code:status userInfo:@{NSLocalizedDescriptionKey: @"Security error has occurred."}];
NSString *message = @"Security error has occurred.";
#if !TARGET_OS_IPHONE
CFStringRef description = SecCopyErrorMessageString(status, NULL);
if (description) {
message = (__bridge_transfer NSString *)description;
}
#endif
NSError *error = [NSError errorWithDomain:UICKeyChainStoreErrorDomain code:status userInfo:@{NSLocalizedDescriptionKey: message}];
NSLog(@"OSStatus error: [%@] %@", @(error.code), error.localizedDescription);
return error;
}

View File

@@ -0,0 +1,51 @@
//
// UICKeyChainStoreForwardCompatibilityTests.m
// UICKeyChainStore
//
// Created by goro-fuji on 2/17/15.
// Copyright (c) 2015 kishikawa katsumi. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "UICKeyChainStore.h"
#import "UICv1KeyChainStore.h"
@interface UICKeyChainStoreForwardCompatibilityTests : XCTestCase
@end
@implementation UICKeyChainStoreForwardCompatibilityTests
- (void)setUp
{
[super setUp];
[UICKeyChainStore setDefaultService:@(__FILE__)];
[UICv1KeyChainStore setDefaultService:@(__FILE__)];
[UICKeyChainStore removeAllItems];
}
- (void)tearDown
{
[UICKeyChainStore removeAllItems];
[super tearDown];
}
- (void)testReadV1DataFromV2
{
[UICv1KeyChainStore setString:@"http://example.com/" forKey:@"url"];
XCTAssertEqualObjects([UICKeyChainStore stringForKey:@"url"], @"http://example.com/");
}
- (void)testReadV2DataFromV1
{
[UICKeyChainStore setString:@"http://example.com/" forKey:@"url" genericAttribute:@"url"];
XCTAssertEqualObjects([UICv1KeyChainStore stringForKey:@"url"], @"http://example.com/");
}
@end

View File

@@ -0,0 +1,94 @@
//
// a copy of UICKeyChainStore.h v1.1.1 for testing
//
// Created by Kishikawa Katsumi on 11/11/20.
// Copyright (c) 2011 Kishikawa Katsumi. All rights reserved.
//
#import <Foundation/Foundation.h>
extern NSString * const UICv1KeyChainStoreErrorDomain;
typedef NS_ENUM(NSInteger, UICv1KeyChainStoreErrorCode) {
UICv1KeyChainStoreErrorInvalidArguments = 1,
};
@interface UICv1KeyChainStore : NSObject
@property (nonatomic, readonly) NSString *service;
@property (nonatomic, readonly) NSString *accessGroup;
+ (NSString *)defaultService;
+ (void)setDefaultService:(NSString *)defaultService;
+ (UICv1KeyChainStore *)keyChainStore;
+ (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service;
+ (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service accessGroup:(NSString *)accessGroup;
- (instancetype)init;
- (instancetype)initWithService:(NSString *)service;
- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (NSString *)stringForKey:(NSString *)key;
+ (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key;
+ (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
- (void)setString:(NSString *)string forKey:(NSString *)key;
- (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (NSString *)stringForKey:(NSString *)key;
- (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (void)setData:(NSData *)data forKey:(NSString *)key;
- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (NSData *)dataForKey:(NSString *)key;
- (NSData *)dataForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key;
+ (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItems;
+ (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsForService:(NSString *)service;
+ (BOOL)removeAllItemsForService:(NSString *)service error:(NSError * __autoreleasing *)error;
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup;
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError * __autoreleasing *)error;
- (void)removeItemForKey:(NSString *)key;
- (BOOL)removeItemForKey:(NSString *)key error:(NSError * __autoreleasing *)error;
- (void)removeAllItems;
- (BOOL)removeAllItemsWithError:(NSError * __autoreleasing *)error;
- (void)synchronize;
- (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error;
// object subscripting
- (NSString *)objectForKeyedSubscript:(NSString <NSCopying> *)key;
- (void)setObject:(NSString *)obj forKeyedSubscript:(NSString <NSCopying> *)key;
@end

View File

@@ -0,0 +1,606 @@
//
// a copy of UICKeyChainStore.m v1.1.1 for testing
//
// Created by Kishikawa Katsumi on 11/11/20.
// Copyright (c) 2011 Kishikawa Katsumi. All rights reserved.
//
#import "UICv1KeyChainStore.h"
NSString * const UICv1KeyChainStoreErrorDomain = @"com.kishikawakatsumi.uickeychainstore";
static NSString *_defaultService;
@interface UICv1KeyChainStore () {
NSMutableDictionary *itemsToUpdate;
}
@end
@implementation UICv1KeyChainStore
+ (NSString *)defaultService
{
if (!_defaultService) {
_defaultService = [[NSBundle mainBundle] bundleIdentifier];
}
return _defaultService;
}
+ (void)setDefaultService:(NSString *)defaultService
{
_defaultService = defaultService;
}
#pragma mark -
+ (UICv1KeyChainStore *)keyChainStore
{
return [[self alloc] initWithService:[self defaultService]];
}
+ (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service
{
return [[self alloc] initWithService:service];
}
+ (UICv1KeyChainStore *)keyChainStoreWithService:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [[self alloc] initWithService:service accessGroup:accessGroup];
}
- (instancetype)init
{
return [self initWithService:[self.class defaultService] accessGroup:nil];
}
- (instancetype)initWithService:(NSString *)service
{
return [self initWithService:service accessGroup:nil];
}
- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup
{
self = [super init];
if (self) {
if (!service) {
service = [self.class defaultService];
}
_service = [service copy];
_accessGroup = [accessGroup copy];
itemsToUpdate = [[NSMutableDictionary alloc] init];
}
return self;
}
#pragma mark -
+ (NSString *)stringForKey:(NSString *)key
{
return [self stringForKey:key error:nil];
}
+ (NSString *)stringForKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self stringForKey:key service:nil error:error];
}
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service
{
return [self stringForKey:key service:service error:nil];
}
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self stringForKey:key service:service accessGroup:nil error:error];
}
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self stringForKey:key service:service accessGroup:accessGroup error:nil];
}
+ (NSString *)stringForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
NSData *data = [self dataForKey:key service:service accessGroup:accessGroup error:error];
if (data) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
return nil;
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key
{
return [self setString:value forKey:key error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self setString:value forKey:key service:nil error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service
{
return [self setString:value forKey:key service:service error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self setString:value forKey:key service:service accessGroup:nil error:error];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self setString:value forKey:key service:service accessGroup:accessGroup error:nil];
}
+ (BOOL)setString:(NSString *)value forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
return [self setData:data forKey:key service:service accessGroup:accessGroup error:error];
}
#pragma mark -
+ (NSData *)dataForKey:(NSString *)key
{
return [self dataForKey:key error:nil];
}
+ (NSData *)dataForKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self dataForKey:key service:nil error:error];
}
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service
{
return [self dataForKey:key service:service error:nil];
}
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self dataForKey:key service:service accessGroup:nil error:error];
}
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self dataForKey:key service:service accessGroup:accessGroup error:nil];
}
+ (NSData *)dataForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
if (!key) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}];
}
return nil;
}
if (!service) {
service = [self defaultService];
}
NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
[query setObject:service forKey:(__bridge id)kSecAttrService];
[query setObject:key forKey:(__bridge id)kSecAttrGeneric];
[query setObject:key forKey:(__bridge id)kSecAttrAccount];
#if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
if (accessGroup) {
[query setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup];
}
#endif
CFTypeRef data = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &data);
if (status != errSecSuccess) {
if (status != errSecItemNotFound) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil];
}
}
return nil;
}
NSData *ret = [NSData dataWithData:(__bridge NSData *)data];
if (data) {
CFRelease(data);
}
return ret;
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key
{
return [self setData:data forKey:key error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key service:nil error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service
{
return [self setData:data forKey:key service:service error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self setData:data forKey:key service:service accessGroup:nil error:error];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self setData:data forKey:key service:service accessGroup:accessGroup error:nil];
}
+ (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
if (!key) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}];
}
return NO;
}
if (!service) {
service = [self defaultService];
}
NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[query setObject:service forKey:(__bridge id)kSecAttrService];
[query setObject:key forKey:(__bridge id)kSecAttrGeneric];
[query setObject:key forKey:(__bridge id)kSecAttrAccount];
#if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
if (accessGroup) {
[query setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup];
}
#endif
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL);
if (status == errSecSuccess) {
if (data) {
NSMutableDictionary *attributesToUpdate = [[NSMutableDictionary alloc] init];
[attributesToUpdate setObject:data forKey:(__bridge id)kSecValueData];
status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)attributesToUpdate);
if (status != errSecSuccess) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil];
}
return NO;
}
} else {
[self removeItemForKey:key service:service accessGroup:accessGroup];
}
} else if (status == errSecItemNotFound) {
if (!data) {
return YES;
}
NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[attributes setObject:service forKey:(__bridge id)kSecAttrService];
[attributes setObject:key forKey:(__bridge id)kSecAttrGeneric];
[attributes setObject:key forKey:(__bridge id)kSecAttrAccount];
#if TARGET_OS_IPHONE || (defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9)
[attributes setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id)kSecAttrAccessible];
#endif
[attributes setObject:data forKey:(__bridge id)kSecValueData];
#if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
if (accessGroup) {
[attributes setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup];
}
#endif
status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL);
if (status != errSecSuccess) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil];
}
return NO;
}
} else {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil];
}
return NO;
}
return YES;
}
#pragma mark -
- (void)setString:(NSString *)string forKey:(NSString *)key
{
[self setData:[string dataUsingEncoding:NSUTF8StringEncoding] forKey:key error:nil];
}
- (BOOL)setString:(NSString *)string forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
[self setData:[string dataUsingEncoding:NSUTF8StringEncoding] forKey:key error:error];
return error == nil;
}
- (NSString *)stringForKey:(id)key
{
return [self stringForKey:key error:nil];
}
- (NSString *)stringForKey:(id)key error:(NSError *__autoreleasing *)error
{
NSData *data = [self dataForKey:key error:error];
if (data) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
return nil;
}
#pragma mark -
- (void)setData:(NSData *)data forKey:(NSString *)key
{
[self setData:data forKey:key error:nil];
}
- (BOOL)setData:(NSData *)data forKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
if (!key) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}];
}
return error == nil;
}
if (!data) {
[self removeItemForKey:key error:error];
} else {
[itemsToUpdate setObject:data forKey:key];
}
return error == nil;
}
- (NSData *)dataForKey:(NSString *)key
{
return [self dataForKey:key error:nil];
}
- (NSData *)dataForKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
NSData *data = [itemsToUpdate objectForKey:key];
if (!data) {
data = [self.class dataForKey:key service:self.service accessGroup:self.accessGroup error:error];
}
return data;
}
#pragma mark -
+ (BOOL)removeItemForKey:(NSString *)key
{
return [self removeItemForKey:key error:nil];
}
+ (BOOL)removeItemForKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
return [self removeItemForKey:key service:nil error:error];
}
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service
{
return [self removeItemForKey:key service:service error:nil];
}
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self removeItemForKey:key service:service accessGroup:nil error:error];
}
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self removeItemForKey:key service:service accessGroup:accessGroup error:nil];
}
+ (BOOL)removeItemForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
if (!key) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:UICv1KeyChainStoreErrorInvalidArguments userInfo:@{NSLocalizedDescriptionKey: NSLocalizedString(@"`key` must not to be nil", nil)}];
}
return NO;
}
if (!service) {
service = [self defaultService];
}
NSMutableDictionary *itemToDelete = [[NSMutableDictionary alloc] init];
[itemToDelete setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[itemToDelete setObject:service forKey:(__bridge id)kSecAttrService];
[itemToDelete setObject:key forKey:(__bridge id)kSecAttrGeneric];
[itemToDelete setObject:key forKey:(__bridge id)kSecAttrAccount];
#if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
if (accessGroup) {
[itemToDelete setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup];
}
#endif
OSStatus status = SecItemDelete((__bridge CFDictionaryRef)itemToDelete);
if (status != errSecSuccess && status != errSecItemNotFound) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil];
}
return NO;
}
return YES;
}
+ (NSArray *)itemsForService:(NSString *)service accessGroup:(NSString *)accessGroup
{
if (!service) {
service = [self defaultService];
}
NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
[query setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnAttributes];
[query setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
[query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit];
[query setObject:service forKey:(__bridge id)kSecAttrService];
#if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
if (accessGroup) {
[query setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup];
}
#endif
CFArrayRef result = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
if (status == errSecSuccess || status == errSecItemNotFound) {
return CFBridgingRelease(result);
} else {
return nil;
}
}
+ (BOOL)removeAllItems
{
return [self removeAllItemsWithError:nil];
}
+ (BOOL)removeAllItemsWithError:(NSError *__autoreleasing *)error
{
return [self removeAllItemsForService:nil error:error];
}
+ (BOOL)removeAllItemsForService:(NSString *)service
{
return [self removeAllItemsForService:service error:nil];
}
+ (BOOL)removeAllItemsForService:(NSString *)service error:(NSError *__autoreleasing *)error
{
return [self removeAllItemsForService:service accessGroup:nil error:error];
}
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup
{
return [self removeAllItemsForService:service accessGroup:accessGroup error:nil];
}
+ (BOOL)removeAllItemsForService:(NSString *)service accessGroup:(NSString *)accessGroup error:(NSError *__autoreleasing *)error
{
NSArray *items = [UICv1KeyChainStore itemsForService:service accessGroup:accessGroup];
for (NSDictionary *item in items) {
NSMutableDictionary *itemToDelete = [[NSMutableDictionary alloc] initWithDictionary:item];
[itemToDelete setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];
OSStatus status = SecItemDelete((__bridge CFDictionaryRef)itemToDelete);
if (status != errSecSuccess) {
if (error) {
*error = [NSError errorWithDomain:UICv1KeyChainStoreErrorDomain code:status userInfo:nil];
}
return NO;
}
}
return YES;
}
#pragma mark -
- (void)removeItemForKey:(NSString *)key
{
if ([itemsToUpdate objectForKey:key]) {
[itemsToUpdate removeObjectForKey:key];
} else {
[self.class removeItemForKey:key service:self.service accessGroup:self.accessGroup error:nil];
}
}
- (BOOL)removeItemForKey:(NSString *)key error:(NSError *__autoreleasing *)error
{
if ([itemsToUpdate objectForKey:key]) {
[itemsToUpdate removeObjectForKey:key];
} else {
[self.class removeItemForKey:key service:self.service accessGroup:self.accessGroup error:error];
}
return error == nil;
}
- (void)removeAllItems
{
[self removeAllItemsWithError:nil];
}
- (BOOL)removeAllItemsWithError:(NSError *__autoreleasing *)error
{
[itemsToUpdate removeAllObjects];
return [self.class removeAllItemsForService:self.service accessGroup:self.accessGroup error:error];
}
#pragma mark -
- (void)synchronize
{
for (NSString *key in itemsToUpdate) {
[self.class setData:[itemsToUpdate objectForKey:key] forKey:key service:self.service accessGroup:self.accessGroup error:nil];
}
[itemsToUpdate removeAllObjects];
}
- (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error
{
for (NSString *key in itemsToUpdate) {
[self.class setData:[itemsToUpdate objectForKey:key] forKey:key service:self.service accessGroup:self.accessGroup error:error];
}
[itemsToUpdate removeAllObjects];
return error == nil;
}
#pragma mark -
- (NSString *)description
{
NSArray *items = [UICv1KeyChainStore itemsForService:self.service accessGroup:self.accessGroup];
NSMutableArray *list = [[NSMutableArray alloc] initWithCapacity:items.count];
for (NSDictionary *attributes in items) {
NSMutableDictionary *attrs = [[NSMutableDictionary alloc] init];
[attrs setObject:[attributes objectForKey:(__bridge id)kSecAttrService] forKey:@"Service"];
[attrs setObject:[attributes objectForKey:(__bridge id)kSecAttrAccount] forKey:@"Account"];
#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
[attrs setObject:[attributes objectForKey:(__bridge id)kSecAttrAccessGroup] forKey:@"AccessGroup"];
#endif
NSData *data = [attributes objectForKey:(__bridge id)kSecValueData];
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (string) {
[attrs setObject:string forKey:@"Value"];
} else {
[attrs setObject:data forKey:@"Value"];
}
[list addObject:attrs];
}
return [list description];
}
#pragma mark - Object Subscripting
- (NSString *)objectForKeyedSubscript:(NSString <NSCopying> *)key
{
return [self stringForKey:key];
}
- (void)setObject:(NSString *)obj forKeyedSubscript:(NSString <NSCopying> *)key
{
[self setString:obj forKey:key];
}
@end

View File

@@ -17,7 +17,7 @@ Try [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess).
**`synchronize` method is deprecated. Calling this method is no longer required (Just ignored).**
## :bulb: Features
## Features
- Simple interface
- Support access group
@@ -27,9 +27,9 @@ Try [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess).
- **[Support Shared Web Credentials (iOS 8+)](#shared_web_credentials)**
- Works on both iOS & OS X
## :book: Usage
## Usage
### :key: Basics
### Basics
#### Saving Application Password
@@ -46,7 +46,7 @@ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL UR
keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef";
```
### :key: Instantiation
### Instantiation
#### Create Keychain for Application Password
@@ -72,12 +72,12 @@ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL UR
authenticationType:UICKeyChainStoreAuthenticationTypeHTMLForm];
```
### :key: Adding an item
### Adding an item
#### subscripting
```objective-c
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef"
```
#### set method
@@ -102,12 +102,12 @@ if (error) {
}
```
### :key: Obtaining an item
### Obtaining an item
#### subscripting (automatically converts to string)
```objective-c
NSString *token = keychain["kishikawakatsumi"]
NSString *token = keychain[@"kishikawakatsumi"]
```
#### get methods
@@ -136,12 +136,12 @@ if (error) {
}
```
### :key: Removing an item
### Removing an item
#### subscripting
```objective-c
keychain["kishikawakatsumi"] = nil
keychain[@"kishikawakatsumi"] = nil
```
#### remove method
@@ -166,7 +166,7 @@ if (error) {
}
```
### :key: Label and Comment
### Label and Comment
```objective-c
UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL URLWithString:@"https://github.com"]
@@ -177,7 +177,7 @@ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithServer:[NSURL UR
comment:@"github access token"];
```
### :key: Configuration (Accessibility, Sharing, iCould Sync)
### Configuration (Accessibility, Sharing, iCould Sync)
#### <a name="accessibility"> Accessibility
@@ -209,14 +209,14 @@ keychain.accessibility = UICKeyChainStoreAccessibilityWhenUnlocked;
keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef"
```
#### :couple: Sharing Keychain items
#### Sharing Keychain items
```objective-c
UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"kishikawakatsumi.git"
accessGroup:@"12ABCD3E4F.shared"];
```
#### <a name="icloud_sharing"> :arrows_counterclockwise: Synchronizing Keychain items with iCloud
#### <a name="icloud_sharing"> Synchronizing Keychain items with iCloud
###### Creating instance
@@ -227,12 +227,12 @@ keychain.synchronizable = YES;
keychain[@"kishikawakatsumi"] = @"01234567-89ab-cdef-0123-456789abcdef"
```
### <a name="touch_id_integration"> :fu: Touch ID integration
### <a name="touch_id_integration"> Touch ID integration
**Any Operation that require authentication must be run in the background thread.**
**If you run in the main thread, UI thread will lock for the system to try to display the authentication dialog.**
#### :closed_lock_with_key: Adding a Touch ID protected item
#### Adding a Touch ID protected item
If you want to store the Touch ID protected Keychain item, specify `accessibility` and `authenticationPolicy` attributes.
@@ -247,7 +247,7 @@ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
});
```
#### :closed_lock_with_key: Updating a Touch ID protected item
#### Updating a Touch ID protected item
The same way as when adding.
@@ -269,7 +269,7 @@ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
});
```
#### :closed_lock_with_key: Obtaining a Touch ID protected item
#### Obtaining a Touch ID protected item
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.
If you want to show custom authentication prompt message, specify an `authenticationPrompt` attribute.
@@ -287,7 +287,7 @@ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
});
```
#### :closed_lock_with_key: Removing a Touch ID protected item
#### Removing a Touch ID protected item
The same way as when you remove a normal item.
There is no way to show Touch ID or passcode authentication when removing Keychain items.
@@ -298,7 +298,7 @@ UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:@"com.ex
keychain[@"kishikawakatsumi"] = nil;
```
### <a name="shared_web_credentials"> :key: Shared Web Credentials
### <a name="shared_web_credentials"> Shared Web Credentials
> 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.
<https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/>
@@ -365,7 +365,7 @@ NSLog(@"%@", password); // => Nhu-GKm-s3n-pMx
**More details:**
<https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/>
### :key: Debugging
### Debugging
#### Display all stored items if print keychain object

View File

@@ -1,9 +1,9 @@
Pod::Spec.new do |s|
s.name = "UICKeyChainStore"
s.version = "2.0.2"
s.version = "2.0.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."
s.description = <<-DESC
UICKeyChainStore is a simple Swift wrapper for Keychain that works on iOS and OS X.
UICKeyChainStore is a simple wrapper for Keychain that works on iOS and OS X.
Makes using Keychain APIs as easy as NSUserDefaults.
Features