Refactor AppGroups

This commit is contained in:
Kylmakalle 2025-02-10 16:09:21 +02:00
parent 6cb34077fd
commit 7e999e8c48
9 changed files with 79 additions and 13 deletions

View File

@ -0,0 +1,17 @@
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
swift_library(
name = "SGAppGroupIdentifier",
module_name = "SGAppGroupIdentifier",
srcs = glob([
"Sources/**/*.swift",
]),
copts = [
"-warnings-as-errors",
],
deps = [
],
visibility = [
"//visibility:public",
],
)

View File

@ -0,0 +1,28 @@
import Foundation
let fallbackBaseBundleId: String = "app.swiftgram.ios"
public func sgAppGroupIdentifier() -> String {
let baseBundleId: String
if let bundleId: String = Bundle.main.bundleIdentifier {
if Bundle.main.bundlePath.hasSuffix(".appex") {
if let lastDotRange: Range<String.Index> = bundleId.range(of: ".", options: [.backwards]) {
baseBundleId = String(bundleId[..<lastDotRange.lowerBound])
} else {
baseBundleId = fallbackBaseBundleId
}
} else {
baseBundleId = bundleId
}
} else {
baseBundleId = fallbackBaseBundleId
}
let result: String = "group.\(baseBundleId)"
#if DEBUG
print("APP_GROUP_IDENTIFIER: \(result)")
#endif
return result
}

View File

@ -275,13 +275,15 @@ extension SGIAPManager: SKProductsRequestDelegate {
extension SGIAPManager: SKPaymentTransactionObserver { extension SGIAPManager: SKPaymentTransactionObserver {
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
SGLogger.shared.log("SGIAP", "paymentQueue transactions \(transactions.count)") SGLogger.shared.log("SGIAP", "paymentQueue transactions \(transactions.count)")
var purchaceTransactions: [SKPaymentTransaction] = []
for transaction in transactions { for transaction in transactions {
SGLogger.shared.log("SGIAP", "Transaction \(transaction.transactionIdentifier ?? "nil") state for product \(transaction.payment.productIdentifier): \(transaction.transactionState.description)") SGLogger.shared.log("SGIAP", "Transaction \(transaction.transactionIdentifier ?? "nil") state for product \(transaction.payment.productIdentifier): \(transaction.transactionState.description)")
switch transaction.transactionState { switch transaction.transactionState {
case .purchased, .restored: case .purchased, .restored:
SGLogger.shared.log("SGIAP", "Sending SGIAPHelperPurchaseNotification for \(transaction.transactionIdentifier ?? "nil")") purchaceTransactions.append(transaction)
NotificationCenter.default.post(name: .SGIAPHelperPurchaseNotification, object: transaction) break
case .purchasing, .deferred: case .purchasing, .deferred:
// Ignoring
break break
case .failed: case .failed:
var localizedError: String = "" var localizedError: String = ""
@ -298,6 +300,11 @@ extension SGIAPManager: SKPaymentTransactionObserver {
SKPaymentQueue.default().finishTransaction(transaction) SKPaymentQueue.default().finishTransaction(transaction)
} }
} }
if !purchaceTransactions.isEmpty {
SGLogger.shared.log("SGIAP", "Sending SGIAPHelperPurchaseNotification for \(purchaceTransactions.map({ $0.transactionIdentifier ?? "nil" }).joined(separator: ", "))")
NotificationCenter.default.post(name: .SGIAPHelperPurchaseNotification, object: purchaceTransactions)
}
} }
public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {

View File

@ -10,6 +10,7 @@ swift_library(
"-warnings-as-errors", "-warnings-as-errors",
], ],
deps = [ deps = [
"//Swiftgram/SGAppGroupIdentifier:SGAppGroupIdentifier",
], ],
visibility = [ visibility = [
"//visibility:public", "//visibility:public",

View File

@ -1,7 +1,7 @@
import Foundation import Foundation
import SGAppGroupIdentifier
let APP_GROUP_IDENTIFIER = sgAppGroupIdentifier()
let appGroupIdentifier = "group.app.swiftgram.ios"
public class SGSimpleSettings { public class SGSimpleSettings {
@ -16,7 +16,7 @@ public class SGSimpleSettings {
UserDefaults.standard.register(defaults: SGSimpleSettings.defaultValues) UserDefaults.standard.register(defaults: SGSimpleSettings.defaultValues)
// Just in case group defaults will be nil // Just in case group defaults will be nil
UserDefaults.standard.register(defaults: SGSimpleSettings.groupDefaultValues) UserDefaults.standard.register(defaults: SGSimpleSettings.groupDefaultValues)
if let groupUserDefaults = UserDefaults(suiteName: appGroupIdentifier) { if let groupUserDefaults = UserDefaults(suiteName: APP_GROUP_IDENTIFIER) {
groupUserDefaults.register(defaults: SGSimpleSettings.groupDefaultValues) groupUserDefaults.register(defaults: SGSimpleSettings.groupDefaultValues)
} }
} }
@ -55,7 +55,7 @@ public class SGSimpleSettings {
} }
public func synchronizeShared() { public func synchronizeShared() {
if let groupUserDefaults = UserDefaults(suiteName: appGroupIdentifier) { if let groupUserDefaults = UserDefaults(suiteName: APP_GROUP_IDENTIFIER) {
groupUserDefaults.synchronize() groupUserDefaults.synchronize()
} }
} }
@ -423,9 +423,12 @@ public class SGSimpleSettings {
@UserDefault(key: Keys.videoPIPSwipeDirection.rawValue) @UserDefault(key: Keys.videoPIPSwipeDirection.rawValue)
public var videoPIPSwipeDirection: String public var videoPIPSwipeDirection: String
@UserDefault(key: Keys.legacyNotificationsFix.rawValue, userDefaults: UserDefaults(suiteName: appGroupIdentifier) ?? .standard) @UserDefault(key: Keys.legacyNotificationsFix.rawValue, userDefaults: UserDefaults(suiteName: APP_GROUP_IDENTIFIER) ?? .standard)
public var legacyNotificationsFix: Bool public var legacyNotificationsFix: Bool
@UserDefault(key: Keys.legacyNotificationsFix.rawValue, userDefaults: UserDefaults(suiteName: APP_GROUP_IDENTIFIER) ?? .standard)
public var status: Int64
public var b: Bool = true public var b: Bool = true
@UserDefault(key: Keys.messageFilterKeywords.rawValue) @UserDefault(key: Keys.messageFilterKeywords.rawValue)
@ -434,10 +437,10 @@ public class SGSimpleSettings {
@UserDefault(key: Keys.inputToolbar.rawValue) @UserDefault(key: Keys.inputToolbar.rawValue)
public var inputToolbar: Bool public var inputToolbar: Bool
@UserDefault(key: Keys.pinnedMessageNotifications.rawValue, userDefaults: UserDefaults(suiteName: appGroupIdentifier) ?? .standard) @UserDefault(key: Keys.pinnedMessageNotifications.rawValue, userDefaults: UserDefaults(suiteName: APP_GROUP_IDENTIFIER) ?? .standard)
public var pinnedMessageNotifications: String public var pinnedMessageNotifications: String
@UserDefault(key: Keys.mentionsAndRepliesNotifications.rawValue, userDefaults: UserDefaults(suiteName: appGroupIdentifier) ?? .standard) @UserDefault(key: Keys.mentionsAndRepliesNotifications.rawValue, userDefaults: UserDefaults(suiteName: APP_GROUP_IDENTIFIER) ?? .standard)
public var mentionsAndRepliesNotifications: String public var mentionsAndRepliesNotifications: String
@UserDefault(key: Keys.primaryUserId.rawValue) @UserDefault(key: Keys.primaryUserId.rawValue)

View File

@ -1,12 +1,16 @@
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
sgdeps = [
"//Swiftgram/SGAppGroupIdentifier:SGAppGroupIdentifier"
]
swift_library( swift_library(
name = "NotificationServiceExtensionLib", name = "NotificationServiceExtensionLib",
module_name = "NotificationServiceExtensionLib", module_name = "NotificationServiceExtensionLib",
srcs = glob([ srcs = glob([
"Sources/*.swift", "Sources/*.swift",
]), ]),
deps = [ deps = sgdeps + [
"//submodules/Postbox:Postbox", "//submodules/Postbox:Postbox",
"//submodules/TelegramCore:TelegramCore", "//submodules/TelegramCore:TelegramCore",
"//submodules/BuildConfig:BuildConfig", "//submodules/BuildConfig:BuildConfig",

View File

@ -1,3 +1,4 @@
import SGAppGroupIdentifier
import Foundation import Foundation
import UserNotifications import UserNotifications
import SwiftSignalKit import SwiftSignalKit
@ -18,7 +19,7 @@ import NotificationsPresentationData
import RangeSet import RangeSet
import ConvertOpusToAAC import ConvertOpusToAAC
private let groupUserDefaults: UserDefaults? = UserDefaults(suiteName: "group.app.swiftgram.ios") private let groupUserDefaults: UserDefaults? = UserDefaults(suiteName: sgAppGroupIdentifier())
private let LEGACY_NOTIFICATIONS_FIX: Bool = groupUserDefaults?.bool(forKey: "legacyNotificationsFix") ?? false private let LEGACY_NOTIFICATIONS_FIX: Bool = groupUserDefaults?.bool(forKey: "legacyNotificationsFix") ?? false
private let PINNED_MESSAGE_ACTION: String = groupUserDefaults?.string(forKey: "pinnedMessageNotifications") ?? "default" private let PINNED_MESSAGE_ACTION: String = groupUserDefaults?.string(forKey: "pinnedMessageNotifications") ?? "default"
private let PINNED_MESSAGE_ACTION_EXCEPTIONS: [String: String] = (groupUserDefaults?.dictionary(forKey: "pinnedMessageNotificationsExceptions") as? [String: String]) ?? [:] private let PINNED_MESSAGE_ACTION_EXCEPTIONS: [String: String] = (groupUserDefaults?.dictionary(forKey: "pinnedMessageNotificationsExceptions") as? [String: String]) ?? [:]

View File

@ -40,6 +40,10 @@ apple_resource_bundle(
], ],
) )
sgdeps = [
"//Swiftgram/SGAppGroupIdentifier:SGAppGroupIdentifier"
]
swift_library( swift_library(
name = "TelegramCallsUI", name = "TelegramCallsUI",
module_name = "TelegramCallsUI", module_name = "TelegramCallsUI",
@ -52,7 +56,7 @@ swift_library(
data = [ data = [
":TelegramCallsUIBundle", ":TelegramCallsUIBundle",
], ],
deps = [ deps = sgdeps + [
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit",
"//submodules/Display:Display", "//submodules/Display:Display",
"//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/TelegramPresentationData:TelegramPresentationData",

View File

@ -1,3 +1,4 @@
import SGAppGroupIdentifier
import Foundation import Foundation
import UIKit import UIKit
import CallKit import CallKit
@ -20,7 +21,7 @@ public final class CallKitIntegration {
return false return false
#else #else
if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) {
return Locale.current.regionCode?.lowercased() != "cn" && !(UserDefaults(suiteName: "group.app.swiftgram.ios")?.bool(forKey: "legacyNotificationsFix") ?? false) return Locale.current.regionCode?.lowercased() != "cn" && !(UserDefaults(suiteName: sgAppGroupIdentifier())?.bool(forKey: "legacyNotificationsFix") ?? false)
} else { } else {
return false return false
} }