├── .gitignore ├── Widget Extension ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── WidgetBackground.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist └── Bundle.swift ├── iOS App ├── Resources │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── Base.lproj │ │ └── LaunchScreen.storyboard ├── SceneDelegate.swift ├── AppDelegate.swift ├── ActivityAttributes.swift ├── ViewController.swift └── LiveActivityService.swift ├── Live Activity Example.xcodeproj ├── project.xcworkspace │ ├── xcuserdata │ │ └── ivanvorobei.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ └── ivanvorobei.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── xcshareddata │ └── xcschemes │ │ ├── iOS App.xcscheme │ │ └── Widget Extension.xcscheme └── project.pbxproj ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS Files 2 | .DS_Store 3 | .Trashes 4 | 5 | # Swift Package Manager 6 | .swiftpm 7 | -------------------------------------------------------------------------------- /Widget Extension/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /iOS App/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Widget Extension/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /iOS App/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Widget Extension/Assets.xcassets/WidgetBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparrowcode/live-activity-example/HEAD/Live Activity Example.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Widget Extension/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /iOS App/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Widget Extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSExtension 6 | 7 | NSExtensionPointIdentifier 8 | com.apple.widgetkit-extension 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/xcuserdata/ivanvorobei.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Widget Extension.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 1 11 | 12 | iOS App.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /iOS App/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 4 | 5 | var window: UIWindow? 6 | 7 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 8 | guard let scene = (scene as? UIWindowScene) else { return } 9 | window = UIWindow(frame: scene.coordinateSpace.bounds) 10 | window?.windowScene = scene 11 | window?.tintColor = .systemBlue 12 | window?.rootViewController = UINavigationController(rootViewController: ViewController()) 13 | window?.makeKeyAndVisible() 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /iOS App/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import ActivityKit 3 | 4 | @main 5 | class AppDelegate: UIResponder, UIApplicationDelegate { 6 | 7 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 8 | return true 9 | } 10 | 11 | // MARK: UISceneSession Lifecycle 12 | 13 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 14 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /iOS App/ActivityAttributes.swift: -------------------------------------------------------------------------------- 1 | import ActivityKit 2 | 3 | // Shared Attribute-model between main target and widget targe 4 | 5 | struct ActivityAttribute: ActivityAttributes { 6 | 7 | public struct ContentState: Codable, Hashable { 8 | 9 | // Dynamic properties. 10 | // Can be updated when Live Actvity created. 11 | 12 | var dynamicStringValue: String 13 | var dynamicIntValue: Int 14 | var dynamicBoolValue: Bool 15 | 16 | } 17 | 18 | // Static properties. 19 | // Used only when make live actvity. 20 | // Can't update it later. 21 | 22 | var staticStringValue: String 23 | var staticIntValue: Int 24 | var staticBoolValue: Bool 25 | } 26 | -------------------------------------------------------------------------------- /iOS App/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | $(PRODUCT_MODULE_NAME).SceneDelegate 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Sparrow Code 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /iOS App/Resources/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /iOS App/ViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class ViewController: UIViewController { 4 | 5 | override func viewDidLoad() { 6 | super.viewDidLoad() 7 | navigationItem.title = "Dynamic Island Example" 8 | view.backgroundColor = .systemBackground 9 | 10 | let appearance = UIToolbarAppearance() 11 | appearance.configureWithOpaqueBackground() 12 | navigationController?.toolbar.standardAppearance = appearance 13 | navigationController?.toolbar.scrollEdgeAppearance = appearance 14 | 15 | navigationController?.isToolbarHidden = false 16 | self.toolbarItems = [ 17 | UIBarButtonItem(systemItem: .flexibleSpace), 18 | UIBarButtonItem(image: .init(systemName: "play.fill")!, style: .done, target: self, action: #selector(makeLiveActivity)), 19 | UIBarButtonItem(systemItem: .flexibleSpace), 20 | UIBarButtonItem(title: "Update Value", style: .done, target: self, action: #selector(updateLiveActivity)), 21 | UIBarButtonItem(systemItem: .flexibleSpace), 22 | UIBarButtonItem(image: .init(systemName: "stop.fill")!, style: .done, target: self, action: #selector(stopAllLiveActivities)), 23 | UIBarButtonItem(systemItem: .flexibleSpace) 24 | ] 25 | } 26 | 27 | @objc func makeLiveActivity() { 28 | LiveActivityService.makeActivity(value: "Init Value") 29 | } 30 | 31 | @objc func updateLiveActivity() { 32 | if let first = LiveActivityService.activities.first { 33 | LiveActivityService.updateActivity(first, value: "New \(Int.random(in: 1...1000))") 34 | } 35 | } 36 | 37 | @objc func stopAllLiveActivities() { 38 | for actvity in LiveActivityService.activities { 39 | LiveActivityService.endActivity(actvity) 40 | } 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://cdn.sparrowcode.io/tutorials/live-activities/live-activity-type-compact.png) 2 | 3 | # Live Activity Example 4 | 5 | Example how to make, update and end Live Activity. With Dynamic Island and Lock Screen.
6 | **Full tutorial available at [sparrowcode.io](https://sparrowcode.io/tutorials/live-activities)**. 7 | 8 | Live Activity already enabled for upload with Xcode 14.1 RC. 9 | 10 | > **Note** 11 | > Supported only for iOS >=16.1 12 | 13 | ## Preparing Project 14 | 15 | Add Widget target: 16 | 17 | 18 | 19 | Or skip it if already supporting widgets. Next add to `Info.plist` key `Supports Live Activities` to true: 20 | 21 | ``` 22 | NSSupportsLiveActivities 23 | 24 | ``` 25 | 26 | ## Define Model 27 | 28 | Define model-data. There is dynamic and static properties. Dynamic can be updated in time and make changes in UI. Static using only for launch Live Activity. 29 | 30 | ```swift 31 | struct ActivityAttribute: ActivityAttributes { 32 | 33 | public struct ContentState: Codable, Hashable { 34 | 35 | // Dynamic properties. 36 | // Can be updated when Live Actvity created. 37 | 38 | var dynamicStringValue: String 39 | var dynamicIntValue: Int 40 | var dynamicBoolValue: Bool 41 | 42 | } 43 | 44 | // Static properties. 45 | // Used only when make live actvity. 46 | // Can't update it later. 47 | 48 | var staticStringValue: String 49 | var staticIntValue: Int 50 | var staticBoolValue: Bool 51 | } 52 | ``` 53 | 54 | ## Add UI 55 | 56 | Define `Widget` wrapper: 57 | 58 | ```swift 59 | struct LiveActivityWidget: Widget { 60 | 61 | let kind: String = "LiveActivityWidget" 62 | 63 | var body: some WidgetConfiguration { 64 | ActivityConfiguration(for: ActivityAttribute.self) { context in 65 | // UI for lock screen 66 | } dynamicIsland: { context in 67 | // UI for Dynamic Island 68 | } 69 | } 70 | } 71 | ``` 72 | -------------------------------------------------------------------------------- /Widget Extension/Bundle.swift: -------------------------------------------------------------------------------- 1 | import WidgetKit 2 | import SwiftUI 3 | 4 | @main 5 | struct LiveActivityBundle: WidgetBundle { 6 | 7 | var body: some Widget { 8 | LiveActivityWidget() 9 | // You can define here other widgets 10 | } 11 | } 12 | 13 | struct LiveActivityWidget: Widget { 14 | 15 | let kind: String = "LiveActivityWidget" 16 | 17 | var body: some WidgetConfiguration { 18 | ActivityConfiguration(for: ActivityAttribute.self) { context in 19 | Text("Lock Screen value: \(context.state.dynamicStringValue)") 20 | .padding() 21 | } dynamicIsland: { context in 22 | DynamicIsland { 23 | DynamicIslandExpandedRegion(.leading) { 24 | Text("L: \(context.state.dynamicStringValue)" ) 25 | .foregroundColor(.secondary) 26 | // If you want extend leading area, use this: 27 | //.dynamicIsland(verticalPlacement: .belowIfTooWide) 28 | } 29 | DynamicIslandExpandedRegion(.trailing) { 30 | Text("R: \(context.attributes.staticStringValue)") 31 | .foregroundColor(.secondary) 32 | // If you want extend trailing area, use this: 33 | //.dynamicIsland(verticalPlacement: .belowIfTooWide) 34 | } 35 | DynamicIslandExpandedRegion(.center) { 36 | Text(context.state.dynamicStringValue) 37 | .fontWeight(.semibold) 38 | } 39 | DynamicIslandExpandedRegion(.bottom) { 40 | Text("Bottom") 41 | .foregroundColor(.secondary) 42 | } 43 | } compactLeading: { 44 | Text("L: \(context.state.dynamicStringValue)" ) 45 | } compactTrailing: { 46 | Text("R: \(context.attributes.staticStringValue)") 47 | } minimal: { 48 | Text("Min") 49 | } 50 | .keylineTint(.white) 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/xcshareddata/xcschemes/iOS App.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /iOS App/LiveActivityService.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import ActivityKit 3 | 4 | enum LiveActivityService { 5 | 6 | /** 7 | Check if available to make new actviity. 8 | 9 | Also can observe state dynamicly. 10 | 11 | If not available to make new Live Activity, this may be reason: 12 | 1. User lock Live Activity for application. 13 | 2. Reached limit of Live Activities for system. 14 | */ 15 | static var isEnabled: Bool { 16 | return ActivityAuthorizationInfo().areActivitiesEnabled 17 | 18 | // For observe state dynamicly 19 | /* 20 | for await enabled in ActivityAuthorizationInfo().activityEnablementUpdates { 21 | // Your Code 22 | } 23 | */ 24 | } 25 | 26 | /** 27 | Get list all created activities. 28 | */ 29 | static var activities: [Activity] { 30 | return Activity.activities 31 | } 32 | 33 | /** 34 | Make new activity. 35 | */ 36 | static func makeActivity(value: String) { 37 | guard isEnabled else { return } 38 | 39 | // Using only when make new Live Activity 40 | let attributes = ActivityAttribute(staticStringValue: "Static", staticIntValue: 1, staticBoolValue: true) 41 | 42 | // Can be used for update Live activity later with other values 43 | let contentState = ActivityAttribute.ContentState(dynamicStringValue: value, dynamicIntValue: 2, dynamicBoolValue: true) 44 | 45 | do { 46 | let activity = try Activity.request( 47 | attributes: attributes, 48 | contentState: contentState 49 | ) 50 | 51 | // For update by pushes you must have token 52 | // activity.pushToken 53 | 54 | print("LiveActivityService: \(activity.id) Live Activity created.") 55 | } catch { 56 | 57 | // You must to handle errors. It may happen: 58 | // 1. User lock Live Activity for application. 59 | // 2. Reached limit of Live Activities for system. 60 | print("LiveActivityService: Error when make new Live Activity: \(error.localizedDescription).") 61 | } 62 | } 63 | 64 | /** 65 | Update actviity. 66 | */ 67 | static func updateActivity(_ activity: Activity, value: String) { 68 | 69 | // We can update only with `ContentState`. 70 | let contentState = ActivityAttribute.ContentState(dynamicStringValue: value, dynamicIntValue: 2, dynamicBoolValue: true) 71 | Task { 72 | await activity.update(using: contentState) 73 | } 74 | } 75 | 76 | /** 77 | End activity. 78 | */ 79 | static func endActivity(_ activity: Activity) { 80 | 81 | // 1. For close Live Activity immediate. 82 | // It close Live Activity right now. 83 | Task { 84 | await activity.end(dismissalPolicy: .immediate) 85 | } 86 | 87 | /* 88 | // 2. If you want show user some action completed. 89 | // Live Activity closed when user saw it or maximum in 4 hours by system. 90 | let contentState = ActivityAttribute.ContentState(dynamicStringValue: "Finished", dynamicIntValue: 2, dynamicBoolValue: true) 91 | Task { 92 | await activity.end(using: contentState, dismissalPolicy: .default) 93 | } 94 | */ 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/xcshareddata/xcschemes/Widget Extension.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 16 | 22 | 23 | 24 | 30 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 60 | 62 | 68 | 69 | 70 | 71 | 75 | 76 | 80 | 81 | 85 | 86 | 87 | 88 | 96 | 98 | 104 | 105 | 106 | 107 | 109 | 110 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /Live Activity Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F43E05D229029910000CE0C0 /* LiveActivityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F43E05D129029910000CE0C0 /* LiveActivityService.swift */; }; 11 | F43E05D529029CF7000CE0C0 /* LiveActivityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F43E05D129029910000CE0C0 /* LiveActivityService.swift */; }; 12 | F45A56F328EDB6CF00520A8B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F45A56F228EDB6CF00520A8B /* AppDelegate.swift */; }; 13 | F45A56F528EDB6CF00520A8B /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F45A56F428EDB6CF00520A8B /* SceneDelegate.swift */; }; 14 | F45A56F728EDB6CF00520A8B /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F45A56F628EDB6CF00520A8B /* ViewController.swift */; }; 15 | F45A56FC28EDB6CF00520A8B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F45A56FB28EDB6CF00520A8B /* Assets.xcassets */; }; 16 | F45A56FF28EDB6D000520A8B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F45A56FD28EDB6D000520A8B /* LaunchScreen.storyboard */; }; 17 | F45A570D28EDB70400520A8B /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F45A570C28EDB70400520A8B /* WidgetKit.framework */; }; 18 | F45A570F28EDB70400520A8B /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F45A570E28EDB70400520A8B /* SwiftUI.framework */; }; 19 | F45A571228EDB70400520A8B /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = F45A571128EDB70400520A8B /* Bundle.swift */; }; 20 | F45A571628EDB70500520A8B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F45A571528EDB70500520A8B /* Assets.xcassets */; }; 21 | F45A571A28EDB70500520A8B /* Widget Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = F45A570A28EDB70400520A8B /* Widget Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 22 | F45A572028EDB82500520A8B /* ActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F45A571F28EDB82500520A8B /* ActivityAttributes.swift */; }; 23 | F45A572128EDB84600520A8B /* ActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F45A571F28EDB82500520A8B /* ActivityAttributes.swift */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | F45A571828EDB70500520A8B /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = F45A56E728EDB6CF00520A8B /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = F45A570928EDB70400520A8B; 32 | remoteInfo = "Widget ExtensionExtension"; 33 | }; 34 | /* End PBXContainerItemProxy section */ 35 | 36 | /* Begin PBXCopyFilesBuildPhase section */ 37 | F45A571E28EDB70500520A8B /* Embed Foundation Extensions */ = { 38 | isa = PBXCopyFilesBuildPhase; 39 | buildActionMask = 2147483647; 40 | dstPath = ""; 41 | dstSubfolderSpec = 13; 42 | files = ( 43 | F45A571A28EDB70500520A8B /* Widget Extension.appex in Embed Foundation Extensions */, 44 | ); 45 | name = "Embed Foundation Extensions"; 46 | runOnlyForDeploymentPostprocessing = 0; 47 | }; 48 | /* End PBXCopyFilesBuildPhase section */ 49 | 50 | /* Begin PBXFileReference section */ 51 | F43E05D129029910000CE0C0 /* LiveActivityService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivityService.swift; sourceTree = ""; }; 52 | F45A56EF28EDB6CF00520A8B /* iOS App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | F45A56F228EDB6CF00520A8B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 54 | F45A56F428EDB6CF00520A8B /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 55 | F45A56F628EDB6CF00520A8B /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 56 | F45A56FB28EDB6CF00520A8B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 57 | F45A56FE28EDB6D000520A8B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 58 | F45A570028EDB6D000520A8B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | F45A570A28EDB70400520A8B /* Widget Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Widget Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | F45A570C28EDB70400520A8B /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 61 | F45A570E28EDB70400520A8B /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 62 | F45A571128EDB70400520A8B /* Bundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; 63 | F45A571528EDB70500520A8B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 64 | F45A571728EDB70500520A8B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65 | F45A571F28EDB82500520A8B /* ActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityAttributes.swift; sourceTree = ""; }; 66 | /* End PBXFileReference section */ 67 | 68 | /* Begin PBXFrameworksBuildPhase section */ 69 | F45A56EC28EDB6CF00520A8B /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | F45A570728EDB70400520A8B /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | F45A570F28EDB70400520A8B /* SwiftUI.framework in Frameworks */, 81 | F45A570D28EDB70400520A8B /* WidgetKit.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | /* End PBXFrameworksBuildPhase section */ 86 | 87 | /* Begin PBXGroup section */ 88 | F43E05D429029921000CE0C0 /* Resources */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | F45A56FB28EDB6CF00520A8B /* Assets.xcassets */, 92 | F45A56FD28EDB6D000520A8B /* LaunchScreen.storyboard */, 93 | F45A570028EDB6D000520A8B /* Info.plist */, 94 | ); 95 | path = Resources; 96 | sourceTree = ""; 97 | }; 98 | F45A56E628EDB6CF00520A8B = { 99 | isa = PBXGroup; 100 | children = ( 101 | F45A56F128EDB6CF00520A8B /* iOS App */, 102 | F45A571028EDB70400520A8B /* Widget Extension */, 103 | F45A570B28EDB70400520A8B /* Frameworks */, 104 | F45A56F028EDB6CF00520A8B /* Products */, 105 | ); 106 | sourceTree = ""; 107 | }; 108 | F45A56F028EDB6CF00520A8B /* Products */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | F45A56EF28EDB6CF00520A8B /* iOS App.app */, 112 | F45A570A28EDB70400520A8B /* Widget Extension.appex */, 113 | ); 114 | name = Products; 115 | sourceTree = ""; 116 | }; 117 | F45A56F128EDB6CF00520A8B /* iOS App */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | F45A56F228EDB6CF00520A8B /* AppDelegate.swift */, 121 | F45A56F428EDB6CF00520A8B /* SceneDelegate.swift */, 122 | F45A56F628EDB6CF00520A8B /* ViewController.swift */, 123 | F45A571F28EDB82500520A8B /* ActivityAttributes.swift */, 124 | F43E05D129029910000CE0C0 /* LiveActivityService.swift */, 125 | F43E05D429029921000CE0C0 /* Resources */, 126 | ); 127 | path = "iOS App"; 128 | sourceTree = ""; 129 | }; 130 | F45A570B28EDB70400520A8B /* Frameworks */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | F45A570C28EDB70400520A8B /* WidgetKit.framework */, 134 | F45A570E28EDB70400520A8B /* SwiftUI.framework */, 135 | ); 136 | name = Frameworks; 137 | sourceTree = ""; 138 | }; 139 | F45A571028EDB70400520A8B /* Widget Extension */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | F45A571128EDB70400520A8B /* Bundle.swift */, 143 | F45A571528EDB70500520A8B /* Assets.xcassets */, 144 | F45A571728EDB70500520A8B /* Info.plist */, 145 | ); 146 | path = "Widget Extension"; 147 | sourceTree = ""; 148 | }; 149 | /* End PBXGroup section */ 150 | 151 | /* Begin PBXNativeTarget section */ 152 | F45A56EE28EDB6CF00520A8B /* iOS App */ = { 153 | isa = PBXNativeTarget; 154 | buildConfigurationList = F45A570328EDB6D000520A8B /* Build configuration list for PBXNativeTarget "iOS App" */; 155 | buildPhases = ( 156 | F45A56EB28EDB6CF00520A8B /* Sources */, 157 | F45A56EC28EDB6CF00520A8B /* Frameworks */, 158 | F45A56ED28EDB6CF00520A8B /* Resources */, 159 | F45A571E28EDB70500520A8B /* Embed Foundation Extensions */, 160 | ); 161 | buildRules = ( 162 | ); 163 | dependencies = ( 164 | F45A571928EDB70500520A8B /* PBXTargetDependency */, 165 | ); 166 | name = "iOS App"; 167 | productName = "Dynamic Island Example"; 168 | productReference = F45A56EF28EDB6CF00520A8B /* iOS App.app */; 169 | productType = "com.apple.product-type.application"; 170 | }; 171 | F45A570928EDB70400520A8B /* Widget Extension */ = { 172 | isa = PBXNativeTarget; 173 | buildConfigurationList = F45A571B28EDB70500520A8B /* Build configuration list for PBXNativeTarget "Widget Extension" */; 174 | buildPhases = ( 175 | F45A570628EDB70400520A8B /* Sources */, 176 | F45A570728EDB70400520A8B /* Frameworks */, 177 | F45A570828EDB70400520A8B /* Resources */, 178 | ); 179 | buildRules = ( 180 | ); 181 | dependencies = ( 182 | ); 183 | name = "Widget Extension"; 184 | productName = "Widget ExtensionExtension"; 185 | productReference = F45A570A28EDB70400520A8B /* Widget Extension.appex */; 186 | productType = "com.apple.product-type.app-extension"; 187 | }; 188 | /* End PBXNativeTarget section */ 189 | 190 | /* Begin PBXProject section */ 191 | F45A56E728EDB6CF00520A8B /* Project object */ = { 192 | isa = PBXProject; 193 | attributes = { 194 | BuildIndependentTargetsInParallel = 1; 195 | LastSwiftUpdateCheck = 1410; 196 | LastUpgradeCheck = 1410; 197 | TargetAttributes = { 198 | F45A56EE28EDB6CF00520A8B = { 199 | CreatedOnToolsVersion = 14.1; 200 | }; 201 | F45A570928EDB70400520A8B = { 202 | CreatedOnToolsVersion = 14.1; 203 | }; 204 | }; 205 | }; 206 | buildConfigurationList = F45A56EA28EDB6CF00520A8B /* Build configuration list for PBXProject "Live Activity Example" */; 207 | compatibilityVersion = "Xcode 14.0"; 208 | developmentRegion = en; 209 | hasScannedForEncodings = 0; 210 | knownRegions = ( 211 | en, 212 | Base, 213 | ); 214 | mainGroup = F45A56E628EDB6CF00520A8B; 215 | productRefGroup = F45A56F028EDB6CF00520A8B /* Products */; 216 | projectDirPath = ""; 217 | projectRoot = ""; 218 | targets = ( 219 | F45A56EE28EDB6CF00520A8B /* iOS App */, 220 | F45A570928EDB70400520A8B /* Widget Extension */, 221 | ); 222 | }; 223 | /* End PBXProject section */ 224 | 225 | /* Begin PBXResourcesBuildPhase section */ 226 | F45A56ED28EDB6CF00520A8B /* Resources */ = { 227 | isa = PBXResourcesBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | F45A56FF28EDB6D000520A8B /* LaunchScreen.storyboard in Resources */, 231 | F45A56FC28EDB6CF00520A8B /* Assets.xcassets in Resources */, 232 | ); 233 | runOnlyForDeploymentPostprocessing = 0; 234 | }; 235 | F45A570828EDB70400520A8B /* Resources */ = { 236 | isa = PBXResourcesBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | F45A571628EDB70500520A8B /* Assets.xcassets in Resources */, 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | }; 243 | /* End PBXResourcesBuildPhase section */ 244 | 245 | /* Begin PBXSourcesBuildPhase section */ 246 | F45A56EB28EDB6CF00520A8B /* Sources */ = { 247 | isa = PBXSourcesBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | F45A56F728EDB6CF00520A8B /* ViewController.swift in Sources */, 251 | F45A56F328EDB6CF00520A8B /* AppDelegate.swift in Sources */, 252 | F43E05D229029910000CE0C0 /* LiveActivityService.swift in Sources */, 253 | F45A56F528EDB6CF00520A8B /* SceneDelegate.swift in Sources */, 254 | F45A572028EDB82500520A8B /* ActivityAttributes.swift in Sources */, 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | F45A570628EDB70400520A8B /* Sources */ = { 259 | isa = PBXSourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | F45A572128EDB84600520A8B /* ActivityAttributes.swift in Sources */, 263 | F45A571228EDB70400520A8B /* Bundle.swift in Sources */, 264 | F43E05D529029CF7000CE0C0 /* LiveActivityService.swift in Sources */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | /* End PBXSourcesBuildPhase section */ 269 | 270 | /* Begin PBXTargetDependency section */ 271 | F45A571928EDB70500520A8B /* PBXTargetDependency */ = { 272 | isa = PBXTargetDependency; 273 | target = F45A570928EDB70400520A8B /* Widget Extension */; 274 | targetProxy = F45A571828EDB70500520A8B /* PBXContainerItemProxy */; 275 | }; 276 | /* End PBXTargetDependency section */ 277 | 278 | /* Begin PBXVariantGroup section */ 279 | F45A56FD28EDB6D000520A8B /* LaunchScreen.storyboard */ = { 280 | isa = PBXVariantGroup; 281 | children = ( 282 | F45A56FE28EDB6D000520A8B /* Base */, 283 | ); 284 | name = LaunchScreen.storyboard; 285 | sourceTree = ""; 286 | }; 287 | /* End PBXVariantGroup section */ 288 | 289 | /* Begin XCBuildConfiguration section */ 290 | F45A570128EDB6D000520A8B /* Debug */ = { 291 | isa = XCBuildConfiguration; 292 | buildSettings = { 293 | ALWAYS_SEARCH_USER_PATHS = NO; 294 | CLANG_ANALYZER_NONNULL = YES; 295 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 296 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 297 | CLANG_ENABLE_MODULES = YES; 298 | CLANG_ENABLE_OBJC_ARC = YES; 299 | CLANG_ENABLE_OBJC_WEAK = YES; 300 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 301 | CLANG_WARN_BOOL_CONVERSION = YES; 302 | CLANG_WARN_COMMA = YES; 303 | CLANG_WARN_CONSTANT_CONVERSION = YES; 304 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 305 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 306 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 307 | CLANG_WARN_EMPTY_BODY = YES; 308 | CLANG_WARN_ENUM_CONVERSION = YES; 309 | CLANG_WARN_INFINITE_RECURSION = YES; 310 | CLANG_WARN_INT_CONVERSION = YES; 311 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 312 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 313 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 314 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 315 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 316 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 317 | CLANG_WARN_STRICT_PROTOTYPES = YES; 318 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 319 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 320 | CLANG_WARN_UNREACHABLE_CODE = YES; 321 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 322 | COPY_PHASE_STRIP = NO; 323 | DEBUG_INFORMATION_FORMAT = dwarf; 324 | ENABLE_STRICT_OBJC_MSGSEND = YES; 325 | ENABLE_TESTABILITY = YES; 326 | GCC_C_LANGUAGE_STANDARD = gnu11; 327 | GCC_DYNAMIC_NO_PIC = NO; 328 | GCC_NO_COMMON_BLOCKS = YES; 329 | GCC_OPTIMIZATION_LEVEL = 0; 330 | GCC_PREPROCESSOR_DEFINITIONS = ( 331 | "DEBUG=1", 332 | "$(inherited)", 333 | ); 334 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 335 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 336 | GCC_WARN_UNDECLARED_SELECTOR = YES; 337 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 338 | GCC_WARN_UNUSED_FUNCTION = YES; 339 | GCC_WARN_UNUSED_VARIABLE = YES; 340 | IPHONEOS_DEPLOYMENT_TARGET = 16.1; 341 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 342 | MTL_FAST_MATH = YES; 343 | ONLY_ACTIVE_ARCH = YES; 344 | SDKROOT = iphoneos; 345 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 346 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 347 | }; 348 | name = Debug; 349 | }; 350 | F45A570228EDB6D000520A8B /* Release */ = { 351 | isa = XCBuildConfiguration; 352 | buildSettings = { 353 | ALWAYS_SEARCH_USER_PATHS = NO; 354 | CLANG_ANALYZER_NONNULL = YES; 355 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 356 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 357 | CLANG_ENABLE_MODULES = YES; 358 | CLANG_ENABLE_OBJC_ARC = YES; 359 | CLANG_ENABLE_OBJC_WEAK = YES; 360 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 361 | CLANG_WARN_BOOL_CONVERSION = YES; 362 | CLANG_WARN_COMMA = YES; 363 | CLANG_WARN_CONSTANT_CONVERSION = YES; 364 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 365 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 366 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 367 | CLANG_WARN_EMPTY_BODY = YES; 368 | CLANG_WARN_ENUM_CONVERSION = YES; 369 | CLANG_WARN_INFINITE_RECURSION = YES; 370 | CLANG_WARN_INT_CONVERSION = YES; 371 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 372 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 373 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 374 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 375 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 376 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 377 | CLANG_WARN_STRICT_PROTOTYPES = YES; 378 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 379 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 380 | CLANG_WARN_UNREACHABLE_CODE = YES; 381 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 382 | COPY_PHASE_STRIP = NO; 383 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 384 | ENABLE_NS_ASSERTIONS = NO; 385 | ENABLE_STRICT_OBJC_MSGSEND = YES; 386 | GCC_C_LANGUAGE_STANDARD = gnu11; 387 | GCC_NO_COMMON_BLOCKS = YES; 388 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 389 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 390 | GCC_WARN_UNDECLARED_SELECTOR = YES; 391 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 392 | GCC_WARN_UNUSED_FUNCTION = YES; 393 | GCC_WARN_UNUSED_VARIABLE = YES; 394 | IPHONEOS_DEPLOYMENT_TARGET = 16.1; 395 | MTL_ENABLE_DEBUG_INFO = NO; 396 | MTL_FAST_MATH = YES; 397 | SDKROOT = iphoneos; 398 | SWIFT_COMPILATION_MODE = wholemodule; 399 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 400 | VALIDATE_PRODUCT = YES; 401 | }; 402 | name = Release; 403 | }; 404 | F45A570428EDB6D000520A8B /* Debug */ = { 405 | isa = XCBuildConfiguration; 406 | buildSettings = { 407 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 408 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 409 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 410 | CODE_SIGN_STYLE = Automatic; 411 | CURRENT_PROJECT_VERSION = 1; 412 | DEVELOPMENT_TEAM = ""; 413 | GENERATE_INFOPLIST_FILE = YES; 414 | INFOPLIST_FILE = "iOS App/Resources/Info.plist"; 415 | INFOPLIST_KEY_NSSupportsLiveActivities = YES; 416 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 417 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 418 | INFOPLIST_KEY_UIMainStoryboardFile = ""; 419 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 420 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 421 | LD_RUNPATH_SEARCH_PATHS = ( 422 | "$(inherited)", 423 | "@executable_path/Frameworks", 424 | ); 425 | MARKETING_VERSION = 1.0; 426 | PRODUCT_BUNDLE_IDENTIFIER = "io.sparrowcode.live-activity-example"; 427 | PRODUCT_NAME = "$(TARGET_NAME)"; 428 | SWIFT_EMIT_LOC_STRINGS = YES; 429 | SWIFT_VERSION = 5.0; 430 | TARGETED_DEVICE_FAMILY = "1,2"; 431 | }; 432 | name = Debug; 433 | }; 434 | F45A570528EDB6D000520A8B /* Release */ = { 435 | isa = XCBuildConfiguration; 436 | buildSettings = { 437 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 438 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 439 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 440 | CODE_SIGN_STYLE = Automatic; 441 | CURRENT_PROJECT_VERSION = 1; 442 | DEVELOPMENT_TEAM = ""; 443 | GENERATE_INFOPLIST_FILE = YES; 444 | INFOPLIST_FILE = "iOS App/Resources/Info.plist"; 445 | INFOPLIST_KEY_NSSupportsLiveActivities = YES; 446 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 447 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 448 | INFOPLIST_KEY_UIMainStoryboardFile = ""; 449 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 450 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 451 | LD_RUNPATH_SEARCH_PATHS = ( 452 | "$(inherited)", 453 | "@executable_path/Frameworks", 454 | ); 455 | MARKETING_VERSION = 1.0; 456 | PRODUCT_BUNDLE_IDENTIFIER = "io.sparrowcode.live-activity-example"; 457 | PRODUCT_NAME = "$(TARGET_NAME)"; 458 | SWIFT_EMIT_LOC_STRINGS = YES; 459 | SWIFT_VERSION = 5.0; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | }; 462 | name = Release; 463 | }; 464 | F45A571C28EDB70500520A8B /* Debug */ = { 465 | isa = XCBuildConfiguration; 466 | buildSettings = { 467 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 468 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 469 | CODE_SIGN_STYLE = Automatic; 470 | CURRENT_PROJECT_VERSION = 1; 471 | DEVELOPMENT_TEAM = ""; 472 | GENERATE_INFOPLIST_FILE = YES; 473 | INFOPLIST_FILE = "Widget Extension/Info.plist"; 474 | INFOPLIST_KEY_CFBundleDisplayName = "Widget Extension"; 475 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 476 | LD_RUNPATH_SEARCH_PATHS = ( 477 | "$(inherited)", 478 | "@executable_path/Frameworks", 479 | "@executable_path/../../Frameworks", 480 | ); 481 | MARKETING_VERSION = 1.0; 482 | PRODUCT_BUNDLE_IDENTIFIER = "io.sparrowcode.live-activity-example.widget"; 483 | PRODUCT_NAME = "$(TARGET_NAME)"; 484 | SKIP_INSTALL = YES; 485 | SWIFT_EMIT_LOC_STRINGS = YES; 486 | SWIFT_VERSION = 5.0; 487 | TARGETED_DEVICE_FAMILY = "1,2"; 488 | }; 489 | name = Debug; 490 | }; 491 | F45A571D28EDB70500520A8B /* Release */ = { 492 | isa = XCBuildConfiguration; 493 | buildSettings = { 494 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 495 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 496 | CODE_SIGN_STYLE = Automatic; 497 | CURRENT_PROJECT_VERSION = 1; 498 | DEVELOPMENT_TEAM = ""; 499 | GENERATE_INFOPLIST_FILE = YES; 500 | INFOPLIST_FILE = "Widget Extension/Info.plist"; 501 | INFOPLIST_KEY_CFBundleDisplayName = "Widget Extension"; 502 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 503 | LD_RUNPATH_SEARCH_PATHS = ( 504 | "$(inherited)", 505 | "@executable_path/Frameworks", 506 | "@executable_path/../../Frameworks", 507 | ); 508 | MARKETING_VERSION = 1.0; 509 | PRODUCT_BUNDLE_IDENTIFIER = "io.sparrowcode.live-activity-example.widget"; 510 | PRODUCT_NAME = "$(TARGET_NAME)"; 511 | SKIP_INSTALL = YES; 512 | SWIFT_EMIT_LOC_STRINGS = YES; 513 | SWIFT_VERSION = 5.0; 514 | TARGETED_DEVICE_FAMILY = "1,2"; 515 | }; 516 | name = Release; 517 | }; 518 | /* End XCBuildConfiguration section */ 519 | 520 | /* Begin XCConfigurationList section */ 521 | F45A56EA28EDB6CF00520A8B /* Build configuration list for PBXProject "Live Activity Example" */ = { 522 | isa = XCConfigurationList; 523 | buildConfigurations = ( 524 | F45A570128EDB6D000520A8B /* Debug */, 525 | F45A570228EDB6D000520A8B /* Release */, 526 | ); 527 | defaultConfigurationIsVisible = 0; 528 | defaultConfigurationName = Release; 529 | }; 530 | F45A570328EDB6D000520A8B /* Build configuration list for PBXNativeTarget "iOS App" */ = { 531 | isa = XCConfigurationList; 532 | buildConfigurations = ( 533 | F45A570428EDB6D000520A8B /* Debug */, 534 | F45A570528EDB6D000520A8B /* Release */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | F45A571B28EDB70500520A8B /* Build configuration list for PBXNativeTarget "Widget Extension" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | F45A571C28EDB70500520A8B /* Debug */, 543 | F45A571D28EDB70500520A8B /* Release */, 544 | ); 545 | defaultConfigurationIsVisible = 0; 546 | defaultConfigurationName = Release; 547 | }; 548 | /* End XCConfigurationList section */ 549 | }; 550 | rootObject = F45A56E728EDB6CF00520A8B /* Project object */; 551 | } 552 | --------------------------------------------------------------------------------