From 3aaf8a37c8a965783f3b780172ccce5562e6d2e3 Mon Sep 17 00:00:00 2001 From: shu223 Date: Mon, 31 Aug 2015 17:07:52 +0200 Subject: [PATCH] Added a example for Content Blockers --- README.md | 6 + ResourcesForREADME/blocker.jpg | Bin 0 -> 46070 bytes .../ActionRequestHandler.swift | 23 ++ TwitterHeaderBlocker/Info.plist | 33 +++ TwitterHeaderBlocker/blockerList.json | 11 + .../ActionRequestHandler.swift | 23 ++ TwitterImageBlocker/Info.plist | 33 +++ TwitterImageBlocker/blockerList.json | 10 + iOS9Sampler.xcodeproj/project.pbxproj | 272 +++++++++++++++++- iOS9Sampler/RootViewController.swift | 5 + .../ContentBlocker.storyboard | 71 +++++ .../ContentBlockerViewController.swift | 44 +++ .../MapCustomizations.storyboard | 4 +- 13 files changed, 529 insertions(+), 6 deletions(-) create mode 100644 ResourcesForREADME/blocker.jpg create mode 100644 TwitterHeaderBlocker/ActionRequestHandler.swift create mode 100644 TwitterHeaderBlocker/Info.plist create mode 100644 TwitterHeaderBlocker/blockerList.json create mode 100644 TwitterImageBlocker/ActionRequestHandler.swift create mode 100644 TwitterImageBlocker/Info.plist create mode 100644 TwitterImageBlocker/blockerList.json create mode 100644 iOS9Sampler/SampleViewControllers/ContentBlocker.storyboard create mode 100644 iOS9Sampler/SampleViewControllers/ContentBlockerViewController.swift diff --git a/README.md b/README.md index 5e7098d..96985d7 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,12 @@ Retrieve audio unit components using AudioUnitComponentManager and apply them to +###Content Blockers + +Example for Content Blocker Extensions. + + + ###Attributes of New Filters diff --git a/ResourcesForREADME/blocker.jpg b/ResourcesForREADME/blocker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..089ff157e9c50c5f2d1f4659e79937e6f616cd1c GIT binary patch literal 46070 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 literal 0 HcmV?d00001 diff --git a/TwitterHeaderBlocker/ActionRequestHandler.swift b/TwitterHeaderBlocker/ActionRequestHandler.swift new file mode 100644 index 0000000..1f5b328 --- /dev/null +++ b/TwitterHeaderBlocker/ActionRequestHandler.swift @@ -0,0 +1,23 @@ +// +// ActionRequestHandler.swift +// TwitterHeaderBlocker +// +// Created by Shuichi Tsutsumi on 8/31/15. +// Copyright © 2015 Shuichi Tsutsumi. All rights reserved. +// + +import UIKit +import MobileCoreServices + +class ActionRequestHandler: NSObject, NSExtensionRequestHandling { + + func beginRequestWithExtensionContext(context: NSExtensionContext) { + let attachment = NSItemProvider(contentsOfURL: NSBundle.mainBundle().URLForResource("blockerList", withExtension: "json"))! + + let item = NSExtensionItem() + item.attachments = [attachment] + + context.completeRequestReturningItems([item], completionHandler: nil); + } + +} diff --git a/TwitterHeaderBlocker/Info.plist b/TwitterHeaderBlocker/Info.plist new file mode 100644 index 0000000..6103ba0 --- /dev/null +++ b/TwitterHeaderBlocker/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + TwitterHeaderBlocker + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSExtension + + NSExtensionPointIdentifier + com.apple.Safari.content-blocker + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).ActionRequestHandler + + + diff --git a/TwitterHeaderBlocker/blockerList.json b/TwitterHeaderBlocker/blockerList.json new file mode 100644 index 0000000..4abc0e7 --- /dev/null +++ b/TwitterHeaderBlocker/blockerList.json @@ -0,0 +1,11 @@ +[ + { + "action": { + "type": "css-display-none", + "selector": "header" + }, + "trigger": { + "url-filter": ".*" + } + } +] \ No newline at end of file diff --git a/TwitterImageBlocker/ActionRequestHandler.swift b/TwitterImageBlocker/ActionRequestHandler.swift new file mode 100644 index 0000000..aa1cd87 --- /dev/null +++ b/TwitterImageBlocker/ActionRequestHandler.swift @@ -0,0 +1,23 @@ +// +// ActionRequestHandler.swift +// TwitterImageBlocker +// +// Created by Shuichi Tsutsumi on 8/31/15. +// Copyright © 2015 Shuichi Tsutsumi. All rights reserved. +// + +import UIKit +import MobileCoreServices + +class ActionRequestHandler: NSObject, NSExtensionRequestHandling { + + func beginRequestWithExtensionContext(context: NSExtensionContext) { + let attachment = NSItemProvider(contentsOfURL: NSBundle.mainBundle().URLForResource("blockerList", withExtension: "json"))! + + let item = NSExtensionItem() + item.attachments = [attachment] + + context.completeRequestReturningItems([item], completionHandler: nil); + } + +} diff --git a/TwitterImageBlocker/Info.plist b/TwitterImageBlocker/Info.plist new file mode 100644 index 0000000..a7d1c57 --- /dev/null +++ b/TwitterImageBlocker/Info.plist @@ -0,0 +1,33 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + TwitterImageBlocker + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSExtension + + NSExtensionPointIdentifier + com.apple.Safari.content-blocker + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).ActionRequestHandler + + + diff --git a/TwitterImageBlocker/blockerList.json b/TwitterImageBlocker/blockerList.json new file mode 100644 index 0000000..6c4141d --- /dev/null +++ b/TwitterImageBlocker/blockerList.json @@ -0,0 +1,10 @@ +[ + { + "action": { + "type": "block" + }, + "trigger": { + "url-filter": "pbs.twimg.com" + } + } +] \ No newline at end of file diff --git a/iOS9Sampler.xcodeproj/project.pbxproj b/iOS9Sampler.xcodeproj/project.pbxproj index f3daa25..0957cb6 100644 --- a/iOS9Sampler.xcodeproj/project.pbxproj +++ b/iOS9Sampler.xcodeproj/project.pbxproj @@ -19,8 +19,15 @@ 8A3A321E1B35F0740016C4CE /* drumLoop.caf in Resources */ = {isa = PBXBuildFile; fileRef = 8A3A321C1B35F0740016C4CE /* drumLoop.caf */; }; 8A7858891B8DDDBA00F93493 /* MapCustomizationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A7858881B8DDDBA00F93493 /* MapCustomizationsViewController.swift */; }; 8A78588B1B8DDDD100F93493 /* MapCustomizations.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8A78588A1B8DDDD100F93493 /* MapCustomizations.storyboard */; }; - 8A78588E1B8DDF8100F93493 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A78588D1B8DDF8100F93493 /* MapKit.framework */; }; 8A7C19CA1B8B63AF00F75F88 /* FilterHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A7C19C91B8B63AF00F75F88 /* FilterHelper.swift */; }; + 8A9078CF1B949A5F000518C3 /* blockerList.json in Resources */ = {isa = PBXBuildFile; fileRef = 8A9078CE1B949A5F000518C3 /* blockerList.json */; }; + 8A9078D11B949A5F000518C3 /* ActionRequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9078D01B949A5F000518C3 /* ActionRequestHandler.swift */; }; + 8A9078D51B949A5F000518C3 /* TwitterHeaderBlocker.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8A9078CC1B949A5F000518C3 /* TwitterHeaderBlocker.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 8A9078DA1B949B64000518C3 /* ContentBlockerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9078D91B949B64000518C3 /* ContentBlockerViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 8A9078DC1B949B72000518C3 /* ContentBlocker.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8A9078DB1B949B72000518C3 /* ContentBlocker.storyboard */; settings = {ASSET_TAGS = (); }; }; + 8A9078E51B949BCC000518C3 /* blockerList.json in Resources */ = {isa = PBXBuildFile; fileRef = 8A9078E41B949BCC000518C3 /* blockerList.json */; }; + 8A9078E71B949BCC000518C3 /* ActionRequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9078E61B949BCC000518C3 /* ActionRequestHandler.swift */; }; + 8A9078EB1B949BCC000518C3 /* TwitterImageBlocker.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8A9078E21B949BCC000518C3 /* TwitterImageBlocker.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 8AD5D7571B295E8C001924F0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD5D7561B295E8C001924F0 /* AppDelegate.swift */; }; 8AD5D7591B295E8C001924F0 /* RootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD5D7581B295E8C001924F0 /* RootViewController.swift */; }; 8AD5D75C1B295E8C001924F0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8AD5D75A1B295E8C001924F0 /* Main.storyboard */; }; @@ -32,6 +39,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 8A9078D31B949A5F000518C3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8AD5D74B1B295E8C001924F0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8A9078CB1B949A5F000518C3; + remoteInfo = TwitterHeaderBlocker; + }; + 8A9078E91B949BCC000518C3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8AD5D74B1B295E8C001924F0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8A9078E11B949BCC000518C3; + remoteInfo = TwitterImageBlocker; + }; 8AD5D7681B295E8C001924F0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 8AD5D74B1B295E8C001924F0 /* Project object */; @@ -48,6 +69,21 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 8A9078C71B948F05000518C3 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 8A9078D51B949A5F000518C3 /* TwitterHeaderBlocker.appex in Embed App Extensions */, + 8A9078EB1B949BCC000518C3 /* TwitterImageBlocker.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 8A3588231B33CCC000D4D32C /* TextDetectViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextDetectViewController.swift; sourceTree = ""; }; 8A3588251B33CCD400D4D32C /* TextDetect.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = TextDetect.storyboard; sourceTree = ""; }; @@ -62,8 +98,17 @@ 8A3A321C1B35F0740016C4CE /* drumLoop.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = drumLoop.caf; sourceTree = ""; }; 8A7858881B8DDDBA00F93493 /* MapCustomizationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapCustomizationsViewController.swift; sourceTree = ""; }; 8A78588A1B8DDDD100F93493 /* MapCustomizations.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MapCustomizations.storyboard; sourceTree = ""; }; - 8A78588D1B8DDF8100F93493 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; 8A7C19C91B8B63AF00F75F88 /* FilterHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterHelper.swift; sourceTree = ""; }; + 8A9078CC1B949A5F000518C3 /* TwitterHeaderBlocker.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TwitterHeaderBlocker.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A9078CE1B949A5F000518C3 /* blockerList.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = blockerList.json; sourceTree = ""; }; + 8A9078D01B949A5F000518C3 /* ActionRequestHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionRequestHandler.swift; sourceTree = ""; }; + 8A9078D21B949A5F000518C3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8A9078D91B949B64000518C3 /* ContentBlockerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentBlockerViewController.swift; sourceTree = ""; }; + 8A9078DB1B949B72000518C3 /* ContentBlocker.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ContentBlocker.storyboard; sourceTree = ""; }; + 8A9078E21B949BCC000518C3 /* TwitterImageBlocker.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TwitterImageBlocker.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A9078E41B949BCC000518C3 /* blockerList.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = blockerList.json; sourceTree = ""; }; + 8A9078E61B949BCC000518C3 /* ActionRequestHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionRequestHandler.swift; sourceTree = ""; }; + 8A9078E81B949BCC000518C3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8AD5D7531B295E8C001924F0 /* iOS9Sampler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOS9Sampler.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8AD5D7561B295E8C001924F0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8AD5D7581B295E8C001924F0 /* RootViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootViewController.swift; sourceTree = ""; }; @@ -81,11 +126,24 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 8A9078C91B949A5F000518C3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A9078DF1B949BCC000518C3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 8AD5D7501B295E8C001924F0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8A78588E1B8DDF8100F93493 /* MapKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -114,6 +172,7 @@ 8A7C19C71B8B635B00F75F88 /* ImageFilters */, 8A7C19C61B8B634C00F75F88 /* FilterAttributes */, 8A78588C1B8DDDEF00F93493 /* MapCustomizations */, + 8A9078DD1B949B79000518C3 /* ContentBlocker */, ); path = SampleViewControllers; sourceTree = ""; @@ -188,12 +247,58 @@ name = AudioUnitComponentManager; sourceTree = ""; }; + 8A9078CD1B949A5F000518C3 /* TwitterHeaderBlocker */ = { + isa = PBXGroup; + children = ( + 8A9078CE1B949A5F000518C3 /* blockerList.json */, + 8A9078D01B949A5F000518C3 /* ActionRequestHandler.swift */, + 8A9078D21B949A5F000518C3 /* Info.plist */, + ); + path = TwitterHeaderBlocker; + sourceTree = ""; + }; + 8A9078DD1B949B79000518C3 /* ContentBlocker */ = { + isa = PBXGroup; + children = ( + 8A9078D91B949B64000518C3 /* ContentBlockerViewController.swift */, + 8A9078DB1B949B72000518C3 /* ContentBlocker.storyboard */, + ); + name = ContentBlocker; + sourceTree = ""; + }; + 8A9078E31B949BCC000518C3 /* TwitterImageBlocker */ = { + isa = PBXGroup; + children = ( + 8A9078E41B949BCC000518C3 /* blockerList.json */, + 8A9078E61B949BCC000518C3 /* ActionRequestHandler.swift */, + 8A9078E81B949BCC000518C3 /* Info.plist */, + ); + path = TwitterImageBlocker; + sourceTree = ""; + }; + 8A9078EF1B949CF8000518C3 /* ContentBlockers */ = { + isa = PBXGroup; + children = ( + 8A9078CD1B949A5F000518C3 /* TwitterHeaderBlocker */, + 8A9078E31B949BCC000518C3 /* TwitterImageBlocker */, + ); + name = ContentBlockers; + sourceTree = ""; + }; + 8A9078F01B949D42000518C3 /* iOS9SamplerExtensions */ = { + isa = PBXGroup; + children = ( + 8A9078EF1B949CF8000518C3 /* ContentBlockers */, + ); + name = iOS9SamplerExtensions; + sourceTree = ""; + }; 8AD5D74A1B295E8C001924F0 = { isa = PBXGroup; children = ( - 8A78588D1B8DDF8100F93493 /* MapKit.framework */, 8A3A32181B35F0740016C4CE /* Resources */, 8AD5D7551B295E8C001924F0 /* iOS9Sampler */, + 8A9078F01B949D42000518C3 /* iOS9SamplerExtensions */, 8AD5D76A1B295E8C001924F0 /* iOS9SamplerTests */, 8AD5D7751B295E8C001924F0 /* iOS9SamplerUITests */, 8AD5D7541B295E8C001924F0 /* Products */, @@ -206,6 +311,8 @@ 8AD5D7531B295E8C001924F0 /* iOS9Sampler.app */, 8AD5D7671B295E8C001924F0 /* iOS9SamplerTests.xctest */, 8AD5D7721B295E8C001924F0 /* iOS9SamplerUITests.xctest */, + 8A9078CC1B949A5F000518C3 /* TwitterHeaderBlocker.appex */, + 8A9078E21B949BCC000518C3 /* TwitterImageBlocker.appex */, ); name = Products; sourceTree = ""; @@ -248,6 +355,40 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 8A9078CB1B949A5F000518C3 /* TwitterHeaderBlocker */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8A9078D61B949A60000518C3 /* Build configuration list for PBXNativeTarget "TwitterHeaderBlocker" */; + buildPhases = ( + 8A9078C81B949A5F000518C3 /* Sources */, + 8A9078C91B949A5F000518C3 /* Frameworks */, + 8A9078CA1B949A5F000518C3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TwitterHeaderBlocker; + productName = TwitterHeaderBlocker; + productReference = 8A9078CC1B949A5F000518C3 /* TwitterHeaderBlocker.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 8A9078E11B949BCC000518C3 /* TwitterImageBlocker */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8A9078EC1B949BCD000518C3 /* Build configuration list for PBXNativeTarget "TwitterImageBlocker" */; + buildPhases = ( + 8A9078DE1B949BCC000518C3 /* Sources */, + 8A9078DF1B949BCC000518C3 /* Frameworks */, + 8A9078E01B949BCC000518C3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TwitterImageBlocker; + productName = TwitterImageBlocker; + productReference = 8A9078E21B949BCC000518C3 /* TwitterImageBlocker.appex */; + productType = "com.apple.product-type.app-extension"; + }; 8AD5D7521B295E8C001924F0 /* iOS9Sampler */ = { isa = PBXNativeTarget; buildConfigurationList = 8AD5D77B1B295E8C001924F0 /* Build configuration list for PBXNativeTarget "iOS9Sampler" */; @@ -255,10 +396,13 @@ 8AD5D74F1B295E8C001924F0 /* Sources */, 8AD5D7501B295E8C001924F0 /* Frameworks */, 8AD5D7511B295E8C001924F0 /* Resources */, + 8A9078C71B948F05000518C3 /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( + 8A9078D41B949A5F000518C3 /* PBXTargetDependency */, + 8A9078EA1B949BCC000518C3 /* PBXTargetDependency */, ); name = iOS9Sampler; productName = iOS9Sampler; @@ -311,6 +455,12 @@ LastUpgradeCheck = 0700; ORGANIZATIONNAME = "Shuichi Tsutsumi"; TargetAttributes = { + 8A9078CB1B949A5F000518C3 = { + CreatedOnToolsVersion = 7.0; + }; + 8A9078E11B949BCC000518C3 = { + CreatedOnToolsVersion = 7.0; + }; 8AD5D7521B295E8C001924F0 = { CreatedOnToolsVersion = 7.0; }; @@ -340,11 +490,29 @@ 8AD5D7521B295E8C001924F0 /* iOS9Sampler */, 8AD5D7661B295E8C001924F0 /* iOS9SamplerTests */, 8AD5D7711B295E8C001924F0 /* iOS9SamplerUITests */, + 8A9078CB1B949A5F000518C3 /* TwitterHeaderBlocker */, + 8A9078E11B949BCC000518C3 /* TwitterImageBlocker */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 8A9078CA1B949A5F000518C3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A9078CF1B949A5F000518C3 /* blockerList.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A9078E01B949BCC000518C3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A9078E51B949BCC000518C3 /* blockerList.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 8AD5D7511B295E8C001924F0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -354,6 +522,7 @@ 8AD5D7611B295E8C001924F0 /* LaunchScreen.storyboard in Resources */, 8A3A32171B35DAE10016C4CE /* AudioUnitComponentManager.storyboard in Resources */, 8AD5D75E1B295E8C001924F0 /* Assets.xcassets in Resources */, + 8A9078DC1B949B72000518C3 /* ContentBlocker.storyboard in Resources */, 8A3A321E1B35F0740016C4CE /* drumLoop.caf in Resources */, 8A78588B1B8DDDD100F93493 /* MapCustomizations.storyboard in Resources */, 8A3588261B33CCD400D4D32C /* TextDetect.storyboard in Resources */, @@ -378,11 +547,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 8A9078C81B949A5F000518C3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A9078D11B949A5F000518C3 /* ActionRequestHandler.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A9078DE1B949BCC000518C3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A9078E71B949BCC000518C3 /* ActionRequestHandler.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 8AD5D74F1B295E8C001924F0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8AD5D7591B295E8C001924F0 /* RootViewController.swift in Sources */, + 8A9078DA1B949B64000518C3 /* ContentBlockerViewController.swift in Sources */, 8A3588331B33F3B500D4D32C /* FilterDetailViewController.swift in Sources */, 8A3588241B33CCC000D4D32C /* TextDetectViewController.swift in Sources */, 8A7858891B8DDDBA00F93493 /* MapCustomizationsViewController.swift in Sources */, @@ -414,6 +600,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 8A9078D41B949A5F000518C3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8A9078CB1B949A5F000518C3 /* TwitterHeaderBlocker */; + targetProxy = 8A9078D31B949A5F000518C3 /* PBXContainerItemProxy */; + }; + 8A9078EA1B949BCC000518C3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8A9078E11B949BCC000518C3 /* TwitterImageBlocker */; + targetProxy = 8A9078E91B949BCC000518C3 /* PBXContainerItemProxy */; + }; 8AD5D7691B295E8C001924F0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8AD5D7521B295E8C001924F0 /* iOS9Sampler */; @@ -446,6 +642,54 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 8A9078D71B949A60000518C3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + INFOPLIST_FILE = TwitterHeaderBlocker/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.iOS9Sampler.TwitterHeaderBlocker"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 8A9078D81B949A60000518C3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + INFOPLIST_FILE = TwitterHeaderBlocker/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.iOS9Sampler.TwitterHeaderBlocker"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 8A9078ED1B949BCD000518C3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + INFOPLIST_FILE = TwitterImageBlocker/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.iOS9Sampler.TwitterImageBlocker"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 8A9078EE1B949BCD000518C3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + INFOPLIST_FILE = TwitterImageBlocker/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.iOS9Sampler.TwitterImageBlocker"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; 8AD5D7791B295E8C001924F0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -532,6 +776,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; INFOPLIST_FILE = iOS9Sampler/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.iOS9Sampler"; @@ -546,6 +791,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; INFOPLIST_FILE = iOS9Sampler/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.iOS9Sampler"; @@ -605,6 +851,24 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 8A9078D61B949A60000518C3 /* Build configuration list for PBXNativeTarget "TwitterHeaderBlocker" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8A9078D71B949A60000518C3 /* Debug */, + 8A9078D81B949A60000518C3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8A9078EC1B949BCD000518C3 /* Build configuration list for PBXNativeTarget "TwitterImageBlocker" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8A9078ED1B949BCD000518C3 /* Debug */, + 8A9078EE1B949BCD000518C3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 8AD5D74E1B295E8C001924F0 /* Build configuration list for PBXProject "iOS9Sampler" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/iOS9Sampler/RootViewController.swift b/iOS9Sampler/RootViewController.swift index 7e95c24..148b387 100644 --- a/iOS9Sampler/RootViewController.swift +++ b/iOS9Sampler/RootViewController.swift @@ -44,6 +44,11 @@ class RootViewController: UITableViewController { kItemKeyDetail: "Retrieve available audio units using AudioUnitComponentManager and apply them to a sound. If there are some Audio Unit Extensions, they will be also shown.", kItemKeyClassPrefix: "AudioUnitComponentManager", ], + [ + kItemKeyTitle: "Content Blockers", + kItemKeyDetail: "Example for Content Blocker Extension.", + kItemKeyClassPrefix: "ContentBlocker" + ], [ kItemKeyTitle: "Attributes of New Filters", kItemKeyDetail: "Attributes viewer for new filters of CIFilter.", diff --git a/iOS9Sampler/SampleViewControllers/ContentBlocker.storyboard b/iOS9Sampler/SampleViewControllers/ContentBlocker.storyboard new file mode 100644 index 0000000..dc16af7 --- /dev/null +++ b/iOS9Sampler/SampleViewControllers/ContentBlocker.storyboard @@ -0,0 +1,71 @@ + + + + + + + + + AvenirNext-Regular + AvenirNext-Regular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS9Sampler/SampleViewControllers/ContentBlockerViewController.swift b/iOS9Sampler/SampleViewControllers/ContentBlockerViewController.swift new file mode 100644 index 0000000..e0076ad --- /dev/null +++ b/iOS9Sampler/SampleViewControllers/ContentBlockerViewController.swift @@ -0,0 +1,44 @@ +// +// ContentBlockerViewController.swift +// iOS9Sampler +// +// Created by Shuichi Tsutsumi on 8/31/15. +// Copyright © 2015 Shuichi Tsutsumi. All rights reserved. +// +// Thanks to: +// http://www.toyship.org/archives/2182 + + +import UIKit + +class ContentBlockerViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + + + @IBAction func safariBtnTapped(sender: UIButton) { + + let url = NSURL(string: "https://mobile.twitter.com/shu223")! + UIApplication.sharedApplication().openURL(url) + } +} diff --git a/iOS9Sampler/SampleViewControllers/MapCustomizations.storyboard b/iOS9Sampler/SampleViewControllers/MapCustomizations.storyboard index dac895b..eb3fd3d 100644 --- a/iOS9Sampler/SampleViewControllers/MapCustomizations.storyboard +++ b/iOS9Sampler/SampleViewControllers/MapCustomizations.storyboard @@ -1,7 +1,7 @@ - + - +