├── .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 | 
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 |
--------------------------------------------------------------------------------