Update keychain dependency

This commit is contained in:
Sergey Abramchuk
2017-03-06 21:24:37 +03:00
parent 57577377e1
commit 8f8f7d22d8
57 changed files with 10791 additions and 0 deletions
@@ -0,0 +1,400 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
14DAEE961A51E1BE0070B77E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEE951A51E1BE0070B77E /* AppDelegate.swift */; };
14DAEE9B1A51E1BE0070B77E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE991A51E1BE0070B77E /* Main.storyboard */; };
14DAEE9D1A51E1BE0070B77E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE9C1A51E1BE0070B77E /* Images.xcassets */; };
14DAEEA01A51E1BE0070B77E /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */; };
14DAEEB71A51E2690070B77E /* AccountsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEEB51A51E2690070B77E /* AccountsViewController.swift */; };
14DAEEB81A51E2690070B77E /* InputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEEB61A51E2690070B77E /* InputViewController.swift */; };
14DAEEC91A51E2D00070B77E /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */; };
14DAEECB1A51E2E10070B77E /* KeychainAccess.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
1470425D1D6FFA97005A4C6E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 14A630151D3293C700809B3F;
remoteInfo = TestHost;
};
14DAEEC01A51E2A60070B77E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 140F195C1A49D79400B0016A;
remoteInfo = "KeychainAccess-iOS";
};
14DAEEC21A51E2A60070B77E /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 140F19671A49D79500B0016A;
remoteInfo = "KeychainAccess-iOSTests";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
14DAEECA1A51E2D70070B77E /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
14DAEECB1A51E2E10070B77E /* KeychainAccess.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
145652E11D898BB9006E8D0E /* Example-iOS.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Example-iOS.entitlements"; sourceTree = "<group>"; };
14DAEE901A51E1BE0070B77E /* Example-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
14DAEE941A51E1BE0070B77E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
14DAEE951A51E1BE0070B77E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
14DAEE9A1A51E1BE0070B77E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
14DAEE9C1A51E1BE0070B77E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
14DAEE9F1A51E1BE0070B77E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
14DAEEB51A51E2690070B77E /* AccountsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsViewController.swift; sourceTree = "<group>"; };
14DAEEB61A51E2690070B77E /* InputViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputViewController.swift; sourceTree = "<group>"; };
14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = KeychainAccess.xcodeproj; path = ../../Lib/KeychainAccess.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
14DAEE8D1A51E1BE0070B77E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
14DAEEC91A51E2D00070B77E /* KeychainAccess.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
14DAEE871A51E1BE0070B77E = {
isa = PBXGroup;
children = (
14DAEE921A51E1BE0070B77E /* Example-iOS */,
14DAEE911A51E1BE0070B77E /* Products */,
14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */,
);
sourceTree = "<group>";
};
14DAEE911A51E1BE0070B77E /* Products */ = {
isa = PBXGroup;
children = (
14DAEE901A51E1BE0070B77E /* Example-iOS.app */,
);
name = Products;
sourceTree = "<group>";
};
14DAEE921A51E1BE0070B77E /* Example-iOS */ = {
isa = PBXGroup;
children = (
14DAEE951A51E1BE0070B77E /* AppDelegate.swift */,
14DAEEB51A51E2690070B77E /* AccountsViewController.swift */,
14DAEEB61A51E2690070B77E /* InputViewController.swift */,
14DAEE991A51E1BE0070B77E /* Main.storyboard */,
14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */,
14DAEE9C1A51E1BE0070B77E /* Images.xcassets */,
14DAEE931A51E1BE0070B77E /* Supporting Files */,
);
path = "Example-iOS";
sourceTree = "<group>";
};
14DAEE931A51E1BE0070B77E /* Supporting Files */ = {
isa = PBXGroup;
children = (
14DAEE941A51E1BE0070B77E /* Info.plist */,
145652E11D898BB9006E8D0E /* Example-iOS.entitlements */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
14DAEEBA1A51E2A60070B77E /* Products */ = {
isa = PBXGroup;
children = (
14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */,
14DAEEC31A51E2A60070B77E /* KeychainAccessTests.xctest */,
1470425E1D6FFA97005A4C6E /* TestHost.app */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
14DAEE8F1A51E1BE0070B77E /* Example-iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 14DAEEAF1A51E1BE0070B77E /* Build configuration list for PBXNativeTarget "Example-iOS" */;
buildPhases = (
14DAEE8C1A51E1BE0070B77E /* Sources */,
14DAEE8D1A51E1BE0070B77E /* Frameworks */,
14DAEE8E1A51E1BE0070B77E /* Resources */,
14DAEECA1A51E2D70070B77E /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = "Example-iOS";
productName = "Example-iOS";
productReference = 14DAEE901A51E1BE0070B77E /* Example-iOS.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
14DAEE881A51E1BE0070B77E /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "kishikawa katsumi";
TargetAttributes = {
14DAEE8F1A51E1BE0070B77E = {
CreatedOnToolsVersion = 6.2;
DevelopmentTeam = 27AEDK3C9F;
};
};
};
buildConfigurationList = 14DAEE8B1A51E1BE0070B77E /* Build configuration list for PBXProject "Example-iOS" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 14DAEE871A51E1BE0070B77E;
productRefGroup = 14DAEE911A51E1BE0070B77E /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 14DAEEBA1A51E2A60070B77E /* Products */;
ProjectRef = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
},
);
projectRoot = "";
targets = (
14DAEE8F1A51E1BE0070B77E /* Example-iOS */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
1470425E1D6FFA97005A4C6E /* TestHost.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = TestHost.app;
remoteRef = 1470425D1D6FFA97005A4C6E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = KeychainAccess.framework;
remoteRef = 14DAEEC01A51E2A60070B77E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
14DAEEC31A51E2A60070B77E /* KeychainAccessTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = KeychainAccessTests.xctest;
remoteRef = 14DAEEC21A51E2A60070B77E /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
14DAEE8E1A51E1BE0070B77E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
14DAEE9B1A51E1BE0070B77E /* Main.storyboard in Resources */,
14DAEEA01A51E1BE0070B77E /* LaunchScreen.xib in Resources */,
14DAEE9D1A51E1BE0070B77E /* Images.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
14DAEE8C1A51E1BE0070B77E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
14DAEEB81A51E2690070B77E /* InputViewController.swift in Sources */,
14DAEEB71A51E2690070B77E /* AccountsViewController.swift in Sources */,
14DAEE961A51E1BE0070B77E /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
14DAEE991A51E1BE0070B77E /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
14DAEE9A1A51E1BE0070B77E /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */ = {
isa = PBXVariantGroup;
children = (
14DAEE9F1A51E1BE0070B77E /* Base */,
);
name = LaunchScreen.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
14DAEEAD1A51E1BE0070B77E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
14DAEEAE1A51E1BE0070B77E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
14DAEEB01A51E1BE0070B77E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = 27AEDK3C9F;
INFOPLIST_FILE = "Example-iOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
14DAEEB11A51E1BE0070B77E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = 27AEDK3C9F;
INFOPLIST_FILE = "Example-iOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
14DAEE8B1A51E1BE0070B77E /* Build configuration list for PBXProject "Example-iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
14DAEEAD1A51E1BE0070B77E /* Debug */,
14DAEEAE1A51E1BE0070B77E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
14DAEEAF1A51E1BE0070B77E /* Build configuration list for PBXNativeTarget "Example-iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
14DAEEB01A51E1BE0070B77E /* Debug */,
14DAEEB11A51E1BE0070B77E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 14DAEE881A51E1BE0070B77E /* Project object */;
}
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "14DAEE8F1A51E1BE0070B77E"
BuildableName = "Example-iOS.app"
BlueprintName = "Example-iOS"
ReferencedContainer = "container:Example-iOS.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "14DAEEA41A51E1BE0070B77E"
BuildableName = "Example-iOSTests.xctest"
BlueprintName = "Example-iOSTests"
ReferencedContainer = "container:Example-iOS.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "14DAEEA41A51E1BE0070B77E"
BuildableName = "Example-iOSTests.xctest"
BlueprintName = "Example-iOSTests"
ReferencedContainer = "container:Example-iOS.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "14DAEE8F1A51E1BE0070B77E"
BuildableName = "Example-iOS.app"
BlueprintName = "Example-iOS"
ReferencedContainer = "container:Example-iOS.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "14DAEE8F1A51E1BE0070B77E"
BuildableName = "Example-iOS.app"
BlueprintName = "Example-iOS"
ReferencedContainer = "container:Example-iOS.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "14DAEE8F1A51E1BE0070B77E"
BuildableName = "Example-iOS.app"
BlueprintName = "Example-iOS"
ReferencedContainer = "container:Example-iOS.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,127 @@
//
// AccountsViewController.swift
// Example
//
// Created by kishikawa katsumi on 2014/12/25.
// Copyright (c) 2014 kishikawa katsumi. All rights reserved.
//
// 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:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// 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.
import UIKit
import KeychainAccess
class AccountsViewController: UITableViewController {
var itemsGroupedByService: [String: [[String: Any]]]?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
reloadData()
tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK:
override func numberOfSections(in tableView: UITableView) -> Int {
if itemsGroupedByService != nil {
let services = Array(itemsGroupedByService!.keys)
return services.count
}
return 0
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let services = Array(itemsGroupedByService!.keys)
let service = services[section]
let items = Keychain(service: service).allItems()
return items.count
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let services = Array(itemsGroupedByService!.keys)
return services[section]
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let services = Array(itemsGroupedByService!.keys)
let service = services[indexPath.section]
let items = Keychain(service: service).allItems()
let item = items[indexPath.row]
cell.textLabel?.text = item["key"] as? String
cell.detailTextLabel?.text = item["value"] as? String
return cell
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let services = Array(itemsGroupedByService!.keys)
let service = services[indexPath.section]
let keychain = Keychain(service: service)
let items = keychain.allItems()
let item = items[indexPath.row]
let key = item["key"] as! String
keychain[key] = nil
if items.count == 1 {
reloadData()
tableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)
} else {
tableView.deleteRows(at: [indexPath], with: .automatic)
}
}
// MARK:
func reloadData() {
let items = Keychain.allItems(.genericPassword)
itemsGroupedByService = groupBy(items) { item -> String in
if let service = item["service"] as? String {
return service
}
return ""
}
}
}
private func groupBy<C: Collection, K: Hashable>(_ xs: C, key: (C.Iterator.Element) -> K) -> [K:[C.Iterator.Element]] {
var gs: [K:[C.Iterator.Element]] = [:]
for x in xs {
let k = key(x)
var ys = gs[k] ?? []
ys.append(x)
gs.updateValue(ys, forKey: k)
}
return gs
}
@@ -0,0 +1,36 @@
//
// AppDelegate.swift
// Example
//
// Created by kishikawa katsumi on 2014/12/25.
// Copyright (c) 2014 kishikawa katsumi. All rights reserved.
//
// 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:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// 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.
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
return true
}
}
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11198.2" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</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" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
</document>
@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11198.2" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="Vxu-PH-fkp">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Keychain Access-->
<scene sceneID="P0Q-z6-lcc">
<objects>
<tableViewController id="Jtp-Af-YIM" customClass="AccountsViewController" customModule="Example_iOS" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="3Yx-it-Kem">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="Cell" textLabel="6jg-UI-oEw" detailTextLabel="1ym-9d-Zvi" style="IBUITableViewCellStyleValue1" id="t8g-pm-LZL">
<rect key="frame" x="0.0" y="119.5" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="t8g-pm-LZL" id="LZV-Cj-dTd">
<frame key="frameInset" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6jg-UI-oEw">
<frame key="frameInset" minX="15" minY="12" width="31.5" height="19.5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="1ym-9d-Zvi">
<frame key="frameInset" minX="318.5" minY="12" width="41.5" height="19.5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="Jtp-Af-YIM" id="4M4-v1-LUg"/>
<outlet property="delegate" destination="Jtp-Af-YIM" id="A0G-ls-f5i"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Keychain Access" id="ETS-AE-f13">
<barButtonItem key="rightBarButtonItem" systemItem="add" id="Vlq-2u-IZC">
<connections>
<segue destination="UPc-C5-mNA" kind="presentation" id="M5v-yk-38B"/>
</connections>
</barButtonItem>
</navigationItem>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="0Wm-gm-SBT" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="231" y="164"/>
</scene>
<!--Input View Controller-->
<scene sceneID="W6S-gz-OFV">
<objects>
<tableViewController id="Ci6-Xb-OHW" customClass="InputViewController" customModule="Example_iOS" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="Nsh-ip-0lp">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection id="kcl-lq-NwO">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="7RU-rl-oP2">
<rect key="frame" x="0.0" y="99" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="7RU-rl-oP2" id="1P6-M9-7lh">
<frame key="frameInset" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Username" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="zyi-Id-S29">
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no"/>
<connections>
<action selector="editingChangedWithSender:" destination="Ci6-Xb-OHW" eventType="editingChanged" id="aKf-aq-f3d"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="zyi-Id-S29" secondAttribute="bottom" constant="8.5" id="8HW-xC-qCD"/>
<constraint firstItem="zyi-Id-S29" firstAttribute="leading" secondItem="1P6-M9-7lh" secondAttribute="leading" constant="15" id="SfW-kJ-QNR"/>
<constraint firstAttribute="trailing" secondItem="zyi-Id-S29" secondAttribute="trailing" constant="8" id="bLO-Bw-sya"/>
<constraint firstItem="zyi-Id-S29" firstAttribute="top" secondItem="1P6-M9-7lh" secondAttribute="top" constant="9" id="kQy-Un-xgj"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="WnJ-H0-TUL">
<rect key="frame" x="0.0" y="143" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WnJ-H0-TUL" id="jtU-kW-you">
<frame key="frameInset" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Password" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="oDn-kk-0de">
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" secureTextEntry="YES"/>
<connections>
<action selector="editingChangedWithSender:" destination="Ci6-Xb-OHW" eventType="editingChanged" id="OxY-ei-oaj"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="oDn-kk-0de" secondAttribute="bottom" constant="8.5" id="H0O-q7-Oev"/>
<constraint firstItem="oDn-kk-0de" firstAttribute="leading" secondItem="jtU-kW-you" secondAttribute="leading" constant="15" id="ZM8-Hw-sHu"/>
<constraint firstItem="oDn-kk-0de" firstAttribute="top" secondItem="jtU-kW-you" secondAttribute="top" constant="9" id="ZPq-1v-AC0"/>
<constraint firstAttribute="trailing" secondItem="oDn-kk-0de" secondAttribute="trailing" constant="8" id="dQ7-qd-nhJ"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection id="Rub-6X-UyU">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="WR8-y3-rgh">
<rect key="frame" x="0.0" y="207" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WR8-y3-rgh" id="607-H8-OGj">
<frame key="frameInset" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Service" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="bQG-QF-hkM">
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no"/>
<connections>
<action selector="editingChangedWithSender:" destination="Ci6-Xb-OHW" eventType="editingChanged" id="enS-1b-yrF"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="bQG-QF-hkM" firstAttribute="top" secondItem="607-H8-OGj" secondAttribute="top" constant="9" id="DQ0-kV-Lps"/>
<constraint firstAttribute="bottom" secondItem="bQG-QF-hkM" secondAttribute="bottom" constant="8.5" id="GaT-9h-fEV"/>
<constraint firstAttribute="trailing" secondItem="bQG-QF-hkM" secondAttribute="trailing" constant="8" id="Hyt-ex-iBJ"/>
<constraint firstItem="bQG-QF-hkM" firstAttribute="leading" secondItem="607-H8-OGj" secondAttribute="leading" constant="15" id="P5p-dR-6Av"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="Ci6-Xb-OHW" id="0NJ-cf-dSM"/>
<outlet property="delegate" destination="Ci6-Xb-OHW" id="qnF-hg-qI2"/>
</connections>
</tableView>
<navigationItem key="navigationItem" id="3Gf-V3-uxm">
<barButtonItem key="leftBarButtonItem" systemItem="cancel" id="wFd-wq-9G5">
<connections>
<action selector="cancelActionWithSender:" destination="Ci6-Xb-OHW" id="2eJ-a8-IRd"/>
</connections>
</barButtonItem>
<barButtonItem key="rightBarButtonItem" enabled="NO" systemItem="save" id="ueY-jZ-6ms">
<connections>
<action selector="saveActionWithSender:" destination="Ci6-Xb-OHW" id="Oty-ij-QPW"/>
</connections>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="cancelButton" destination="wFd-wq-9G5" id="n1X-zW-EDm"/>
<outlet property="passwordField" destination="oDn-kk-0de" id="QgI-b3-qHF"/>
<outlet property="saveButton" destination="ueY-jZ-6ms" id="dzq-xg-N4m"/>
<outlet property="serviceField" destination="bQG-QF-hkM" id="mjQ-AK-Z4Z"/>
<outlet property="usernameField" destination="zyi-Id-S29" id="Ws1-i5-KzY"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="t3l-SW-jHz" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="231" y="897"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="Oh4-Vx-wYM">
<objects>
<navigationController id="UPc-C5-mNA" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="Qkz-Dp-KoE">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="Ci6-Xb-OHW" kind="relationship" relationship="rootViewController" id="JRp-AT-sQa"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="XeL-mf-rFl" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-589" y="897"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="k0A-AE-7fY">
<objects>
<navigationController id="Vxu-PH-fkp" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="NWb-ht-ElO">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="Jtp-Af-YIM" kind="relationship" relationship="rootViewController" id="1GL-67-9eh"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dsG-PT-AyH" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-589" y="164"/>
</scene>
</scenes>
</document>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.kishikawakatsumi.Example-iOS</string>
</array>
</dict>
</plist>
@@ -0,0 +1,48 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<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>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
@@ -0,0 +1,80 @@
//
// InputViewController.swift
// Example
//
// Created by kishikawa katsumi on 2014/12/26.
// Copyright (c) 2014 kishikawa katsumi. All rights reserved.
//
// 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:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// 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.
import UIKit
import KeychainAccess
class InputViewController: UITableViewController {
@IBOutlet weak var saveButton: UIBarButtonItem!
@IBOutlet weak var cancelButton: UIBarButtonItem!
@IBOutlet weak var usernameField: UITextField!
@IBOutlet weak var passwordField: UITextField!
@IBOutlet weak var serviceField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 44.0
tableView.estimatedRowHeight = 44.0
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK:
@IBAction func cancelAction(sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
@IBAction func saveAction(sender: UIBarButtonItem) {
let keychain: Keychain
if let service = serviceField.text, !service.isEmpty {
keychain = Keychain(service: service)
} else {
keychain = Keychain()
}
keychain[usernameField.text!] = passwordField.text
dismiss(animated: true, completion: nil)
}
@IBAction func editingChanged(sender: UITextField) {
switch (usernameField.text, passwordField.text) {
case let (username?, password?):
saveButton.isEnabled = !username.isEmpty && !password.isEmpty
case (_?, nil):
saveButton.isEnabled = false
case (nil, _?):
saveButton.isEnabled = false
case (nil, nil):
saveButton.isEnabled = false
}
}
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='3.0' sdk='iphonesimulator' auto-termination-delay='0'>
<sections>
<code source-file-name='section-1.swift'/>
</sections>
<timeline fileName='timeline.xctimeline'/>
</playground>
@@ -0,0 +1,144 @@
import UIKit
import XCPlayground
import KeychainAccess
var keychain: Keychain
/***************
* Instantiation
***************/
/* for Application Password */
keychain = Keychain(service: "com.example.github-token")
/* for Internet Password */
let url = URL(string: "https://github.com")!
keychain = Keychain(server: url, protocolType: .https)
/**************
* Adding items
**************/
/* subscripting */
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
/* set method */
try? keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
/*****************
* Obtaining items
*****************/
var token: String?
/* subscripting (automatically convert to String) */
token = keychain["kishikawakatsumi"]
/* get method */
// as String
token = try! keychain.get("kishikawakatsumi")
token = try! keychain.getString("kishikawakatsumi")
// as Data
let data = try! keychain.getData("kishikawakatsumi")
/****************
* Removing items
****************/
/* subscripting */
keychain["kishikawakatsumi"] = nil
/* remove method */
try? keychain.remove("kishikawakatsumi")
/****************
* Error handling
****************/
/* set */
do {
try keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
} catch let error {
print("error: \(error.localizedDescription)")
}
/* get */
// First, get the failable (value or error) object
do {
let token = try keychain.get("kishikawakatsumi")
} catch let error {
print("error: \(error.localizedDescription)")
}
/* remove */
do {
try keychain.remove("kishikawakatsumi")
} catch let error {
print("error: \(error.localizedDescription)")
}
/*******************
* Label and Comment
*******************/
keychain = Keychain(server: URL(string: "https://github.com")!, protocolType: .https)
.label("github.com (kishikawakatsumi)")
.comment("github access token")
/***************
* Configuration
***************/
/* for background application */
let background = Keychain(service: "com.example.github-token")
.accessibility(.afterFirstUnlock)
/* for forground application */
let forground = Keychain(service: "com.example.github-token")
.accessibility(.whenUnlocked)
/* Sharing Keychain Items */
let shared = Keychain(service: "com.example.github-token", accessGroup: "12ABCD3E4F.shared")
/* Synchronizing Keychain items with iCloud */
let iCloud = Keychain(service: "com.example.github-token")
.synchronizable(true)
/* One-Shot configuration change */
try? keychain
.accessibility(.afterFirstUnlock)
.synchronizable(true)
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
try? keychain
.accessibility(.whenUnlocked)
.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
/***********
* Debugging
***********/
/* Display all stored items if print keychain object */
keychain = Keychain(server: URL(string: "https://github.com")!, protocolType: .https)
print("\(keychain)")
/* Obtaining all stored keys */
let keys = keychain.allKeys()
for key in keys {
print("key: \(key)")
}
/* Obtaining all stored items */
let items = keychain.allItems()
for item in items {
print("item: \(item)")
}