Skip to content

Commit 5165e2a

Browse files
committed
Request notification permission post onboarding
1 parent 1710d91 commit 5165e2a

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

Sources/App/Resources/en.lproj/Localizable.strings

+2
Original file line numberDiff line numberDiff line change
@@ -1194,3 +1194,5 @@ Home Assistant is free and open source home automation software with a focus on
11941194
"onboarding.permission.location.buttons.deny" = "Deny";
11951195
"onboarding.permission.location.deny.alert.title" = "Are you sure?";
11961196
"onboarding.permission.location.deny.alert.message" = "Without location permission future versions of the App may deny access to your local Home Assistant server due to privacy concerns. If you are sure, please continue and tap 'Deny' on the next popup as well. By doing that we recommend you use your internal URL as external, since it is the only URL the app will try to access.";
1197+
"post_onboarding.permission.notification.title" = "Do you want to receive notifications?";
1198+
"post_onboarding.permission.notification.message" = "Notifications can be useful in your automations. Tap the icon to allow or deny.";

Sources/App/WebView/WebViewController.swift

+52
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ final class WebViewController: UIViewController, WKNavigationDelegate, WKUIDeleg
128128
if #available(iOS 16.4, *) {
129129
webView.isInspectable = true
130130
}
131+
132+
postOnboardingNotificationPermission()
131133
}
132134

133135
private func observeConnectionNotifications() {
@@ -1358,3 +1360,53 @@ extension WebViewController {
13581360
hud.hide(animated: true, afterDelay: 1.0)
13591361
}
13601362
}
1363+
1364+
// MARK: - Post onboarding
1365+
1366+
extension WebViewController {
1367+
private func postOnboardingNotificationPermission() {
1368+
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { [weak self] in
1369+
Task {
1370+
let notificationCenter = Current.userNotificationCenter
1371+
let settings = await notificationCenter.notificationSettings()
1372+
if ![.authorized, .denied].contains(settings.authorizationStatus) {
1373+
self?.showNotificationPermissionRequest()
1374+
}
1375+
}
1376+
}
1377+
}
1378+
1379+
private func showNotificationPermissionRequest() {
1380+
let view = MessageView.viewFromNib(layout: .cardView)
1381+
var config = SwiftMessages.Config()
1382+
config.duration = .forever
1383+
config.presentationStyle = .top
1384+
config.dimMode = .gray(interactive: true)
1385+
view.configureContent(
1386+
title: L10n.PostOnboarding.Permission.Notification.title,
1387+
body: L10n.PostOnboarding.Permission.Notification.message,
1388+
iconImage: nil,
1389+
iconText: nil,
1390+
buttonImage: MaterialDesignIcons.arrowRightBoldCircleIcon.image(
1391+
ofSize: .init(width: 35, height: 35),
1392+
color: Asset.Colors.haPrimary.color
1393+
),
1394+
buttonTitle: nil,
1395+
buttonTapHandler: { _ in
1396+
SwiftMessages.hide()
1397+
UNUserNotificationCenter.current().requestAuthorization(options: .defaultOptions) { _, error in
1398+
if let error {
1399+
Current.Log.error("Error when requesting notifications permissions: \(error)")
1400+
}
1401+
DispatchQueue.main.async {
1402+
UIApplication.shared.registerForRemoteNotifications()
1403+
}
1404+
}
1405+
}
1406+
)
1407+
view.titleLabel?.numberOfLines = 0
1408+
view.bodyLabel?.numberOfLines = 0
1409+
1410+
SwiftMessages.show(config: config, view: view)
1411+
}
1412+
}

Sources/Shared/Environment/Environment.swift

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import GRDB
66
import HAKit
77
import PromiseKit
88
import RealmSwift
9+
import UserNotifications
910
import Version
1011
import XCGLogger
1112

@@ -432,4 +433,8 @@ public class AppEnvironment {
432433
public var bluetoothPermissionStatus: CBManagerAuthorization {
433434
CBCentralManager.authorization
434435
}
436+
437+
public var userNotificationCenter: UNUserNotificationCenter {
438+
UNUserNotificationCenter.current()
439+
}
435440
}

Sources/Shared/Resources/Swiftgen/Strings.swift

+11
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,17 @@ public enum L10n {
18561856
}
18571857
}
18581858

1859+
public enum PostOnboarding {
1860+
public enum Permission {
1861+
public enum Notification {
1862+
/// Notifications can be useful in your automations. Tap the icon to allow or deny.
1863+
public static var message: String { return L10n.tr("Localizable", "post_onboarding.permission.notification.message") }
1864+
/// Do you want to receive notifications?
1865+
public static var title: String { return L10n.tr("Localizable", "post_onboarding.permission.notification.title") }
1866+
}
1867+
}
1868+
}
1869+
18591870
public enum Sensors {
18601871
public enum Active {
18611872
public enum Setting {

0 commit comments

Comments
 (0)