From 06dc034d550c25fe2b760c64c5e77a821c79c8f4 Mon Sep 17 00:00:00 2001 From: Ivan Zinovyev Date: Wed, 12 Jul 2017 15:51:56 +0300 Subject: [PATCH] Initial commit --- .../TouchInApp.xcodeproj/project.pbxproj | 466 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + TouchInApp/TouchInApp/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 56 +++ .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1160 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1901 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1809 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 2887 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 2622 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 4208 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 4208 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 6711 bytes .../Base.lproj/LaunchScreen.storyboard | 27 + .../TouchInApp/Base.lproj/Main.storyboard | 43 ++ TouchInApp/TouchInApp/Info.plist | 40 ++ TouchInApp/TouchInApp/LineReader.swift | 35 ++ TouchInApp/TouchInApp/TouchInApp.entitlements | 10 + TouchInApp/TouchInApp/ViewController.swift | 37 ++ .../CallDirectoryHandler.swift | 79 +++ TouchInApp/TouchInCallExtension/Info.plist | 31 ++ .../TouchInCallExtension.entitlements | 10 + 21 files changed, 854 insertions(+) create mode 100644 TouchInApp/TouchInApp.xcodeproj/project.pbxproj create mode 100644 TouchInApp/TouchInApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TouchInApp/TouchInApp/AppDelegate.swift create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 TouchInApp/TouchInApp/Base.lproj/LaunchScreen.storyboard create mode 100644 TouchInApp/TouchInApp/Base.lproj/Main.storyboard create mode 100644 TouchInApp/TouchInApp/Info.plist create mode 100644 TouchInApp/TouchInApp/LineReader.swift create mode 100644 TouchInApp/TouchInApp/TouchInApp.entitlements create mode 100644 TouchInApp/TouchInApp/ViewController.swift create mode 100644 TouchInApp/TouchInCallExtension/CallDirectoryHandler.swift create mode 100644 TouchInApp/TouchInCallExtension/Info.plist create mode 100644 TouchInApp/TouchInCallExtension/TouchInCallExtension.entitlements diff --git a/TouchInApp/TouchInApp.xcodeproj/project.pbxproj b/TouchInApp/TouchInApp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f4c08b6 --- /dev/null +++ b/TouchInApp/TouchInApp.xcodeproj/project.pbxproj @@ -0,0 +1,466 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 120377511F16466E00B02B50 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120377501F16466E00B02B50 /* AppDelegate.swift */; }; + 120377531F16466E00B02B50 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120377521F16466E00B02B50 /* ViewController.swift */; }; + 120377561F16466E00B02B50 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 120377541F16466E00B02B50 /* Main.storyboard */; }; + 120377581F16466E00B02B50 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 120377571F16466E00B02B50 /* Assets.xcassets */; }; + 1203775B1F16466E00B02B50 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 120377591F16466E00B02B50 /* LaunchScreen.storyboard */; }; + 120377691F1646FE00B02B50 /* CallDirectoryHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120377681F1646FE00B02B50 /* CallDirectoryHandler.swift */; }; + 1203776D1F1646FE00B02B50 /* TouchInCallExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 120377661F1646FE00B02B50 /* TouchInCallExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 120377731F16475400B02B50 /* LineReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120377721F16475400B02B50 /* LineReader.swift */; }; + 120377761F16481400B02B50 /* LineReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 120377721F16475400B02B50 /* LineReader.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1203776B1F1646FE00B02B50 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 120377451F16466E00B02B50 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 120377651F1646FE00B02B50; + remoteInfo = TouchInCallExtension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 120377711F1646FE00B02B50 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 1203776D1F1646FE00B02B50 /* TouchInCallExtension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1203774D1F16466E00B02B50 /* TouchInApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TouchInApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 120377501F16466E00B02B50 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 120377521F16466E00B02B50 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 120377551F16466E00B02B50 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 120377571F16466E00B02B50 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1203775A1F16466E00B02B50 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 1203775C1F16466E00B02B50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 120377661F1646FE00B02B50 /* TouchInCallExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TouchInCallExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 120377681F1646FE00B02B50 /* CallDirectoryHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallDirectoryHandler.swift; sourceTree = ""; }; + 1203776A1F1646FE00B02B50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 120377721F16475400B02B50 /* LineReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineReader.swift; sourceTree = ""; }; + 120377741F1647B200B02B50 /* TouchInCallExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TouchInCallExtension.entitlements; sourceTree = ""; }; + 120377751F1647F500B02B50 /* TouchInApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TouchInApp.entitlements; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1203774A1F16466E00B02B50 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 120377631F1646FE00B02B50 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 120377441F16466E00B02B50 = { + isa = PBXGroup; + children = ( + 1203774F1F16466E00B02B50 /* TouchInApp */, + 120377671F1646FE00B02B50 /* TouchInCallExtension */, + 1203774E1F16466E00B02B50 /* Products */, + ); + sourceTree = ""; + }; + 1203774E1F16466E00B02B50 /* Products */ = { + isa = PBXGroup; + children = ( + 1203774D1F16466E00B02B50 /* TouchInApp.app */, + 120377661F1646FE00B02B50 /* TouchInCallExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 1203774F1F16466E00B02B50 /* TouchInApp */ = { + isa = PBXGroup; + children = ( + 120377751F1647F500B02B50 /* TouchInApp.entitlements */, + 120377501F16466E00B02B50 /* AppDelegate.swift */, + 120377521F16466E00B02B50 /* ViewController.swift */, + 120377541F16466E00B02B50 /* Main.storyboard */, + 120377571F16466E00B02B50 /* Assets.xcassets */, + 120377591F16466E00B02B50 /* LaunchScreen.storyboard */, + 1203775C1F16466E00B02B50 /* Info.plist */, + 120377721F16475400B02B50 /* LineReader.swift */, + ); + path = TouchInApp; + sourceTree = ""; + }; + 120377671F1646FE00B02B50 /* TouchInCallExtension */ = { + isa = PBXGroup; + children = ( + 120377741F1647B200B02B50 /* TouchInCallExtension.entitlements */, + 120377681F1646FE00B02B50 /* CallDirectoryHandler.swift */, + 1203776A1F1646FE00B02B50 /* Info.plist */, + ); + path = TouchInCallExtension; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1203774C1F16466E00B02B50 /* TouchInApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1203775F1F16466E00B02B50 /* Build configuration list for PBXNativeTarget "TouchInApp" */; + buildPhases = ( + 120377491F16466E00B02B50 /* Sources */, + 1203774A1F16466E00B02B50 /* Frameworks */, + 1203774B1F16466E00B02B50 /* Resources */, + 120377711F1646FE00B02B50 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 1203776C1F1646FE00B02B50 /* PBXTargetDependency */, + ); + name = TouchInApp; + productName = TouchInApp; + productReference = 1203774D1F16466E00B02B50 /* TouchInApp.app */; + productType = "com.apple.product-type.application"; + }; + 120377651F1646FE00B02B50 /* TouchInCallExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1203776E1F1646FE00B02B50 /* Build configuration list for PBXNativeTarget "TouchInCallExtension" */; + buildPhases = ( + 120377621F1646FE00B02B50 /* Sources */, + 120377631F1646FE00B02B50 /* Frameworks */, + 120377641F1646FE00B02B50 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TouchInCallExtension; + productName = TouchInCallExtension; + productReference = 120377661F1646FE00B02B50 /* TouchInCallExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 120377451F16466E00B02B50 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = touchin; + TargetAttributes = { + 1203774C1F16466E00B02B50 = { + CreatedOnToolsVersion = 8.3; + DevelopmentTeam = D4HA43V467; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; + }; + 120377651F1646FE00B02B50 = { + CreatedOnToolsVersion = 8.3; + DevelopmentTeam = D4HA43V467; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; + }; + }; + }; + buildConfigurationList = 120377481F16466E00B02B50 /* Build configuration list for PBXProject "TouchInApp" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 120377441F16466E00B02B50; + productRefGroup = 1203774E1F16466E00B02B50 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1203774C1F16466E00B02B50 /* TouchInApp */, + 120377651F1646FE00B02B50 /* TouchInCallExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1203774B1F16466E00B02B50 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1203775B1F16466E00B02B50 /* LaunchScreen.storyboard in Resources */, + 120377581F16466E00B02B50 /* Assets.xcassets in Resources */, + 120377561F16466E00B02B50 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 120377641F1646FE00B02B50 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 120377491F16466E00B02B50 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 120377531F16466E00B02B50 /* ViewController.swift in Sources */, + 120377731F16475400B02B50 /* LineReader.swift in Sources */, + 120377511F16466E00B02B50 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 120377621F1646FE00B02B50 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 120377761F16481400B02B50 /* LineReader.swift in Sources */, + 120377691F1646FE00B02B50 /* CallDirectoryHandler.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1203776C1F1646FE00B02B50 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 120377651F1646FE00B02B50 /* TouchInCallExtension */; + targetProxy = 1203776B1F1646FE00B02B50 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 120377541F16466E00B02B50 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 120377551F16466E00B02B50 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 120377591F16466E00B02B50 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1203775A1F16466E00B02B50 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1203775D1F16466E00B02B50 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + 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_DOCUMENTATION_COMMENTS = YES; + 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_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + 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_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 = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1203775E1F16466E00B02B50 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + 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_DOCUMENTATION_COMMENTS = YES; + 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_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + 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 = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 120377601F16466E00B02B50 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = TouchInApp/TouchInApp.entitlements; + DEVELOPMENT_TEAM = D4HA43V467; + INFOPLIST_FILE = TouchInApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = ru.touchin.TouchInApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 120377611F16466E00B02B50 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = TouchInApp/TouchInApp.entitlements; + DEVELOPMENT_TEAM = D4HA43V467; + INFOPLIST_FILE = TouchInApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = ru.touchin.TouchInApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 1203776F1F1646FE00B02B50 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CODE_SIGN_ENTITLEMENTS = TouchInCallExtension/TouchInCallExtension.entitlements; + DEVELOPMENT_TEAM = D4HA43V467; + INFOPLIST_FILE = TouchInCallExtension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = ru.touchin.TouchInApp.TouchInCallExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 120377701F1646FE00B02B50 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CODE_SIGN_ENTITLEMENTS = TouchInCallExtension/TouchInCallExtension.entitlements; + DEVELOPMENT_TEAM = D4HA43V467; + INFOPLIST_FILE = TouchInCallExtension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = ru.touchin.TouchInApp.TouchInCallExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 120377481F16466E00B02B50 /* Build configuration list for PBXProject "TouchInApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1203775D1F16466E00B02B50 /* Debug */, + 1203775E1F16466E00B02B50 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1203775F1F16466E00B02B50 /* Build configuration list for PBXNativeTarget "TouchInApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 120377601F16466E00B02B50 /* Debug */, + 120377611F16466E00B02B50 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 1203776E1F1646FE00B02B50 /* Build configuration list for PBXNativeTarget "TouchInCallExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1203776F1F1646FE00B02B50 /* Debug */, + 120377701F1646FE00B02B50 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 120377451F16466E00B02B50 /* Project object */; +} diff --git a/TouchInApp/TouchInApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TouchInApp/TouchInApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..76c3fa4 --- /dev/null +++ b/TouchInApp/TouchInApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TouchInApp/TouchInApp/AppDelegate.swift b/TouchInApp/TouchInApp/AppDelegate.swift new file mode 100644 index 0000000..eda0128 --- /dev/null +++ b/TouchInApp/TouchInApp/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + return true + } + +} + diff --git a/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..60a0f49 --- /dev/null +++ b/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e3020b4d186356f7ef17d8cb5641a1e0028a67ae GIT binary patch literal 1160 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 literal 0 HcmV?d00001 diff --git a/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9960803896a17678aa9986a80d8a72c2ac6237cf GIT binary patch literal 2887 zcmV-N3%K-&P)i zL?baI$_E7kiXT7>Ax%sKf&{2gC=`$awSa}bLfh@W+`TjBJbsv&y?5{41$5`mExP|q zy3?6+XU_T0^ZcLZJZJ6|RptL4rrRAjDzLx;EU=JbfdyD#A;kgk2B2rF2q% zxQSga(lbFcgGHQkWeFPD4Ub5N^!Od9WWL~)3E`k+3KEY?P~pIC ze(@Eaey{{}D4m7$!S314%a0QD5j&hG@r(+I&-P=b?l3(_$Xz#5pF|8O-s2Ly!#P|+ zaWTFdEC5g6%aMbq#d*9^hbhe{NH^!H*D*cp+QFOuK!ha07;J#CSc?r1DJsP*T^EeS zJGT58TfrrGkAW#e?3g(pyN1SuP9S zVJvSv%Nx%V_7FP&g()Rg>~uSYG`IFhg+)sd;m)7))9*8tWX=9?J9pi}FYja3N9He| z<$6Tw$L=81~#Vbx*-63-dsMV=1=D3sD{189<4ptcKrLRhVm7#vNKF<%nL{dN~ zEt&;Yyq{CIj762_{(>P>=Dx z@hPX&g%_UA?miC`qzkD;iLn1|4((^@3YLsCj;HV*Yk28V4v#a?k4rKYjG?Y5IFP2n zsK>+La&G$xMuNnW|CkL6CP*Na}oRJ#W2ARLN}Ez?iU4GS|$;lKxSG0B<-viUHq5 zfr1#ulnv|n(=&u2!b}SPGt65T6h!##jqKdUvSY9yiZ!fQ$rBH-=?=tXsS)t@tGvAv z6J&W&y4CYEsaX^fk5g)OCP#_DLI44T(>sDF*WFAM;r)Clm^TaRF^1hcdGZ044C88u zViZw)O#dSOdJo=V@;c&cTNq8iX48ix50lM%=I0g-uUJVpgeVN}?j6s!;p2eC|iN^>7tYQ=kp(UQ+(rXaGB>=l$Ayy)T zrLmb*?efRovPDfnA=5=etgJtswWnnz-0ri0pq?P&%Qu4~9w)Gb77OqGi;J$}!mCi9 zx$f@m7zk!+zRhi6E*4sK(V%et6^ImAfSNa##-g6}7jymZS-OJSVI~iOXXCYe^EQx% z+UNTu69Vp5jC~P(*2Jfl#vhJeni1(O$aANQY zqi+#`)y)2;1@Apr2xhWi43nPq7Z605;ueJBYE7w9W-ANQcu=V|OdMk3K*mDLXs20V zCJ`=oga!)`z-gDje5cYaD74}xg3NwC3c}a{>Z3&MPR_-GnPm&=7&M%C4ixDQlu>t7 zMPO_{UWwYhm@pR$b|wp{C>(P<%TItJrIAvquL>}>4@r(4q?>Ou_06*sxep zpu8IN_6cxeE^ zz{pwvbx6V8F3T3&WJBswXns=XWQxv~jhc$^d*=JpyPN`Ruu~fsqZ3qI-%NP9ca=9U$!Q zQ18lOAu#Q9AuY7mSh|5K1ip<&XdYjy1DKX6M{&I?{EF>iO=D6pjg$pS8Ya+e5%Ydk z<2_K8I#veeT%KbbHwm!(asnl6Ck+wU4t}eyEL*57ZleoE2|&m2HGtub^i>I58zLe@ z_&?wgm7(^AklDf*KxGvp8!<{0%w$0bJ&P}TpIgiWrRl4wGPFhR$d0 z{Ya8nu#U*N>EIea(umylliKFz@A^YGcJXI2&q;V_{v zdwniFmh8#@Z@?3-Vd)Js+i8caAVmokx0Hn?L{;2G>x&903-PX|4;b*-i^b{S#dMSc zN}O2_Q5mK-(I_sGue&MKw*yTEZ_4?4^)yPjnPgx5sjkLKHZ^M0nv@Xy9_UCB=>wt^ z%F}li`p?B^R%mFB5eBL!Hkx$M%Z(-^g5PHsG$+zkG1i0zN>8_yU z-{SC@_2~o%k`_+7OaY~{K>8iA+!LGkyNPc7F3a?a^-+PcvZhuXE#ptoeQP`#u)qQ= lu#jSb1z2Dq#R3Ze{{}!yknEr7P0auR002ovPDHLkV1nb5PV4{x literal 0 HcmV?d00001 diff --git a/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b46256ce589ade025568dd89a162112dd93e64a2 GIT binary patch literal 2622 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 literal 0 HcmV?d00001 diff --git a/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/TouchInApp/TouchInApp/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c8786ff3540a5ac5da972550c8dcf7ea2d9274 GIT binary patch literal 4208 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 wost7yylsZ82u#CoqA2_StAzaD + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TouchInApp/TouchInApp/Base.lproj/Main.storyboard b/TouchInApp/TouchInApp/Base.lproj/Main.storyboard new file mode 100644 index 0000000..7d874db --- /dev/null +++ b/TouchInApp/TouchInApp/Base.lproj/Main.storyboard @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TouchInApp/TouchInApp/Info.plist b/TouchInApp/TouchInApp/Info.plist new file mode 100644 index 0000000..11127d1 --- /dev/null +++ b/TouchInApp/TouchInApp/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Touch In App + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/TouchInApp/TouchInApp/LineReader.swift b/TouchInApp/TouchInApp/LineReader.swift new file mode 100644 index 0000000..0dc3b42 --- /dev/null +++ b/TouchInApp/TouchInApp/LineReader.swift @@ -0,0 +1,35 @@ +import Foundation + +class LineReader { + let path: String + + fileprivate let file: UnsafeMutablePointer! + + init?(path: String) { + self.path = path + + file = fopen(path, "r") + + guard file != nil else { return nil } + + } + + var nextLine: String? { + var line:UnsafeMutablePointer? = nil + var linecap:Int = 0 + defer { free(line) } + return getline(&line, &linecap, file) > 0 ? String(cString: line!) : nil + } + + deinit { + fclose(file) + } +} + +extension LineReader: Sequence { + func makeIterator() -> AnyIterator { + return AnyIterator { + return self.nextLine + } + } +} diff --git a/TouchInApp/TouchInApp/TouchInApp.entitlements b/TouchInApp/TouchInApp/TouchInApp.entitlements new file mode 100644 index 0000000..e5ab2fc --- /dev/null +++ b/TouchInApp/TouchInApp/TouchInApp.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.ru.touchin.TouchInApp + + + diff --git a/TouchInApp/TouchInApp/ViewController.swift b/TouchInApp/TouchInApp/ViewController.swift new file mode 100644 index 0000000..0e054c8 --- /dev/null +++ b/TouchInApp/TouchInApp/ViewController.swift @@ -0,0 +1,37 @@ +import UIKit +import CallKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + } + + @IBAction func addContacts(_ sender: Any) { + let numbers = ["79214203692", + "79640982354", + "79982434663"] + + let titles = ["Иванов Петр Петрович", + "Сергеев Иван Николаевич", + "Николаев Андрей Михайлович"] + + writeFileForCallDirectory(numbers: numbers, titles: titles) + } + + fileprivate func writeFileForCallDirectory(numbers: [String], titles: [String]) { + guard let fileUrl = FileManager.default + .containerURL(forSecurityApplicationGroupIdentifier: "group.ru.touchin.TouchInApp")? + .appendingPathComponent("contacts") else { return } + + var string = "" + for (number, title) in zip(numbers, titles) { + string += "\(number),\(title)\n" + } + + try? string.write(to: fileUrl, atomically: true, encoding: .utf8) + CXCallDirectoryManager.sharedInstance.reloadExtension(withIdentifier: "ru.touchin.TouchInApp.TouchInCallExtension") + } + +} + diff --git a/TouchInApp/TouchInCallExtension/CallDirectoryHandler.swift b/TouchInApp/TouchInCallExtension/CallDirectoryHandler.swift new file mode 100644 index 0000000..6ddc456 --- /dev/null +++ b/TouchInApp/TouchInCallExtension/CallDirectoryHandler.swift @@ -0,0 +1,79 @@ +import Foundation +import CallKit + +class CallDirectoryHandler: CXCallDirectoryProvider { + + override func beginRequest(with context: CXCallDirectoryExtensionContext) { + context.delegate = self + + do { + try addBlockingPhoneNumbers(to: context) + } catch { + NSLog("Unable to add blocking phone numbers") + let error = NSError(domain: "CallDirectoryHandler", code: 1, userInfo: nil) + context.cancelRequest(withError: error) + return + } + + do { + try addIdentificationPhoneNumbers(to: context) + } catch { + NSLog("Unable to add identification phone numbers") + let error = NSError(domain: "CallDirectoryHandler", code: 2, userInfo: nil) + context.cancelRequest(withError: error) + return + } + + context.completeRequest() + } + + private func addBlockingPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws { + // Retrieve phone numbers to block from data store. For optimal performance and memory usage when there are many phone numbers, + // consider only loading a subset of numbers at a given time and using autorelease pool(s) to release objects allocated during each batch of numbers which are loaded. + // + // Numbers must be provided in numerically ascending order. + let phoneNumbers: [CXCallDirectoryPhoneNumber] = [ 14085555555, 18005555555 ] + + for phoneNumber in phoneNumbers { + context.addBlockingEntry(withNextSequentialPhoneNumber: phoneNumber) + } + } + + private func addIdentificationPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws { + guard let fileUrl = FileManager.default + .containerURL(forSecurityApplicationGroupIdentifier: "group.ru.touchin.TouchInApp")? + .appendingPathComponent("contacts") else { return } + + guard let reader = LineReader(path: fileUrl.path) else { return } + + for line in reader { + autoreleasepool { + // считываем строку и удаляем перевод строки в конце + let line = line.trimmingCharacters(in: .whitespacesAndNewlines) + + // отделяем номер от имени + var components = line.components(separatedBy: ",") + + // приводим номер к Int64 + guard let phone = Int64(components[0]) else { return } + let name = components[1] + + context.addIdentificationEntry(withNextSequentialPhoneNumber: phone, label: name) + } + } + } + +} + +extension CallDirectoryHandler: CXCallDirectoryExtensionContextDelegate { + + func requestFailed(for extensionContext: CXCallDirectoryExtensionContext, withError error: Error) { + // An error occurred while adding blocking or identification entries, check the NSError for details. + // For Call Directory error codes, see the CXErrorCodeCallDirectoryManagerError enum in . + // + // This may be used to store the error details in a location accessible by the extension's containing app, so that the + // app may be notified about errors which occured while loading data even if the request to load data was initiated by + // the user in Settings instead of via the app itself. + } + +} diff --git a/TouchInApp/TouchInCallExtension/Info.plist b/TouchInApp/TouchInCallExtension/Info.plist new file mode 100644 index 0000000..7aeca1c --- /dev/null +++ b/TouchInApp/TouchInCallExtension/Info.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + TouchInCallExtension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionPointIdentifier + com.apple.callkit.call-directory + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).CallDirectoryHandler + + + diff --git a/TouchInApp/TouchInCallExtension/TouchInCallExtension.entitlements b/TouchInApp/TouchInCallExtension/TouchInCallExtension.entitlements new file mode 100644 index 0000000..e5ab2fc --- /dev/null +++ b/TouchInApp/TouchInCallExtension/TouchInCallExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.ru.touchin.TouchInApp + + +