Эх сурвалжийг харах

Crashlytics watchOS sample

samedson 4 жил өмнө
parent
commit
9a9980b66e
32 өөрчлөгдсөн 1753 нэмэгдсэн , 109 устгасан
  1. 1 17
      Example/watchOSSample/Podfile
  2. 18 50
      Example/watchOSSample/SampleWatchApp.xcodeproj/project.pbxproj
  3. 33 33
      Example/watchOSSample/SampleWatchAppWatchKitExtension/ExtensionDelegate.swift
  4. 6 6
      Example/watchOSSample/SampleWatchAppWatchKitExtension/InterfaceController.swift
  5. 3 3
      Example/watchOSSample/ServiceExtension/NotificationService.swift
  6. 36 0
      Example/watchOSSample2/GoogleService-Info.plist
  7. 8 0
      Example/watchOSSample2/Podfile
  8. 838 0
      Example/watchOSSample2/SampleWatchApp.xcodeproj/project.pbxproj
  9. 81 0
      Example/watchOSSample2/SampleWatchAppWatchKitApp/Assets.xcassets/AppIcon.appiconset/Contents.json
  10. 6 0
      Example/watchOSSample2/SampleWatchAppWatchKitApp/Assets.xcassets/Contents.json
  11. 56 0
      Example/watchOSSample2/SampleWatchAppWatchKitApp/Base.lproj/Interface.storyboard
  12. 31 0
      Example/watchOSSample2/SampleWatchAppWatchKitApp/Info.plist
  13. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json
  14. 53 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Contents.json
  15. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json
  16. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json
  17. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json
  18. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json
  19. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json
  20. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json
  21. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json
  22. 28 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json
  23. 6 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Contents.json
  24. 76 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/ComplicationController.swift
  25. 25 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/ExtensionDelegate.swift
  26. 56 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/Info.plist
  27. 23 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/InterfaceController.swift
  28. 42 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/NotificationController.swift
  29. 20 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/PushNotificationPayload.apns
  30. 8 0
      Example/watchOSSample2/SampleWatchAppWatchKitExtension/SampleWatchAppWatchKitExtension.entitlements
  31. 31 0
      Example/watchOSSample2/ServiceExtension/Info.plist
  32. 44 0
      Example/watchOSSample2/ServiceExtension/NotificationService.swift

+ 1 - 17
Example/watchOSSample/Podfile

@@ -8,23 +8,7 @@ target 'SampleWatchAppWatchKitExtension' do
   platform :watchos, '7.0'
 
   pod 'FirebaseCore', :path => '../../'
-  pod 'FirebaseMessaging', :path => '../../'
-  pod 'FirebaseCoreDiagnostics', :path => '../../'
-  pod 'FirebaseInstallations', :path => '../../'
-  pod 'FirebaseStorage', :path => '../../'
-  pod 'FirebaseRemoteConfig', :path => '../../'
-  pod 'FirebaseABTesting', :path => '../../'
-  pod 'FirebaseDatabase', :path => '../../'
-
-  pod 'Firebase/Messaging', :path => '../../'
-  pod 'Firebase/Storage', :path => '../../'
-  pod 'Firebase/RemoteConfig', :path => '../../'
-  pod 'Firebase/ABTesting', :path => '../../'
-  pod 'Firebase/Database', :path => '../../'
+  pod 'FirebaseCrashlytics', :path => '../../'
 
 end
 
-target 'ServiceExtension' do
-  platform :watchos, '7.0'
-  pod 'FirebaseMessaging', :path => '../../'
-end

+ 18 - 50
Example/watchOSSample/SampleWatchApp.xcodeproj/project.pbxproj

@@ -7,7 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		0C2B2F85A0156FBA8723F203 /* Pods_SampleWatchAppWatchKitExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6A1681F802CB688198BFE1E /* Pods_SampleWatchAppWatchKitExtension.framework */; };
 		5156947923F4965000E7C350 /* SampleWatchAppWatchKitApp.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 5156947823F4965000E7C350 /* SampleWatchAppWatchKitApp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
 		5156947F23F4965000E7C350 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5156947D23F4965000E7C350 /* Interface.storyboard */; };
 		5156948123F4965100E7C350 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5156948023F4965100E7C350 /* Assets.xcassets */; };
@@ -19,7 +18,7 @@
 		5156949523F4965200E7C350 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5156949423F4965200E7C350 /* Assets.xcassets */; };
 		515694AF23F4A3D200E7C350 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515694AE23F4A3D200E7C350 /* NotificationService.swift */; };
 		515694B323F4A3D200E7C350 /* ServiceExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 515694AC23F4A3D200E7C350 /* ServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
-		9C1E62C8ACA2E9975F320A8C /* Pods_ServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EBA935736290F9E72DB25FF /* Pods_ServiceExtension.framework */; };
+		D0169A15E640EED0AC8224F1 /* Pods_SampleWatchAppWatchKitExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38107C7847C19C1D3ACF6B99 /* Pods_SampleWatchAppWatchKitExtension.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -83,7 +82,8 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		3EBA935736290F9E72DB25FF /* Pods_ServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		33A9E0B6CEEA316615DE87A4 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleWatchAppWatchKitExtension.release.xcconfig"; path = "Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension.release.xcconfig"; sourceTree = "<group>"; };
+		38107C7847C19C1D3ACF6B99 /* Pods_SampleWatchAppWatchKitExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SampleWatchAppWatchKitExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		5156947423F4965000E7C350 /* SampleWatchApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleWatchApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		5156947823F4965000E7C350 /* SampleWatchAppWatchKitApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleWatchAppWatchKitApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		5156947E23F4965000E7C350 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = "<group>"; };
@@ -101,11 +101,7 @@
 		515694AC23F4A3D200E7C350 /* ServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
 		515694AE23F4A3D200E7C350 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
 		515694B023F4A3D200E7C350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		7FBA4340635BF194157452B9 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleWatchAppWatchKitExtension.release.xcconfig"; path = "Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension.release.xcconfig"; sourceTree = "<group>"; };
-		C0064A1E379E237E54A9086B /* Pods-ServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-ServiceExtension/Pods-ServiceExtension.debug.xcconfig"; sourceTree = "<group>"; };
-		CB6479A86CC43D17D90F1E89 /* Pods-ServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-ServiceExtension/Pods-ServiceExtension.release.xcconfig"; sourceTree = "<group>"; };
-		D6A1681F802CB688198BFE1E /* Pods_SampleWatchAppWatchKitExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SampleWatchAppWatchKitExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		DAE14C0BA7504E3EE4267A02 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleWatchAppWatchKitExtension.debug.xcconfig"; path = "Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension.debug.xcconfig"; sourceTree = "<group>"; };
+		AA712B682F202F174FCF95E2 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleWatchAppWatchKitExtension.debug.xcconfig"; path = "Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension.debug.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -120,7 +116,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				0C2B2F85A0156FBA8723F203 /* Pods_SampleWatchAppWatchKitExtension.framework in Frameworks */,
+				D0169A15E640EED0AC8224F1 /* Pods_SampleWatchAppWatchKitExtension.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -128,7 +124,6 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				9C1E62C8ACA2E9975F320A8C /* Pods_ServiceExtension.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -142,11 +137,10 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		203C8A236AE31151AAF474A5 /* Frameworks */ = {
+		2FF640AB878CA3B78FCFBC84 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				D6A1681F802CB688198BFE1E /* Pods_SampleWatchAppWatchKitExtension.framework */,
-				3EBA935736290F9E72DB25FF /* Pods_ServiceExtension.framework */,
+				38107C7847C19C1D3ACF6B99 /* Pods_SampleWatchAppWatchKitExtension.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -159,7 +153,7 @@
 				515694AD23F4A3D200E7C350 /* ServiceExtension */,
 				5156947523F4965000E7C350 /* Products */,
 				BD04909E80693ABDC7D720F6 /* Pods */,
-				203C8A236AE31151AAF474A5 /* Frameworks */,
+				2FF640AB878CA3B78FCFBC84 /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -211,12 +205,9 @@
 		BD04909E80693ABDC7D720F6 /* Pods */ = {
 			isa = PBXGroup;
 			children = (
-				DAE14C0BA7504E3EE4267A02 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */,
-				7FBA4340635BF194157452B9 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */,
-				C0064A1E379E237E54A9086B /* Pods-ServiceExtension.debug.xcconfig */,
-				CB6479A86CC43D17D90F1E89 /* Pods-ServiceExtension.release.xcconfig */,
+				AA712B682F202F174FCF95E2 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */,
+				33A9E0B6CEEA316615DE87A4 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */,
 			);
-			name = Pods;
 			path = Pods;
 			sourceTree = "<group>";
 		};
@@ -263,12 +254,12 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 5156949A23F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchAppWatchKitExtension" */;
 			buildPhases = (
-				E5B1B049432440CF1A70B29A /* [CP] Check Pods Manifest.lock */,
+				D921D42EDC64C1D10431F6A1 /* [CP] Check Pods Manifest.lock */,
 				5156948323F4965100E7C350 /* Sources */,
 				5156948423F4965100E7C350 /* Frameworks */,
 				5156948523F4965100E7C350 /* Resources */,
 				515694B723F4A3D200E7C350 /* Embed App Extensions */,
-				1AC64D8D8CEC350A7BE652AA /* [CP] Embed Pods Frameworks */,
+				955D7705F48AA2EF1F60D4A9 /* [CP] Embed Pods Frameworks */,
 			);
 			buildRules = (
 			);
@@ -284,7 +275,6 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 515694B423F4A3D200E7C350 /* Build configuration list for PBXNativeTarget "ServiceExtension" */;
 			buildPhases = (
-				36BFC0F6A337B1157B6D7C11 /* [CP] Check Pods Manifest.lock */,
 				515694A823F4A3D200E7C350 /* Sources */,
 				515694A923F4A3D200E7C350 /* Frameworks */,
 				515694AA23F4A3D200E7C350 /* Resources */,
@@ -378,7 +368,7 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		1AC64D8D8CEC350A7BE652AA /* [CP] Embed Pods Frameworks */ = {
+		955D7705F48AA2EF1F60D4A9 /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -395,29 +385,7 @@
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		36BFC0F6A337B1157B6D7C11 /* [CP] Check Pods Manifest.lock */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
-				"${PODS_ROOT}/Manifest.lock",
-			);
-			name = "[CP] Check Pods Manifest.lock";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-				"$(DERIVED_FILE_DIR)/Pods-ServiceExtension-checkManifestLockResult.txt",
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
-			showEnvVarsInLog = 0;
-		};
-		E5B1B049432440CF1A70B29A /* [CP] Check Pods Manifest.lock */ = {
+		D921D42EDC64C1D10431F6A1 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -546,6 +514,7 @@
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				ONLY_ACTIVE_ARCH = YES;
+				OTHER_LDFLAGS = "-ObjC";
 				SDKROOT = iphoneos;
 				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -598,6 +567,7 @@
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
+				OTHER_LDFLAGS = "-ObjC";
 				SDKROOT = iphoneos;
 				SWIFT_COMPILATION_MODE = wholemodule;
 				SWIFT_OPTIMIZATION_LEVEL = "-O";
@@ -607,7 +577,7 @@
 		};
 		5156949B23F4965200E7C350 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = DAE14C0BA7504E3EE4267A02 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */;
+			baseConfigurationReference = AA712B682F202F174FCF95E2 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
 				CODE_SIGN_ENTITLEMENTS = SampleWatchAppWatchKitExtension/SampleWatchAppWatchKitExtension.entitlements;
@@ -633,7 +603,7 @@
 		};
 		5156949C23F4965200E7C350 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 7FBA4340635BF194157452B9 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */;
+			baseConfigurationReference = 33A9E0B6CEEA316615DE87A4 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
 				CODE_SIGN_ENTITLEMENTS = SampleWatchAppWatchKitExtension/SampleWatchAppWatchKitExtension.entitlements;
@@ -731,7 +701,6 @@
 		};
 		515694B523F4A3D200E7C350 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C0064A1E379E237E54A9086B /* Pods-ServiceExtension.debug.xcconfig */;
 			buildSettings = {
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Manual;
@@ -756,7 +725,6 @@
 		};
 		515694B623F4A3D200E7C350 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = CB6479A86CC43D17D90F1E89 /* Pods-ServiceExtension.release.xcconfig */;
 			buildSettings = {
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Manual;

+ 33 - 33
Example/watchOSSample/SampleWatchAppWatchKitExtension/ExtensionDelegate.swift

@@ -15,50 +15,50 @@
 import WatchKit
 
 import FirebaseCore
-import FirebaseMessaging
-import FirebaseRemoteConfig
+//import FirebaseMessaging
+//import FirebaseRemoteConfig
 
 /// Entry point of the watch app.
-class ExtensionDelegate: NSObject, WKExtensionDelegate, MessagingDelegate {
+class ExtensionDelegate: NSObject, WKExtensionDelegate {
   /// Initialize Firebase service here.
   func applicationDidFinishLaunching() {
     FirebaseApp.configure()
-    let center = UNUserNotificationCenter.current()
-    center.requestAuthorization(options: [.alert, .sound]) { granted, _ in
-      if granted {
-        WKExtension.shared().registerForRemoteNotifications()
-      }
-    }
-    Messaging.messaging().delegate = self
-    let remoteConfig = RemoteConfig.remoteConfig()
-    remoteConfig.fetchAndActivate { _, error in
-      guard error == nil else {
-        print("error:" + error.debugDescription)
-        return
-      }
-      let defaultOutput = "You have not set up a 'test' key in Remote Config console."
-      let configValue: String =
-        remoteConfig["test"].stringValue ?? defaultOutput
-      print("value:\n" + configValue)
-    }
+//    let center = UNUserNotificationCenter.current()
+//    center.requestAuthorization(options: [.alert, .sound]) { granted, _ in
+//      if granted {
+//        WKExtension.shared().registerForRemoteNotifications()
+//      }
+//    }
+//    Messaging.messaging().delegate = self
+//    let remoteConfig = RemoteConfig.remoteConfig()
+//    remoteConfig.fetchAndActivate { _, error in
+//      guard error == nil else {
+//        print("error:" + error.debugDescription)
+//        return
+//      }
+//      let defaultOutput = "You have not set up a 'test' key in Remote Config console."
+//      let configValue: String =
+//        remoteConfig["test"].stringValue ?? defaultOutput
+//      print("value:\n" + configValue)
+//    }
   }
 
   /// MessagingDelegate
-  func messaging(_: Messaging, didReceiveRegistrationToken fcmToken: String?) {
-    print("token:\n" + fcmToken!)
-    Messaging.messaging().subscribe(toTopic: "watch") { error in
-      guard error == nil else {
-        print("error:" + error.debugDescription)
-        return
-      }
-      print("Successfully subscribed to topic")
-    }
-  }
+//  func messaging(_: Messaging, didReceiveRegistrationToken fcmToken: String?) {
+////    print("token:\n" + fcmToken!)
+////    Messaging.messaging().subscribe(toTopic: "watch") { error in
+////      guard error == nil else {
+////        print("error:" + error.debugDescription)
+////        return
+////      }
+////      print("Successfully subscribed to topic")
+////    }
+//  }
 
   /// WKExtensionDelegate
   func didRegisterForRemoteNotifications(withDeviceToken deviceToken: Data) {
     /// Swizzling should be disabled in Messaging for watchOS, set APNS token manually.
-    print("Set APNS Token\n")
-    Messaging.messaging().apnsToken = deviceToken
+//    print("Set APNS Token\n")
+//    Messaging.messaging().apnsToken = deviceToken
   }
 }

+ 6 - 6
Example/watchOSSample/SampleWatchAppWatchKitExtension/InterfaceController.swift

@@ -13,16 +13,16 @@
 // limitations under the License.
 
 import SwiftUI
-import FirebaseStorage
+//import FirebaseStorage
 
 class InterfaceController: WKInterfaceController {
   @IBOutlet var imageView: WKInterfaceImage!
 
   override func willActivate() {
-    let storage = Storage.storage()
-    let storageRef = storage.reference().child("sparky.png")
-    storageRef.getData(maxSize: 20 * 1024 * 1024) { (data: Data?, error: Error?) in
-      self.imageView.setImageData(data)
-    }
+//    let storage = Storage.storage()
+//    let storageRef = storage.reference().child("sparky.png")
+//    storageRef.getData(maxSize: 20 * 1024 * 1024) { (data: Data?, error: Error?) in
+//      self.imageView.setImageData(data)
+//    }
   }
 }

+ 3 - 3
Example/watchOSSample/ServiceExtension/NotificationService.swift

@@ -13,7 +13,7 @@
 // limitations under the License.
 
 import UserNotifications
-import FirebaseMessaging
+//import FirebaseMessaging
 
 class NotificationService: UNNotificationServiceExtension {
   var contentHandler: ((UNNotificationContent) -> Void)?
@@ -30,8 +30,8 @@ class NotificationService: UNNotificationServiceExtension {
       bestAttemptContent.title = "\(bestAttemptContent.title) 👩‍💻"
 
       // Add images
-      Messaging.serviceExtension()
-        .populateNotificationContent(bestAttemptContent, withContentHandler: self.contentHandler!)
+//      Messaging.serviceExtension()
+//        .populateNotificationContent(bestAttemptContent, withContentHandler: self.contentHandler!)
     }
   }
 

+ 36 - 0
Example/watchOSSample2/GoogleService-Info.plist

@@ -0,0 +1,36 @@
+<?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>CLIENT_ID</key>
+	<string>656090221777-glififklvhbr20qumojgt82v28nrlhgj.apps.googleusercontent.com</string>
+	<key>REVERSED_CLIENT_ID</key>
+	<string>com.googleusercontent.apps.656090221777-glififklvhbr20qumojgt82v28nrlhgj</string>
+	<key>API_KEY</key>
+	<string>AIzaSyA2hwDYE23H_Wp5FWUAsnE2ecMZXb8Q7WM</string>
+	<key>GCM_SENDER_ID</key>
+	<string>656090221777</string>
+	<key>PLIST_VERSION</key>
+	<string>1</string>
+	<key>BUNDLE_ID</key>
+	<string>com.watch.crashtest</string>
+	<key>PROJECT_ID</key>
+	<string>onboardingbash</string>
+	<key>STORAGE_BUCKET</key>
+	<string>onboardingbash.appspot.com</string>
+	<key>IS_ADS_ENABLED</key>
+	<false></false>
+	<key>IS_ANALYTICS_ENABLED</key>
+	<false></false>
+	<key>IS_APPINVITE_ENABLED</key>
+	<true></true>
+	<key>IS_GCM_ENABLED</key>
+	<true></true>
+	<key>IS_SIGNIN_ENABLED</key>
+	<true></true>
+	<key>GOOGLE_APP_ID</key>
+	<string>1:656090221777:ios:41f72c3e864028b485c9f0</string>
+	<key>DATABASE_URL</key>
+	<string>https://onboardingbash.firebaseio.com</string>
+</dict>
+</plist>

+ 8 - 0
Example/watchOSSample2/Podfile

@@ -0,0 +1,8 @@
+use_frameworks!
+platform :watchos, '7.0'
+pod 'Firebase/Crashlytics'
+target 'SampleWatchAppWatchKitExtension' do
+end
+
+target 'ServiceExtension' do
+end

+ 838 - 0
Example/watchOSSample2/SampleWatchApp.xcodeproj/project.pbxproj

@@ -0,0 +1,838 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 51;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		5156947923F4965000E7C350 /* SampleWatchAppWatchKitApp.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 5156947823F4965000E7C350 /* SampleWatchAppWatchKitApp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+		5156947F23F4965000E7C350 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5156947D23F4965000E7C350 /* Interface.storyboard */; };
+		5156948123F4965100E7C350 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5156948023F4965100E7C350 /* Assets.xcassets */; };
+		5156948823F4965100E7C350 /* SampleWatchAppWatchKitExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 5156948723F4965100E7C350 /* SampleWatchAppWatchKitExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+		5156948D23F4965100E7C350 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5156948C23F4965100E7C350 /* InterfaceController.swift */; };
+		5156948F23F4965100E7C350 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5156948E23F4965100E7C350 /* ExtensionDelegate.swift */; };
+		5156949123F4965100E7C350 /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5156949023F4965100E7C350 /* NotificationController.swift */; };
+		5156949323F4965100E7C350 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5156949223F4965100E7C350 /* ComplicationController.swift */; };
+		5156949523F4965200E7C350 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5156949423F4965200E7C350 /* Assets.xcassets */; };
+		515694AF23F4A3D200E7C350 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515694AE23F4A3D200E7C350 /* NotificationService.swift */; };
+		515694B323F4A3D200E7C350 /* ServiceExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 515694AC23F4A3D200E7C350 /* ServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+		ABE300CA2656D4DD00AC9D72 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABE300C92656D4DD00AC9D72 /* GoogleService-Info.plist */; };
+		ABE300CE2656D68200AC9D72 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABE300C92656D4DD00AC9D72 /* GoogleService-Info.plist */; };
+		ABE300CF2656D6D000AC9D72 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABE300C92656D4DD00AC9D72 /* GoogleService-Info.plist */; };
+		ABE300D02656D6D200AC9D72 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABE300C92656D4DD00AC9D72 /* GoogleService-Info.plist */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		5156947A23F4965000E7C350 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 5156946E23F4965000E7C350 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 5156947723F4965000E7C350;
+			remoteInfo = "SampleWatchApp WatchKit App";
+		};
+		5156948923F4965100E7C350 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 5156946E23F4965000E7C350 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 5156948623F4965100E7C350;
+			remoteInfo = "SampleWatchApp WatchKit Extension";
+		};
+		515694B123F4A3D200E7C350 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 5156946E23F4965000E7C350 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 515694AB23F4A3D200E7C350;
+			remoteInfo = ServiceExtension;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		5156949D23F4965200E7C350 /* Embed App Extensions */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 8;
+			dstPath = "";
+			dstSubfolderSpec = 13;
+			files = (
+				5156948823F4965100E7C350 /* SampleWatchAppWatchKitExtension.appex in Embed App Extensions */,
+			);
+			name = "Embed App Extensions";
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+		515694A123F4965200E7C350 /* Embed Watch Content */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
+			dstSubfolderSpec = 16;
+			files = (
+				5156947923F4965000E7C350 /* SampleWatchAppWatchKitApp.app in Embed Watch Content */,
+			);
+			name = "Embed Watch Content";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		515694B723F4A3D200E7C350 /* Embed App Extensions */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 13;
+			files = (
+				515694B323F4A3D200E7C350 /* ServiceExtension.appex in Embed App Extensions */,
+			);
+			name = "Embed App Extensions";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		3EBA935736290F9E72DB25FF /* Pods_ServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		5156947423F4965000E7C350 /* SampleWatchApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleWatchApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		5156947823F4965000E7C350 /* SampleWatchAppWatchKitApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleWatchAppWatchKitApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		5156947E23F4965000E7C350 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = "<group>"; };
+		5156948023F4965100E7C350 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		5156948223F4965100E7C350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		5156948723F4965100E7C350 /* SampleWatchAppWatchKitExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SampleWatchAppWatchKitExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
+		5156948C23F4965100E7C350 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = "<group>"; };
+		5156948E23F4965100E7C350 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
+		5156949023F4965100E7C350 /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = "<group>"; };
+		5156949223F4965100E7C350 /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = "<group>"; };
+		5156949423F4965200E7C350 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		5156949623F4965200E7C350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		5156949723F4965200E7C350 /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = "<group>"; };
+		515694A523F497E700E7C350 /* SampleWatchAppWatchKitExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SampleWatchAppWatchKitExtension.entitlements; sourceTree = "<group>"; };
+		515694AC23F4A3D200E7C350 /* ServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
+		515694AE23F4A3D200E7C350 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
+		515694B023F4A3D200E7C350 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		7FBA4340635BF194157452B9 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleWatchAppWatchKitExtension.release.xcconfig"; path = "Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension.release.xcconfig"; sourceTree = "<group>"; };
+		ABE300C92656D4DD00AC9D72 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
+		C0064A1E379E237E54A9086B /* Pods-ServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-ServiceExtension/Pods-ServiceExtension.debug.xcconfig"; sourceTree = "<group>"; };
+		CB6479A86CC43D17D90F1E89 /* Pods-ServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-ServiceExtension/Pods-ServiceExtension.release.xcconfig"; sourceTree = "<group>"; };
+		D6A1681F802CB688198BFE1E /* Pods_SampleWatchAppWatchKitExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SampleWatchAppWatchKitExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		DAE14C0BA7504E3EE4267A02 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SampleWatchAppWatchKitExtension.debug.xcconfig"; path = "Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension.debug.xcconfig"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		234E535ADBAFCD783D6057C7 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		5156948423F4965100E7C350 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		515694A923F4A3D200E7C350 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		C00F5EF1D57948C8492A37CA /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		203C8A236AE31151AAF474A5 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				D6A1681F802CB688198BFE1E /* Pods_SampleWatchAppWatchKitExtension.framework */,
+				3EBA935736290F9E72DB25FF /* Pods_ServiceExtension.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		5156946D23F4965000E7C350 = {
+			isa = PBXGroup;
+			children = (
+				ABE300C92656D4DD00AC9D72 /* GoogleService-Info.plist */,
+				5156947C23F4965000E7C350 /* SampleWatchAppWatchKitApp */,
+				5156948B23F4965100E7C350 /* SampleWatchAppWatchKitExtension */,
+				515694AD23F4A3D200E7C350 /* ServiceExtension */,
+				5156947523F4965000E7C350 /* Products */,
+				BD04909E80693ABDC7D720F6 /* Pods */,
+				203C8A236AE31151AAF474A5 /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		5156947523F4965000E7C350 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				5156947423F4965000E7C350 /* SampleWatchApp.app */,
+				5156947823F4965000E7C350 /* SampleWatchAppWatchKitApp.app */,
+				5156948723F4965100E7C350 /* SampleWatchAppWatchKitExtension.appex */,
+				515694AC23F4A3D200E7C350 /* ServiceExtension.appex */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		5156947C23F4965000E7C350 /* SampleWatchAppWatchKitApp */ = {
+			isa = PBXGroup;
+			children = (
+				5156947D23F4965000E7C350 /* Interface.storyboard */,
+				5156948023F4965100E7C350 /* Assets.xcassets */,
+				5156948223F4965100E7C350 /* Info.plist */,
+			);
+			path = SampleWatchAppWatchKitApp;
+			sourceTree = "<group>";
+		};
+		5156948B23F4965100E7C350 /* SampleWatchAppWatchKitExtension */ = {
+			isa = PBXGroup;
+			children = (
+				515694A523F497E700E7C350 /* SampleWatchAppWatchKitExtension.entitlements */,
+				5156948C23F4965100E7C350 /* InterfaceController.swift */,
+				5156948E23F4965100E7C350 /* ExtensionDelegate.swift */,
+				5156949023F4965100E7C350 /* NotificationController.swift */,
+				5156949223F4965100E7C350 /* ComplicationController.swift */,
+				5156949423F4965200E7C350 /* Assets.xcassets */,
+				5156949623F4965200E7C350 /* Info.plist */,
+				5156949723F4965200E7C350 /* PushNotificationPayload.apns */,
+			);
+			path = SampleWatchAppWatchKitExtension;
+			sourceTree = "<group>";
+		};
+		515694AD23F4A3D200E7C350 /* ServiceExtension */ = {
+			isa = PBXGroup;
+			children = (
+				515694AE23F4A3D200E7C350 /* NotificationService.swift */,
+				515694B023F4A3D200E7C350 /* Info.plist */,
+			);
+			path = ServiceExtension;
+			sourceTree = "<group>";
+		};
+		BD04909E80693ABDC7D720F6 /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				DAE14C0BA7504E3EE4267A02 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */,
+				7FBA4340635BF194157452B9 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */,
+				C0064A1E379E237E54A9086B /* Pods-ServiceExtension.debug.xcconfig */,
+				CB6479A86CC43D17D90F1E89 /* Pods-ServiceExtension.release.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		5156947323F4965000E7C350 /* SampleWatchApp */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 515694A223F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchApp" */;
+			buildPhases = (
+				5156947223F4965000E7C350 /* Resources */,
+				515694A123F4965200E7C350 /* Embed Watch Content */,
+				234E535ADBAFCD783D6057C7 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				5156947B23F4965000E7C350 /* PBXTargetDependency */,
+			);
+			name = SampleWatchApp;
+			productName = SampleWatchApp;
+			productReference = 5156947423F4965000E7C350 /* SampleWatchApp.app */;
+			productType = "com.apple.product-type.application.watchapp2-container";
+		};
+		5156947723F4965000E7C350 /* SampleWatchAppWatchKitApp */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 5156949E23F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchAppWatchKitApp" */;
+			buildPhases = (
+				5156947623F4965000E7C350 /* Resources */,
+				5156949D23F4965200E7C350 /* Embed App Extensions */,
+				C00F5EF1D57948C8492A37CA /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				5156948A23F4965100E7C350 /* PBXTargetDependency */,
+			);
+			name = SampleWatchAppWatchKitApp;
+			productName = "SampleWatchApp WatchKit App";
+			productReference = 5156947823F4965000E7C350 /* SampleWatchAppWatchKitApp.app */;
+			productType = "com.apple.product-type.application.watchapp2";
+		};
+		5156948623F4965100E7C350 /* SampleWatchAppWatchKitExtension */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 5156949A23F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchAppWatchKitExtension" */;
+			buildPhases = (
+				E5B1B049432440CF1A70B29A /* [CP] Check Pods Manifest.lock */,
+				5156948323F4965100E7C350 /* Sources */,
+				5156948423F4965100E7C350 /* Frameworks */,
+				5156948523F4965100E7C350 /* Resources */,
+				515694B723F4A3D200E7C350 /* Embed App Extensions */,
+				1AC64D8D8CEC350A7BE652AA /* [CP] Embed Pods Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				515694B223F4A3D200E7C350 /* PBXTargetDependency */,
+			);
+			name = SampleWatchAppWatchKitExtension;
+			productName = "SampleWatchApp WatchKit Extension";
+			productReference = 5156948723F4965100E7C350 /* SampleWatchAppWatchKitExtension.appex */;
+			productType = "com.apple.product-type.watchkit2-extension";
+		};
+		515694AB23F4A3D200E7C350 /* ServiceExtension */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 515694B423F4A3D200E7C350 /* Build configuration list for PBXNativeTarget "ServiceExtension" */;
+			buildPhases = (
+				36BFC0F6A337B1157B6D7C11 /* [CP] Check Pods Manifest.lock */,
+				515694A823F4A3D200E7C350 /* Sources */,
+				515694A923F4A3D200E7C350 /* Frameworks */,
+				515694AA23F4A3D200E7C350 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = ServiceExtension;
+			productName = ServiceExtension;
+			productReference = 515694AC23F4A3D200E7C350 /* ServiceExtension.appex */;
+			productType = "com.apple.product-type.app-extension";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		5156946E23F4965000E7C350 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastSwiftUpdateCheck = 1120;
+				LastUpgradeCheck = 1120;
+				ORGANIZATIONNAME = "Google, Inc";
+				TargetAttributes = {
+					5156947323F4965000E7C350 = {
+						CreatedOnToolsVersion = 11.2.1;
+					};
+					5156947723F4965000E7C350 = {
+						CreatedOnToolsVersion = 11.2.1;
+					};
+					5156948623F4965100E7C350 = {
+						CreatedOnToolsVersion = 11.2.1;
+					};
+					515694AB23F4A3D200E7C350 = {
+						CreatedOnToolsVersion = 11.2.1;
+					};
+				};
+			};
+			buildConfigurationList = 5156947123F4965000E7C350 /* Build configuration list for PBXProject "SampleWatchApp" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 5156946D23F4965000E7C350;
+			productRefGroup = 5156947523F4965000E7C350 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				5156947323F4965000E7C350 /* SampleWatchApp */,
+				5156947723F4965000E7C350 /* SampleWatchAppWatchKitApp */,
+				5156948623F4965100E7C350 /* SampleWatchAppWatchKitExtension */,
+				515694AB23F4A3D200E7C350 /* ServiceExtension */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		5156947223F4965000E7C350 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				ABE300CA2656D4DD00AC9D72 /* GoogleService-Info.plist in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		5156947623F4965000E7C350 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5156948123F4965100E7C350 /* Assets.xcassets in Resources */,
+				5156947F23F4965000E7C350 /* Interface.storyboard in Resources */,
+				ABE300CE2656D68200AC9D72 /* GoogleService-Info.plist in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		5156948523F4965100E7C350 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5156949523F4965200E7C350 /* Assets.xcassets in Resources */,
+				ABE300CF2656D6D000AC9D72 /* GoogleService-Info.plist in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		515694AA23F4A3D200E7C350 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				ABE300D02656D6D200AC9D72 /* GoogleService-Info.plist in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		1AC64D8D8CEC350A7BE652AA /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SampleWatchAppWatchKitExtension/Pods-SampleWatchAppWatchKitExtension-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		36BFC0F6A337B1157B6D7C11 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-ServiceExtension-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		E5B1B049432440CF1A70B29A /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-SampleWatchAppWatchKitExtension-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		5156948323F4965100E7C350 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5156949123F4965100E7C350 /* NotificationController.swift in Sources */,
+				5156949323F4965100E7C350 /* ComplicationController.swift in Sources */,
+				5156948F23F4965100E7C350 /* ExtensionDelegate.swift in Sources */,
+				5156948D23F4965100E7C350 /* InterfaceController.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		515694A823F4A3D200E7C350 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				515694AF23F4A3D200E7C350 /* NotificationService.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		5156947B23F4965000E7C350 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 5156947723F4965000E7C350 /* SampleWatchAppWatchKitApp */;
+			targetProxy = 5156947A23F4965000E7C350 /* PBXContainerItemProxy */;
+		};
+		5156948A23F4965100E7C350 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 5156948623F4965100E7C350 /* SampleWatchAppWatchKitExtension */;
+			targetProxy = 5156948923F4965100E7C350 /* PBXContainerItemProxy */;
+		};
+		515694B223F4A3D200E7C350 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 515694AB23F4A3D200E7C350 /* ServiceExtension */;
+			targetProxy = 515694B123F4A3D200E7C350 /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		5156947D23F4965000E7C350 /* Interface.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				5156947E23F4965000E7C350 /* Base */,
+			);
+			name = Interface.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		5156949823F4965200E7C350 /* 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++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				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;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		5156949923F4965200E7C350 /* 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++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				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;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		5156949B23F4965200E7C350 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = DAE14C0BA7504E3EE4267A02 /* Pods-SampleWatchAppWatchKitExtension.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
+				CODE_SIGN_ENTITLEMENTS = SampleWatchAppWatchKitExtension/SampleWatchAppWatchKitExtension.entitlements;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				DEVELOPMENT_TEAM = "";
+				INFOPLIST_FILE = SampleWatchAppWatchKitExtension/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@executable_path/../../Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest;
+				PRODUCT_NAME = "${TARGET_NAME}";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 6.1;
+			};
+			name = Debug;
+		};
+		5156949C23F4965200E7C350 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7FBA4340635BF194157452B9 /* Pods-SampleWatchAppWatchKitExtension.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
+				CODE_SIGN_ENTITLEMENTS = SampleWatchAppWatchKitExtension/SampleWatchAppWatchKitExtension.entitlements;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				DEVELOPMENT_TEAM = "";
+				INFOPLIST_FILE = SampleWatchAppWatchKitExtension/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@executable_path/../../Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest;
+				PRODUCT_NAME = "${TARGET_NAME}";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 6.1;
+			};
+			name = Release;
+		};
+		5156949F23F4965200E7C350 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				DEVELOPMENT_TEAM = "";
+				IBSC_MODULE = SampleWatchAppWatchKitExtension;
+				INFOPLIST_FILE = SampleWatchAppWatchKitApp/Info.plist;
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest.watchkit;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 6.1;
+			};
+			name = Debug;
+		};
+		515694A023F4965200E7C350 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				DEVELOPMENT_TEAM = "";
+				IBSC_MODULE = SampleWatchAppWatchKitExtension;
+				INFOPLIST_FILE = SampleWatchAppWatchKitApp/Info.plist;
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest.watchkit;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 6.1;
+			};
+			name = Release;
+		};
+		515694A323F4965200E7C350 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_TEAM = "";
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Debug;
+		};
+		515694A423F4965200E7C350 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_TEAM = "";
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SWIFT_VERSION = 5.0;
+			};
+			name = Release;
+		};
+		515694B523F4A3D200E7C350 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = C0064A1E379E237E54A9086B /* Pods-ServiceExtension.debug.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				DEVELOPMENT_TEAM = "";
+				INFOPLIST_FILE = ServiceExtension/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@executable_path/../../Frameworks",
+					"@executable_path/../../../../Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 6.1;
+			};
+			name = Debug;
+		};
+		515694B623F4A3D200E7C350 /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = CB6479A86CC43D17D90F1E89 /* Pods-ServiceExtension.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Manual;
+				DEVELOPMENT_TEAM = "";
+				INFOPLIST_FILE = ServiceExtension/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@executable_path/../../Frameworks",
+					"@executable_path/../../../../Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.watch.crashtest;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = watchos;
+				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = 4;
+				WATCHOS_DEPLOYMENT_TARGET = 6.1;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		5156947123F4965000E7C350 /* Build configuration list for PBXProject "SampleWatchApp" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				5156949823F4965200E7C350 /* Debug */,
+				5156949923F4965200E7C350 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		5156949A23F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchAppWatchKitExtension" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				5156949B23F4965200E7C350 /* Debug */,
+				5156949C23F4965200E7C350 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		5156949E23F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchAppWatchKitApp" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				5156949F23F4965200E7C350 /* Debug */,
+				515694A023F4965200E7C350 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		515694A223F4965200E7C350 /* Build configuration list for PBXNativeTarget "SampleWatchApp" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				515694A323F4965200E7C350 /* Debug */,
+				515694A423F4965200E7C350 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		515694B423F4A3D200E7C350 /* Build configuration list for PBXNativeTarget "ServiceExtension" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				515694B523F4A3D200E7C350 /* Debug */,
+				515694B623F4A3D200E7C350 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 5156946E23F4965000E7C350 /* Project object */;
+}

+ 81 - 0
Example/watchOSSample2/SampleWatchAppWatchKitApp/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,81 @@
+{
+  "images" : [
+    {
+      "size" : "24x24",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "notificationCenter",
+      "subtype" : "38mm"
+    },
+    {
+      "size" : "27.5x27.5",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "notificationCenter",
+      "subtype" : "42mm"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "watch",
+      "role" : "companionSettings",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "watch",
+      "role" : "companionSettings",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "appLauncher",
+      "subtype" : "38mm"
+    },
+    {
+      "size" : "44x44",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "appLauncher",
+      "subtype" : "40mm"
+    },
+    {
+      "size" : "50x50",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "appLauncher",
+      "subtype" : "44mm"
+    },
+    {
+      "size" : "86x86",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "quickLook",
+      "subtype" : "38mm"
+    },
+    {
+      "size" : "98x98",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "quickLook",
+      "subtype" : "42mm"
+    },
+    {
+      "size" : "108x108",
+      "idiom" : "watch",
+      "scale" : "2x",
+      "role" : "quickLook",
+      "subtype" : "44mm"
+    },
+    {
+      "idiom" : "watch-marketing",
+      "size" : "1024x1024",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 6 - 0
Example/watchOSSample2/SampleWatchAppWatchKitApp/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 56 - 0
Example/watchOSSample2/SampleWatchAppWatchKitApp/Base.lproj/Interface.storyboard

@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="18122" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="AgC-eL-Hgc">
+    <device id="watch38"/>
+    <dependencies>
+        <deployment identifier="watchOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18092"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="18022"/>
+    </dependencies>
+    <scenes>
+        <!--Interface Controller-->
+        <scene sceneID="aou-V4-d1y">
+            <objects>
+                <controller id="AgC-eL-Hgc" customClass="InterfaceController" customModule="SampleWatchAppWatchKitApp" customModuleProvider="target">
+                    <items>
+                        <imageView width="64" height="60" alignment="left" id="Rhr-bM-Kmk"/>
+                    </items>
+                    <connections>
+                        <outlet property="imageView" destination="Rhr-bM-Kmk" id="4OY-nE-HIh"/>
+                    </connections>
+                </controller>
+            </objects>
+            <point key="canvasLocation" x="220" y="345"/>
+        </scene>
+        <!--Static Notification Interface Controller-->
+        <scene sceneID="AEw-b0-oYE">
+            <objects>
+                <notificationController id="YCC-NB-fut">
+                    <items>
+                        <label alignment="left" text="Alert Label" numberOfLines="0" id="IdU-wH-bcW"/>
+                    </items>
+                    <notificationCategory key="notificationCategory" identifier="myCategory" id="JfB-70-Muf"/>
+                    <connections>
+                        <outlet property="notificationAlertLabel" destination="IdU-wH-bcW" id="JKC-fr-R95"/>
+                        <segue destination="4sK-HA-Art" kind="relationship" relationship="dynamicNotificationInterface" id="kXh-Jw-8B1"/>
+                        <segue destination="eXb-UN-Cd0" kind="relationship" relationship="dynamicInteractiveNotificationInterface" id="mpB-YA-K8N"/>
+                    </connections>
+                </notificationController>
+            </objects>
+            <point key="canvasLocation" x="220" y="643"/>
+        </scene>
+        <!--Notification Controller-->
+        <scene sceneID="ZPc-GJ-vnh">
+            <objects>
+                <controller id="4sK-HA-Art" customClass="NotificationController" customModule="SampleWatchAppWatchKitApp" customModuleProvider="target"/>
+            </objects>
+            <point key="canvasLocation" x="468" y="643"/>
+        </scene>
+        <!--Notification Controller-->
+        <scene sceneID="Niz-AI-uX2">
+            <objects>
+                <controller id="eXb-UN-Cd0" customClass="NotificationController" customModule="SampleWatchAppWatchKitApp" customModuleProvider="target"/>
+            </objects>
+            <point key="canvasLocation" x="468" y="345"/>
+        </scene>
+    </scenes>
+</document>

+ 31 - 0
Example/watchOSSample2/SampleWatchAppWatchKitApp/Info.plist

@@ -0,0 +1,31 @@
+<?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>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleDisplayName</key>
+	<string>SampleWatchAppWatchKitApp</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>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+	</array>
+	<key>WKWatchKitApp</key>
+	<true/>
+</dict>
+</plist>

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 53 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Contents.json

@@ -0,0 +1,53 @@
+{
+  "assets" : [
+    {
+      "filename" : "Circular.imageset",
+      "idiom" : "watch",
+      "role" : "circular"
+    },
+    {
+      "filename" : "Extra Large.imageset",
+      "idiom" : "watch",
+      "role" : "extra-large"
+    },
+    {
+      "filename" : "Graphic Bezel.imageset",
+      "idiom" : "watch",
+      "role" : "graphic-bezel"
+    },
+    {
+      "filename" : "Graphic Circular.imageset",
+      "idiom" : "watch",
+      "role" : "graphic-circular"
+    },
+    {
+      "filename" : "Graphic Corner.imageset",
+      "idiom" : "watch",
+      "role" : "graphic-corner"
+    },
+    {
+      "filename" : "Graphic Extra Large.imageset",
+      "idiom" : "watch",
+      "role" : "graphic-extra-large"
+    },
+    {
+      "filename" : "Graphic Large Rectangular.imageset",
+      "idiom" : "watch",
+      "role" : "graphic-large-rectangular"
+    },
+    {
+      "filename" : "Modular.imageset",
+      "idiom" : "watch",
+      "role" : "modular"
+    },
+    {
+      "filename" : "Utilitarian.imageset",
+      "idiom" : "watch",
+      "role" : "utilitarian"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 28 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json

@@ -0,0 +1,28 @@
+{
+  "images" : [
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : "<=145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">161"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">145"
+    },
+    {
+      "idiom" : "watch",
+      "scale" : "2x",
+      "screen-width" : ">183"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 6 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

+ 76 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/ComplicationController.swift

@@ -0,0 +1,76 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import ClockKit
+
+class ComplicationController: NSObject, CLKComplicationDataSource {
+  // MARK: - Timeline Configuration
+
+  func getSupportedTimeTravelDirections(for complication: CLKComplication,
+                                        withHandler handler: @escaping (CLKComplicationTimeTravelDirections)
+                                          -> Void) {
+    handler([.forward, .backward])
+  }
+
+  func getTimelineStartDate(for complication: CLKComplication,
+                            withHandler handler: @escaping (Date?) -> Void) {
+    handler(nil)
+  }
+
+  func getTimelineEndDate(for complication: CLKComplication,
+                          withHandler handler: @escaping (Date?) -> Void) {
+    handler(nil)
+  }
+
+  func getPrivacyBehavior(for complication: CLKComplication,
+                          withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) {
+    handler(.showOnLockScreen)
+  }
+
+  // MARK: - Timeline Population
+
+  func getCurrentTimelineEntry(for complication: CLKComplication,
+                               withHandler handler: @escaping (CLKComplicationTimelineEntry?)
+                                 -> Void) {
+    // Call the handler with the current timeline entry
+    handler(nil)
+  }
+
+  func getTimelineEntries(for complication: CLKComplication,
+                          before date: Date,
+                          limit: Int,
+                          withHandler handler: @escaping ([CLKComplicationTimelineEntry]?)
+                            -> Void) {
+    // Call the handler with the timeline entries prior to the given date
+    handler(nil)
+  }
+
+  func getTimelineEntries(for complication: CLKComplication,
+                          after date: Date,
+                          limit: Int,
+                          withHandler handler: @escaping ([CLKComplicationTimelineEntry]?)
+                            -> Void) {
+    // Call the handler with the timeline entries after to the given date
+    handler(nil)
+  }
+
+  // MARK: - Placeholder Templates
+
+  func getLocalizableSampleTemplate(for complication: CLKComplication,
+                                    withHandler handler: @escaping (CLKComplicationTemplate?)
+                                      -> Void) {
+    // This method will be called once per supported complication, and the results will be cached
+    handler(nil)
+  }
+}

+ 25 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/ExtensionDelegate.swift

@@ -0,0 +1,25 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import WatchKit
+
+import FirebaseCore
+
+/// Entry point of the watch app.
+class ExtensionDelegate: NSObject, WKExtensionDelegate {
+  /// Initialize Firebase service here.
+  func applicationDidFinishLaunching() {
+    FirebaseApp.configure()
+    }
+}

+ 56 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/Info.plist

@@ -0,0 +1,56 @@
+<?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>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleDisplayName</key>
+	<string>SampleWatchAppWatchKitExtension</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>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>CLKComplicationPrincipalClass</key>
+	<string>$(PRODUCT_MODULE_NAME).ComplicationController</string>
+	<key>CLKComplicationSupportedFamilies</key>
+	<array>
+		<string>CLKComplicationFamilyModularSmall</string>
+		<string>CLKComplicationFamilyModularLarge</string>
+		<string>CLKComplicationFamilyUtilitarianSmall</string>
+		<string>CLKComplicationFamilyUtilitarianSmallFlat</string>
+		<string>CLKComplicationFamilyUtilitarianLarge</string>
+		<string>CLKComplicationFamilyCircularSmall</string>
+		<string>CLKComplicationFamilyExtraLarge</string>
+		<string>CLKComplicationFamilyGraphicCorner</string>
+		<string>CLKComplicationFamilyGraphicBezel</string>
+		<string>CLKComplicationFamilyGraphicCircular</string>
+		<string>CLKComplicationFamilyGraphicRectangular</string>
+	</array>
+	<key>FirebaseAppDelegateProxyEnabled</key>
+	<false/>
+	<key>NSExtension</key>
+	<dict>
+		<key>NSExtensionAttributes</key>
+		<dict>
+			<key>WKAppBundleIdentifier</key>
+			<string>com.google.firebase.extensions.dev.WatchKitApp</string>
+		</dict>
+		<key>NSExtensionPointIdentifier</key>
+		<string>com.apple.watchkit</string>
+	</dict>
+	<key>WKExtensionDelegateClassName</key>
+	<string>$(PRODUCT_MODULE_NAME).ExtensionDelegate</string>
+	<key>WKWatchOnly</key>
+	<true/>
+</dict>
+</plist>

+ 23 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/InterfaceController.swift

@@ -0,0 +1,23 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import SwiftUI
+
+class InterfaceController: WKInterfaceController {
+  @IBOutlet var imageView: WKInterfaceImage!
+
+  override func willActivate() {
+   
+  }
+}

+ 42 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/NotificationController.swift

@@ -0,0 +1,42 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import WatchKit
+import Foundation
+import UserNotifications
+
+class NotificationController: WKUserNotificationInterfaceController {
+  override init() {
+    // Initialize variables here.
+    super.init()
+
+    // Configure interface objects here.
+  }
+
+  override func willActivate() {
+    // This method is called when watch view controller is about to be visible to user
+    super.willActivate()
+  }
+
+  override func didDeactivate() {
+    // This method is called when watch view controller is no longer visible
+    super.didDeactivate()
+  }
+
+  override func didReceive(_ notification: UNNotification) {
+    // This method is called when a notification needs to be presented.
+    // Implement it if you use a dynamic notification interface.
+    // Populate your dynamic notification interface as quickly as possible.
+  }
+}

+ 20 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/PushNotificationPayload.apns

@@ -0,0 +1,20 @@
+{
+    "aps": {
+        "alert": {
+            "body": "Test message",
+            "title": "Optional title",
+            "subtitle": "Optional subtitle"
+        },
+        "category": "myCategory",
+        "thread-id": "5280"
+    },
+
+    "WatchKit Simulator Actions": [
+        {
+            "title": "First Button",
+            "identifier": "firstButtonAction"
+        }
+    ],
+
+    "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App."
+}

+ 8 - 0
Example/watchOSSample2/SampleWatchAppWatchKitExtension/SampleWatchAppWatchKitExtension.entitlements

@@ -0,0 +1,8 @@
+<?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>aps-environment</key>
+	<string>development</string>
+</dict>
+</plist>

+ 31 - 0
Example/watchOSSample2/ServiceExtension/Info.plist

@@ -0,0 +1,31 @@
+<?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>$(DEVELOPMENT_LANGUAGE)</string>
+	<key>CFBundleDisplayName</key>
+	<string>ServiceExtension</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>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>NSExtension</key>
+	<dict>
+		<key>NSExtensionPointIdentifier</key>
+		<string>com.apple.usernotifications.service</string>
+		<key>NSExtensionPrincipalClass</key>
+		<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
+	</dict>
+</dict>
+</plist>

+ 44 - 0
Example/watchOSSample2/ServiceExtension/NotificationService.swift

@@ -0,0 +1,44 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import UserNotifications
+import FirebaseCrashlytics
+
+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) 👩‍💻"
+
+      // Add images
+      
+    }
+  }
+
+  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)
+    }
+  }
+}