Skip to content

Commit b2ef1bc

Browse files
[SWU-64] Implemented push notifications in the Demo app
1 parent 57ebe30 commit b2ef1bc

File tree

7 files changed

+176
-21
lines changed

7 files changed

+176
-21
lines changed

DemoAppSwiftUI/AppDelegate.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class AppDelegate: NSObject, UIApplicationDelegate {
1919
let client = ChatClient(config: config)
2020
return client
2121
}()
22-
22+
2323
func application(
2424
_ application: UIApplication,
2525
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
@@ -57,10 +57,14 @@ class AppDelegate: NSObject, UIApplicationDelegate {
5757

5858
DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
5959
withAnimation {
60-
AppState.shared.userState = .notLoggedIn
60+
if AppState.shared.userState == .launchAnimation {
61+
AppState.shared.userState = .notLoggedIn
62+
}
6163
}
6264
}
6365

66+
UNUserNotificationCenter.current().delegate = NotificationsHandler.shared
67+
6468
return true
6569
}
6670

@@ -73,6 +77,24 @@ class AppDelegate: NSObject, UIApplicationDelegate {
7377
sceneConfig.delegateClass = SceneDelegate.self
7478
return sceneConfig
7579
}
80+
81+
func application(
82+
_ application: UIApplication,
83+
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
84+
) {
85+
guard let currentUserId = chatClient.currentUserId else {
86+
log.warning("cannot add the device without connecting as user first, did you call connectUser")
87+
return
88+
}
89+
90+
chatClient.currentUserController().addDevice(token: deviceToken) { error in
91+
if let error = error {
92+
log.error("adding a device failed with an error \(error)")
93+
return
94+
}
95+
UserDefaults(suiteName: applicationGroupIdentifier)?.set(currentUserId, forKey: currentUserIdRegisteredForPush)
96+
}
97+
}
7698
}
7799

78100
extension UIColor {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>aps-environment</key>
6+
<string>development</string>
7+
<key>com.apple.security.application-groups</key>
8+
<array>
9+
<string>group.io.getstream.iOS.ChatDemoAppSwiftUI</string>
10+
</array>
11+
</dict>
12+
</plist>

DemoAppSwiftUI/DemoAppSwiftUIApp.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct DemoAppSwiftUIApp: App {
1313
@Injected(\.chatClient) public var chatClient: ChatClient
1414

1515
@ObservedObject var appState = AppState.shared
16+
@ObservedObject var notificationsHandler = NotificationsHandler.shared
1617

1718
var body: some Scene {
1819
WindowGroup {
@@ -22,7 +23,21 @@ struct DemoAppSwiftUIApp: App {
2223
case .notLoggedIn:
2324
LoginView()
2425
case .loggedIn:
25-
ChatChannelListView(viewFactory: DemoAppFactory.shared)
26+
if notificationsHandler.notificationChannelId != nil {
27+
ChatChannelListView(
28+
viewFactory: DemoAppFactory.shared,
29+
selectedChannelId: notificationsHandler.notificationChannelId
30+
)
31+
} else {
32+
ChatChannelListView(
33+
viewFactory: DemoAppFactory.shared
34+
)
35+
}
36+
}
37+
}
38+
.onChange(of: appState.userState) { newValue in
39+
if newValue == .loggedIn {
40+
notificationsHandler.setupRemoteNotifications()
2641
}
2742
}
2843
}

DemoAppSwiftUI/DemoUser.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import Foundation
66

7-
public let apiKeyString = "8br4watad788"
7+
public let apiKeyString = "zcgvnykxsfm8"
88
public let applicationGroupIdentifier = "group.io.getstream.iOS.ChatDemoAppSwiftUI"
99
public let currentUserIdRegisteredForPush = "currentUserIdRegisteredForPush"
1010

@@ -27,112 +27,112 @@ extension UserCredentials: Identifiable {
2727
"luke_skywalker",
2828
"Luke Skywalker",
2929
"https://vignette.wikia.nocookie.net/starwars/images/2/20/LukeTLJ.jpg",
30-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibHVrZV9za3l3YWxrZXIifQ.kFSLHRB5X62t0Zlc7nwczWUfsQMwfkpylC6jCUZ6Mc0",
30+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibHVrZV9za3l3YWxrZXIifQ.b6EiC8dq2AHk0JPfI-6PN-AM9TVzt8JV-qB1N9kchlI",
3131
"Tatooine"
3232
),
3333
(
3434
"leia_organa",
3535
"Leia Organa",
3636
"https://vignette.wikia.nocookie.net/starwars/images/f/fc/Leia_Organa_TLJ.png",
37-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibGVpYV9vcmdhbmEifQ.IzwBuaYwX5dRvnDDnJN2AyW3wwfYwgQm3w-1RD4BLPU",
37+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibGVpYV9vcmdhbmEifQ.Z5jwZggIKuspn1Z76MJHF9AY_VdAFg_jnTS6CP5ZZN0",
3838
"Polis Massa"
3939
),
4040
(
4141
"han_solo",
4242
"Han Solo",
4343
"https://vignette.wikia.nocookie.net/starwars/images/e/e2/TFAHanSolo.png",
44-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiaGFuX3NvbG8ifQ.R6PkQeGPcusALmhvaST50lwroL_JkZnI3Q7hQ1Hvj3k",
44+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiaGFuX3NvbG8ifQ.b5lfc4dHWbfxKFF_NdEGd9K25U6ywSp5ImBW_ncO3OA",
4545
"Corellia"
4646
),
4747
(
4848
"lando_calrissian",
4949
"Lando Calrissian",
5050
"https://vignette.wikia.nocookie.net/starwars/images/8/8f/Lando_ROTJ.png",
51-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibGFuZG9fY2Fscmlzc2lhbiJ9.n_K7d-FroQzBUxETNcEQYqiW_U9CPjRHZHT1hyAjlAQ",
51+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibGFuZG9fY2Fscmlzc2lhbiJ9.jtR-LRHNSLhPJLlrNOMWa4VF5ublU-vySD9efv-8o8g",
5252
"Socorro"
5353
),
5454
(
5555
"chewbacca",
5656
"Chewbacca",
5757
"https://vignette.wikia.nocookie.net/starwars/images/4/48/Chewbacca_TLJ.png",
58-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiY2hld2JhY2NhIn0.4nNFfO0dehvdLxDUGaMQPpMliSTGjHqh1C2Zo8wyaeM",
58+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiY2hld2JhY2NhIn0.GVzFcua20gVefzmEMlEX-dJXX56Dyoza3Vfkqin1yTc",
5959
"Kashyyyk"
6060
),
6161
(
6262
"c-3po",
6363
"C-3PO",
6464
"https://vignette.wikia.nocookie.net/starwars/images/3/3f/C-3PO_TLJ_Card_Trader_Award_Card.png",
65-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYy0zcG8ifQ.J4Xzu8rKP1XWQvSNV6wzWKW403qKd5N3FalpWXTDauw",
65+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYy0zcG8ifQ._3IfTtUJTexVfCOt9mL22mLeAogaOXPR-5d3kq_h8cs",
6666
"Affa"
6767
),
6868
(
6969
"r2-d2",
7070
"R2-D2",
7171
"https://vignette.wikia.nocookie.net/starwars/images/e/eb/ArtooTFA2-Fathead.png",
72-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicjItZDIifQ.UpSEW8jA2tYsUTPKbdFGMtHHnu9_AnEQqTK6TdT8L1g",
72+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicjItZDIifQ.zoi2pzALI8a2sQFLhOIxnZawHooj_PqJF0jToqOpNP4",
7373
"Naboo"
7474
),
7575
(
7676
"anakin_skywalker",
7777
"Anakin Skywalker",
7878
"https://vignette.wikia.nocookie.net/starwars/images/6/6f/Anakin_Skywalker_RotS.png",
79-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYW5ha2luX3NreXdhbGtlciJ9.oJkwakjdqw6gCA3-kaUaKqSVEcWO5ob5DJuyJCtnT6U",
79+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYW5ha2luX3NreXdhbGtlciJ9.ZwCV1qPrSAsie7-0n61JQrSEDbp6fcMgVh4V2CB0kM8",
8080
"Tatooine"
8181
),
8282
(
8383
"obi-wan_kenobi",
8484
"Obi-Wan Kenobi",
8585
"https://vignette.wikia.nocookie.net/starwars/images/4/4e/ObiWanHS-SWE.jpg",
86-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoib2JpLXdhbl9rZW5vYmkifQ.AVOtnXtMq9crXFwl68BrBRob335phYpYfPPq5i2agUM",
86+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoib2JpLXdhbl9rZW5vYmkifQ.PU1vMfuhVi7gpfk3TBwM9KmtVldEtsFER8OElLfzFig",
8787
"Stewjon"
8888
),
8989
(
9090
"padme_amidala",
9191
"Padmé Amidala",
9292
"https://vignette.wikia.nocookie.net/starwars/images/b/b2/Padmegreenscrshot.jpg",
93-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicGFkbWVfYW1pZGFsYSJ9.X8CwsnrWKvdrS6XchcUMZDLh_W0X4Gpx-oNyjGAdenI",
93+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicGFkbWVfYW1pZGFsYSJ9.qT6nK_5eys8GRK-G_rCD-u58UBq245umMTmE2nVtgm0",
9494
"Naboo"
9595
),
9696
(
9797
"qui-gon_jinn",
9898
"Qui-Gon Jinn",
9999
"https://vignette.wikia.nocookie.net/starwars/images/f/f6/Qui-Gon_Jinn_Headshot_TPM.jpg",
100-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicXVpLWdvbl9qaW5uIn0.EDuyuTkyzG1OA3ROwa3sK8-K_U2MGREsY4Ic7flXvzw",
100+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoicXVpLWdvbl9qaW5uIn0.HvKHNYXUdlay07mUZvsSFdQYi_3SXPr_kxYaaiEr278",
101101
"Coruscant"
102102
),
103103
(
104104
"mace_windu",
105105
"Mace Windu",
106106
"https://vignette.wikia.nocookie.net/starwars/images/5/58/Mace_ROTS.png",
107-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibWFjZV93aW5kdSJ9.x8xFcOQFr0XUDeA3BH0ISsR2VSmWSxmMgbnz8lprV58",
107+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibWFjZV93aW5kdSJ9.K6dE1tos0X1bKoehbRQ6DedQcMJf5ZOGY_n9aEioU7A",
108108
"Haruun Kal"
109109
),
110110
(
111111
"jar_jar_binks",
112112
"Jar Jar Binks",
113113
"https://vignette.wikia.nocookie.net/starwars/images/d/d2/Jar_Jar_aotc.jpg",
114-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiamFyX2phcl9iaW5rcyJ9.5-GhGE8sqlxKNUMyBGovrkoaxgkEQAUMJ3CZfcxyrZg",
114+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiamFyX2phcl9iaW5rcyJ9.wkaMfsuQPlmK1kSPM4f1CVtcVSkZCUL1EMOyp9DT8ns",
115115
"Naboo"
116116
),
117117
(
118118
"darth_maul",
119119
"Darth Maul",
120120
"https://vignette.wikia.nocookie.net/starwars/images/5/50/Darth_Maul_profile.png",
121-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZGFydGhfbWF1bCJ9._cbBA2ThWpXcyxwvBV6gvqAwnw0lvzfHAlZ4stGqf2o",
121+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZGFydGhfbWF1bCJ9.eUlDsRbZb5SEd0d8WsjZTzg8SYWOinNf6FiGJHS2Qwg",
122122
"Dathomir"
123123
),
124124
(
125125
"count_dooku",
126126
"Count Dooku",
127127
"https://vignette.wikia.nocookie.net/starwars/images/b/b8/Dooku_Headshot.jpg",
128-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiY291bnRfZG9va3UifQ.0sN_cPTKrXsxC23WUSIBUQK5IUZsdGijmqY50HJERQw",
128+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiY291bnRfZG9va3UifQ.2RPv-5vrHTAUGOmZUQFeHZ0hyLj-N-34l4s_9edgEfU",
129129
"Serenno"
130130
),
131131
(
132132
"general_grievous",
133133
"General Grievous",
134134
"https://vignette.wikia.nocookie.net/starwars/images/d/de/Grievoushead.jpg",
135-
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZ2VuZXJhbF9ncmlldm91cyJ9.FPRvRoeZdALErBA1bDybch4xY-c5CEinuc9qqEPzX4E",
135+
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZ2VuZXJhbF9ncmlldm91cyJ9.g2UUZdENuacFIxhYCylBuDJZUZ2x59MTWaSpndWGCTU",
136136
"Qymaen jai Sheelal"
137137
)
138138

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//
2+
// Copyright © 2022 Stream.io Inc. All rights reserved.
3+
//
4+
5+
import StreamChat
6+
import StreamChatSwiftUI
7+
import SwiftUI
8+
import UIKit
9+
10+
/// Handles push notifications in the demo app.
11+
/// When a notification is received, the channel id is extracted from the notification object.
12+
/// The code below shows an example how to use it to navigate directly to the corresponding screen.
13+
class NotificationsHandler: NSObject, ObservableObject, UNUserNotificationCenterDelegate {
14+
15+
@Injected(\.chatClient) private var chatClient
16+
17+
@Published var notificationChannelId: String?
18+
19+
static let shared = NotificationsHandler()
20+
21+
override private init() {}
22+
23+
func userNotificationCenter(
24+
_ center: UNUserNotificationCenter,
25+
didReceive response: UNNotificationResponse,
26+
withCompletionHandler completionHandler: @escaping () -> Void
27+
) {
28+
defer {
29+
completionHandler()
30+
}
31+
32+
guard let notificationInfo = try? ChatPushNotificationInfo(content: response.notification.request.content) else {
33+
return
34+
}
35+
36+
guard let cid = notificationInfo.cid else {
37+
return
38+
}
39+
40+
guard case UNNotificationDefaultActionIdentifier = response.actionIdentifier else {
41+
return
42+
}
43+
44+
if AppState.shared.userState == .loggedIn {
45+
notificationChannelId = cid.description
46+
} else if let userId = UserDefaults(suiteName: applicationGroupIdentifier)?.string(forKey: currentUserIdRegisteredForPush),
47+
let userCredentials = UserCredentials.builtInUsersByID(id: userId),
48+
let token = try? Token(rawValue: userCredentials.token) {
49+
loginAndNavigateToChannel(
50+
userCredentials: userCredentials,
51+
token: token,
52+
cid: cid
53+
)
54+
}
55+
}
56+
57+
func setupRemoteNotifications() {
58+
UNUserNotificationCenter
59+
.current()
60+
.requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in
61+
if granted {
62+
DispatchQueue.main.async {
63+
UIApplication.shared.registerForRemoteNotifications()
64+
}
65+
}
66+
}
67+
}
68+
69+
private func loginAndNavigateToChannel(
70+
userCredentials: UserCredentials,
71+
token: Token,
72+
cid: ChannelId
73+
) {
74+
let userInfo: UserInfo = .init(
75+
id: userCredentials.id,
76+
name: userCredentials.name,
77+
imageURL: userCredentials.avatarURL
78+
)
79+
chatClient.connectUser(userInfo: userInfo, token: token) { [weak self] error in
80+
if error != nil {
81+
log.debug("Error logging in")
82+
return
83+
}
84+
85+
DispatchQueue.main.async {
86+
AppState.shared.userState = .loggedIn
87+
self?.notificationChannelId = cid.description
88+
}
89+
}
90+
}
91+
}

DemoAppSwiftUI/SceneDelegate.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,11 @@
44

55
import UIKit
66

7-
class SceneDelegate: NSObject, UIWindowSceneDelegate {}
7+
class SceneDelegate: NSObject, UIWindowSceneDelegate {
8+
9+
func sceneWillResignActive(_ scene: UIScene) {
10+
if NotificationsHandler.shared.notificationChannelId != nil {
11+
NotificationsHandler.shared.notificationChannelId = nil
12+
}
13+
}
14+
}

StreamChatSwiftUI.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@
166166
848399EA275FB3E9003075E4 /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 848399E9275FB3E9003075E4 /* SnapshotTesting */; };
167167
848399EC275FB41B003075E4 /* ChatChannelListView_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848399EB275FB41B003075E4 /* ChatChannelListView_Tests.swift */; };
168168
848399F227601231003075E4 /* ReactionsOverlayView_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848399F127601231003075E4 /* ReactionsOverlayView_Tests.swift */; };
169+
8492974B27ABDDCB00A8EEB0 /* NotificationsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8492974827ABDDBF00A8EEB0 /* NotificationsHandler.swift */; };
169170
849CDD942768E0E1003C7A51 /* MessageActionsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849CDD932768E0E1003C7A51 /* MessageActionsResolver.swift */; };
170171
84A75FBB274EA29B00225CE8 /* GiphyAttachmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84A75FBA274EA29B00225CE8 /* GiphyAttachmentView.swift */; };
171172
84AB7B1D2771F4AA00631A10 /* DiscardButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AB7B1C2771F4AA00631A10 /* DiscardButtonView.swift */; };
@@ -483,6 +484,8 @@
483484
846D6563279FF0800094B36E /* ReactionUserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionUserView.swift; sourceTree = "<group>"; };
484485
848399EB275FB41B003075E4 /* ChatChannelListView_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatChannelListView_Tests.swift; sourceTree = "<group>"; };
485486
848399F127601231003075E4 /* ReactionsOverlayView_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsOverlayView_Tests.swift; sourceTree = "<group>"; };
487+
8492974727ABD97F00A8EEB0 /* DemoAppSwiftUI.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DemoAppSwiftUI.entitlements; sourceTree = "<group>"; };
488+
8492974827ABDDBF00A8EEB0 /* NotificationsHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsHandler.swift; sourceTree = "<group>"; };
486489
849CDD932768E0E1003C7A51 /* MessageActionsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActionsResolver.swift; sourceTree = "<group>"; };
487490
84A75FBA274EA29B00225CE8 /* GiphyAttachmentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GiphyAttachmentView.swift; sourceTree = "<group>"; };
488491
84AB7B1C2771F4AA00631A10 /* DiscardButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscardButtonView.swift; sourceTree = "<group>"; };
@@ -709,10 +712,12 @@
709712
8465FCBD27468B6900AF091E /* DemoAppSwiftUI */ = {
710713
isa = PBXGroup;
711714
children = (
715+
8492974727ABD97F00A8EEB0 /* DemoAppSwiftUI.entitlements */,
712716
8465FCBE27468B6900AF091E /* DemoAppSwiftUIApp.swift */,
713717
8465FCD3274694D200AF091E /* AppDelegate.swift */,
714718
8465FCD6274694D200AF091E /* CustomAttachment.swift */,
715719
8465FCD7274694D200AF091E /* CustomChannelHeader.swift */,
720+
8492974827ABDDBF00A8EEB0 /* NotificationsHandler.swift */,
716721
8465FCD4274694D200AF091E /* DemoUser.swift */,
717722
8465FCD2274694D200AF091E /* LaunchAnimationState.swift */,
718723
8465FCD1274694D200AF091E /* LaunchScreen.swift */,
@@ -1683,6 +1688,7 @@
16831688
8465FCBF27468B6900AF091E /* DemoAppSwiftUIApp.swift in Sources */,
16841689
8465FCDB274694D200AF091E /* DemoUser.swift in Sources */,
16851690
8465FCDD274694D200AF091E /* CustomAttachment.swift in Sources */,
1691+
8492974B27ABDDCB00A8EEB0 /* NotificationsHandler.swift in Sources */,
16861692
8465FCDA274694D200AF091E /* AppDelegate.swift in Sources */,
16871693
8465FCD8274694D200AF091E /* LaunchScreen.swift in Sources */,
16881694
84B288CF274C545900DD090B /* CreateGroupViewModel.swift in Sources */,
@@ -1977,6 +1983,7 @@
19771983
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
19781984
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
19791985
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
1986+
CODE_SIGN_ENTITLEMENTS = DemoAppSwiftUI/DemoAppSwiftUI.entitlements;
19801987
CODE_SIGN_IDENTITY = "Apple Development";
19811988
CODE_SIGN_STYLE = Manual;
19821989
CURRENT_PROJECT_VERSION = 9;
@@ -2010,6 +2017,7 @@
20102017
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
20112018
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
20122019
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
2020+
CODE_SIGN_ENTITLEMENTS = DemoAppSwiftUI/DemoAppSwiftUI.entitlements;
20132021
CODE_SIGN_IDENTITY = "Apple Distribution";
20142022
CODE_SIGN_STYLE = Manual;
20152023
CURRENT_PROJECT_VERSION = 9;

0 commit comments

Comments
 (0)