Files
breez-sdk-liquid/lib/bindings/langs/swift/Sources/BreezSDKLiquid/SDKNotificationService.swift
Erdem Yerebasmaz f6fa503cb9 Flutter uniFFI (#510)
* Flutter uniffi

* Set on-demand resources

* Do not build non-uniffi libraries

* Change iosLibName

* Add BreezSDKLiquid as on demand resources

* Use downloaded framework

* Add Sources to published flutter package

* Set OTHER_LDFLAGS

* Add logging

* Refactor library initialization logic and throw an error if initialization fails

* Do not statically link framework on production

* Use uniFFI headers to generate FlutterBreezLiquidBindings

* Re add frb header

* Correct the library name

* Remove static_framework

* Move source header files

* Copy iOS podspecs to macOS folder

* Update version of macOS podspecs

* Remove Windows & Linux support

* Remove CMake scripts

* Remove breez_sdk_liquid.podspec from version script

* Cleanup older build scripts used by melos & just recipes

* Remove softlink & copy recipes

Add recipe descriptions

* Rename link-uniffi recipe to link-headers

Make sure headers are linked after uniffi is built
  - Remove just gen recipe
Add recipe descriptions

* Set package versions on production files as well when publishing

* Include bindings project on melos script hooks

* Flutter uniffi

* Set on-demand resources

* Do not build non-uniffi libraries

* Change iosLibName

* Add BreezSDKLiquid as on demand resources

* Use downloaded framework

* Add Sources to published flutter package

* Set OTHER_LDFLAGS

* Add logging

* Refactor library initialization logic and throw an error if initialization fails

* Do not statically link framework on production

* Use uniFFI headers to generate FlutterBreezLiquidBindings

* Re add frb header

* Correct the library name

* Remove static_framework

* Move source header files

* Copy iOS podspecs to macOS folder

* Update version of macOS podspecs

* Remove Windows & Linux support

* Remove CMake scripts

* Remove breez_sdk_liquid.podspec from version script

* Cleanup older build scripts used by melos & just recipes

* Remove softlink & copy recipes

Add recipe descriptions

* Rename link-uniffi recipe to link-headers

Make sure headers are linked after uniffi is built
  - Remove just gen recipe
Add recipe descriptions

* Set package versions on production files as well when publishing

* Include bindings project on melos script hooks

* chore: just version

* fix: remove unused files on "Set package version" step

* copy FFI header files

* [WIP] Add macOS support

* remove example app on Flutter plugin

* Link headers before running ffigen on CI workflow

* macOS: add macos/Sources folder to .gitignore

.

* macOS: Copy iOS sources to macOS sources after downloading bindings

* macOS: copy sources & framework file to macos folder on build-uniffi-swift script

* import breez_sdk_liquidFFI header on plugin file

Update flutter_breez_liquid.c

* cleanup header file artifacts

---------

Co-authored-by: Ross Savage <hello@satimoto.com>
2024-10-01 10:59:11 +03:00

95 lines
4.1 KiB
Swift

import UserNotifications
import os.log
open class SDKNotificationService: UNNotificationServiceExtension {
fileprivate let TAG = "SDKNotificationService"
var liquidSDK: BindingLiquidSdk?
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
var currentTask: TaskProtocol?
public var logger: ServiceLogger = ServiceLogger(logStream: nil)
override public init() { }
override open func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
self.logger.log(tag: TAG, line: "Notification received", level: "INFO")
self.contentHandler = contentHandler
self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
guard let connectRequest = self.getConnectRequest() else {
if let content = bestAttemptContent {
contentHandler(content)
}
return
}
if let currentTask = self.getTaskFromNotification() {
self.currentTask = currentTask
DispatchQueue.main.async { [self] in
do {
logger.log(tag: TAG, line: "Breez Liquid SDK is not connected, connecting...", level: "INFO")
liquidSDK = try BreezSDKLiquidConnector.register(connectRequest: connectRequest, listener: currentTask)
logger.log(tag: TAG, line: "Breez Liquid SDK connected successfully", level: "INFO")
try currentTask.start(liquidSDK: liquidSDK!)
} catch {
logger.log(tag: TAG, line: "Breez Liquid SDK connection failed \(error)", level: "ERROR")
shutdown()
}
}
}
}
open func getConnectRequest() -> ConnectRequest? {
return nil
}
open func getTaskFromNotification() -> TaskProtocol? {
guard let content = bestAttemptContent else { return nil }
guard let notificationType = content.userInfo[Constants.MESSAGE_DATA_TYPE] as? String else { return nil }
self.logger.log(tag: TAG, line: "Notification payload: \(content.userInfo)", level: "INFO")
self.logger.log(tag: TAG, line: "Notification type: \(notificationType)", level: "INFO")
guard let payload = content.userInfo[Constants.MESSAGE_DATA_PAYLOAD] as? String else {
contentHandler!(content)
return nil
}
self.logger.log(tag: TAG, line: "\(notificationType) data string: \(payload)", level: "INFO")
switch(notificationType) {
case Constants.MESSAGE_TYPE_SWAP_UPDATED:
return SwapUpdatedTask(payload: payload, logger: self.logger, contentHandler: contentHandler, bestAttemptContent: bestAttemptContent)
case Constants.MESSAGE_TYPE_LNURL_PAY_INFO:
return LnurlPayInfoTask(payload: payload, logger: self.logger, contentHandler: contentHandler, bestAttemptContent: bestAttemptContent)
case Constants.MESSAGE_TYPE_LNURL_PAY_INVOICE:
return LnurlPayInvoiceTask(payload: payload, logger: self.logger, contentHandler: contentHandler, bestAttemptContent: bestAttemptContent)
default:
return nil
}
}
override open func serviceExtensionTimeWillExpire() {
self.logger.log(tag: TAG, line: "serviceExtensionTimeWillExpire()", level: "INFO")
// iOS calls this function just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content,
// otherwise the original push payload will be used.
self.shutdown()
}
private func shutdown() -> Void {
self.logger.log(tag: TAG, line: "shutting down...", level: "INFO")
BreezSDKLiquidConnector.unregister()
self.logger.log(tag: TAG, line: "task unregistered", level: "INFO")
self.currentTask?.onShutdown()
}
public func setServiceLogger(logger: Logger) {
self.logger = ServiceLogger(logStream: logger)
}
}