diff --git a/Notification Service Extension/Info.plist b/Notification Service Extension/Info.plist
new file mode 100644
index 0000000..3c15496
--- /dev/null
+++ b/Notification Service Extension/Info.plist
@@ -0,0 +1,31 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Notification Service Extension
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ XPC!
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.usernotifications.service
+ NSExtensionPrincipalClass
+ $(PRODUCT_MODULE_NAME).NotificationService
+
+
+
diff --git a/Notification Service Extension/NotificationService.swift b/Notification Service Extension/NotificationService.swift
new file mode 100644
index 0000000..3194db2
--- /dev/null
+++ b/Notification Service Extension/NotificationService.swift
@@ -0,0 +1,36 @@
+//
+// NotificationService.swift
+// Notification Service Extension
+//
+// Created by Prescott, Ste on 02/12/2018.
+// Copyright © 2018 Ste Prescott. All rights reserved.
+//
+
+import UserNotifications
+
+class NotificationService: UNNotificationServiceExtension {
+
+ var contentHandler: ((UNNotificationContent) -> Void)?
+ var bestAttemptContent: UNMutableNotificationContent?
+
+ override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
+ self.contentHandler = contentHandler
+ bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
+
+ if let bestAttemptContent = bestAttemptContent {
+ // Modify the notification content here...
+ bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
+
+ contentHandler(bestAttemptContent)
+ }
+ }
+
+ override func serviceExtensionTimeWillExpire() {
+ // Called just before the extension will be terminated by the system.
+ // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
+ if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
+ contentHandler(bestAttemptContent)
+ }
+ }
+
+}
diff --git a/README.md b/README.md
index f661ebd..3602160 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,16 @@
# XcodeGen
-### Step 1
-If you look at the files for this repo at this stage you will find all that is added when you create a blank empty project with unit & UI test targets. Nothing else, just a blank default project.
+### Step 2
+For this step we added a new Notification Service Extension to the project using the add target feature of Xcode.
-Already there are close to 1000 lines of code that you haven't added.
+No additional code or files added other than what is added by default and already the pull request (PR) is difficult to parse and reason with.
---
### Next
-Please now checkout `step-2`
+Please now checkout `step-3`
-`git checkout tags/step-2`
+`git checkout tags/step-3`
---
diff --git a/XcodeGen.xcodeproj/project.pbxproj b/XcodeGen.xcodeproj/project.pbxproj
index b67eca9..114b0ae 100644
--- a/XcodeGen.xcodeproj/project.pbxproj
+++ b/XcodeGen.xcodeproj/project.pbxproj
@@ -14,6 +14,8 @@
8B53915221B4057F00E124A0 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8B53915021B4057F00E124A0 /* LaunchScreen.storyboard */; };
8B53915D21B4057F00E124A0 /* XcodeGenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B53915C21B4057F00E124A0 /* XcodeGenTests.swift */; };
8B53916821B4057F00E124A0 /* XcodeGenUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B53916721B4057F00E124A0 /* XcodeGenUITests.swift */; };
+ 8B5391BB21B41ABF00E124A0 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B5391BA21B41ABF00E124A0 /* NotificationService.swift */; };
+ 8B5391BF21B41ABF00E124A0 /* Notification Service Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8B5391B821B41ABF00E124A0 /* Notification Service Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -31,8 +33,29 @@
remoteGlobalIDString = 8B53914321B4057D00E124A0;
remoteInfo = XcodeGen;
};
+ 8B5391BD21B41ABF00E124A0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 8B53913C21B4057D00E124A0 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 8B5391B721B41ABF00E124A0;
+ remoteInfo = "Notification Service Extension";
+ };
/* End PBXContainerItemProxy section */
+/* Begin PBXCopyFilesBuildPhase section */
+ 8B5391C321B41ABF00E124A0 /* Embed App Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 8B5391BF21B41ABF00E124A0 /* Notification Service Extension.appex in Embed App Extensions */,
+ );
+ name = "Embed App Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
/* Begin PBXFileReference section */
8B53914421B4057D00E124A0 /* XcodeGen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XcodeGen.app; sourceTree = BUILT_PRODUCTS_DIR; };
8B53914721B4057D00E124A0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
@@ -47,6 +70,9 @@
8B53916321B4057F00E124A0 /* XcodeGenUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XcodeGenUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
8B53916721B4057F00E124A0 /* XcodeGenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeGenUITests.swift; sourceTree = ""; };
8B53916921B4057F00E124A0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 8B5391B821B41ABF00E124A0 /* Notification Service Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Notification Service Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8B5391BA21B41ABF00E124A0 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; };
+ 8B5391BC21B41ABF00E124A0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -71,6 +97,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 8B5391B521B41ABF00E124A0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -80,6 +113,7 @@
8B53914621B4057D00E124A0 /* XcodeGen */,
8B53915B21B4057F00E124A0 /* XcodeGenTests */,
8B53916621B4057F00E124A0 /* XcodeGenUITests */,
+ 8B5391B921B41ABF00E124A0 /* Notification Service Extension */,
8B53914521B4057D00E124A0 /* Products */,
);
sourceTree = "";
@@ -90,6 +124,7 @@
8B53914421B4057D00E124A0 /* XcodeGen.app */,
8B53915821B4057F00E124A0 /* XcodeGenTests.xctest */,
8B53916321B4057F00E124A0 /* XcodeGenUITests.xctest */,
+ 8B5391B821B41ABF00E124A0 /* Notification Service Extension.appex */,
);
name = Products;
sourceTree = "";
@@ -125,6 +160,15 @@
path = XcodeGenUITests;
sourceTree = "";
};
+ 8B5391B921B41ABF00E124A0 /* Notification Service Extension */ = {
+ isa = PBXGroup;
+ children = (
+ 8B5391BA21B41ABF00E124A0 /* NotificationService.swift */,
+ 8B5391BC21B41ABF00E124A0 /* Info.plist */,
+ );
+ path = "Notification Service Extension";
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -135,10 +179,12 @@
8B53914021B4057D00E124A0 /* Sources */,
8B53914121B4057D00E124A0 /* Frameworks */,
8B53914221B4057D00E124A0 /* Resources */,
+ 8B5391C321B41ABF00E124A0 /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
+ 8B5391BE21B41ABF00E124A0 /* PBXTargetDependency */,
);
name = XcodeGen;
productName = XcodeGen;
@@ -181,6 +227,23 @@
productReference = 8B53916321B4057F00E124A0 /* XcodeGenUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
+ 8B5391B721B41ABF00E124A0 /* Notification Service Extension */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 8B5391C221B41ABF00E124A0 /* Build configuration list for PBXNativeTarget "Notification Service Extension" */;
+ buildPhases = (
+ 8B5391B421B41ABF00E124A0 /* Sources */,
+ 8B5391B521B41ABF00E124A0 /* Frameworks */,
+ 8B5391B621B41ABF00E124A0 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Notification Service Extension";
+ productName = "Notification Service Extension";
+ productReference = 8B5391B821B41ABF00E124A0 /* Notification Service Extension.appex */;
+ productType = "com.apple.product-type.app-extension";
+ };
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -202,6 +265,9 @@
CreatedOnToolsVersion = 10.1;
TestTargetID = 8B53914321B4057D00E124A0;
};
+ 8B5391B721B41ABF00E124A0 = {
+ CreatedOnToolsVersion = 10.1;
+ };
};
};
buildConfigurationList = 8B53913F21B4057D00E124A0 /* Build configuration list for PBXProject "XcodeGen" */;
@@ -220,6 +286,7 @@
8B53914321B4057D00E124A0 /* XcodeGen */,
8B53915721B4057F00E124A0 /* XcodeGenTests */,
8B53916221B4057F00E124A0 /* XcodeGenUITests */,
+ 8B5391B721B41ABF00E124A0 /* Notification Service Extension */,
);
};
/* End PBXProject section */
@@ -249,6 +316,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 8B5391B621B41ABF00E124A0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -277,6 +351,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 8B5391B421B41ABF00E124A0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8B5391BB21B41ABF00E124A0 /* NotificationService.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -290,6 +372,11 @@
target = 8B53914321B4057D00E124A0 /* XcodeGen */;
targetProxy = 8B53916421B4057F00E124A0 /* PBXContainerItemProxy */;
};
+ 8B5391BE21B41ABF00E124A0 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 8B5391B721B41ABF00E124A0 /* Notification Service Extension */;
+ targetProxy = 8B5391BD21B41ABF00E124A0 /* PBXContainerItemProxy */;
+ };
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
@@ -431,6 +518,7 @@
8B53916D21B4057F00E124A0 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = XcodeGen/Info.plist;
@@ -448,6 +536,7 @@
8B53916E21B4057F00E124A0 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = XcodeGen/Info.plist;
@@ -540,6 +629,42 @@
};
name = Release;
};
+ 8B5391C021B41ABF00E124A0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ INFOPLIST_FILE = "Notification Service Extension/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "me.steprescott.XcodeGen.Notification-Service-Extension";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 4.2;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 8B5391C121B41ABF00E124A0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ INFOPLIST_FILE = "Notification Service Extension/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "me.steprescott.XcodeGen.Notification-Service-Extension";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 4.2;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -579,6 +704,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ 8B5391C221B41ABF00E124A0 /* Build configuration list for PBXNativeTarget "Notification Service Extension" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8B5391C021B41ABF00E124A0 /* Debug */,
+ 8B5391C121B41ABF00E124A0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
/* End XCConfigurationList section */
};
rootObject = 8B53913C21B4057D00E124A0 /* Project object */;