From eb23f2f8aae3ea3c712ca5d0a4fb0905c3ddfada Mon Sep 17 00:00:00 2001 From: QSD_faris Date: Tue, 20 Feb 2024 16:58:23 +0100 Subject: [PATCH 1/3] fix user properties, update script --- Sources/Data/User.swift | 10 +++++----- Sources/WebView.swift | 12 +++--------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Sources/Data/User.swift b/Sources/Data/User.swift index c54ced4..1380e21 100644 --- a/Sources/Data/User.swift +++ b/Sources/Data/User.swift @@ -10,18 +10,18 @@ import Foundation public class User: Codable, Equatable { public var name: String? = nil - public var firstName: String? = nil - public var lastName: String? = nil + public var first_name: String? = nil + public var last_name: String? = nil public var email: String? = nil public init(name: String? = nil, firstName: String? = nil, lastName: String? = nil, email: String? = nil) { self.name = name - self.firstName = firstName - self.lastName = lastName + self.first_name = firstName + self.last_name = lastName self.email = email } public static func == (lhs: User, rhs: User) -> Bool { - return lhs.name == rhs.name && lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName && lhs.email == rhs.email + return lhs.name == rhs.name && lhs.first_name == rhs.first_name && lhs.last_name == rhs.last_name && lhs.email == rhs.email } } diff --git a/Sources/WebView.swift b/Sources/WebView.swift index 9b66c82..50d68f3 100644 --- a/Sources/WebView.swift +++ b/Sources/WebView.swift @@ -310,7 +310,7 @@ private enum InjectionScripts { window.DESKPRO_MESSENGER_OPTIONS = { showLauncherButton: false, openOnInit: true, - userInfo: { name: "john" }, + userInfo: window.webkit.messageHandlers.iosListener.postMessage("\(PostMessageFunctions.getUserInfo)"), signedUserInfo: undefined, launcherButtonConfig: undefined, messengerAppConfig: undefined, @@ -322,7 +322,7 @@ private enum InjectionScripts { ready: async (messengerId) => { const data = await window.DESKPRO_MESSENGER_CONNECTION.childMethods?.init(messengerId, { showLauncherButton: DESKPRO_MESSENGER_OPTIONS.showLauncherButton, - user: window.DESKPRO_MESSENGER_OPTIONS?.userInfo, + userInfo: window.DESKPRO_MESSENGER_OPTIONS?.userInfo, launcherButtonConfig: DESKPRO_MESSENGER_OPTIONS.launcherButtonConfig, messengerAppConfig: DESKPRO_MESSENGER_OPTIONS.messengerAppConfig, parentViewHeight: "fullscreen", @@ -342,13 +342,7 @@ private enum InjectionScripts { getViewHeight: async (messengerId) => { return "fullscreen"; }, - getUserInfo: async (messengerId) => { - window.webkit.messageHandlers.iosListener.postMessage("\(PostMessageFunctions.getUserInfo)") - .then(response => { - //alert(response); - }) - }, - getUserJwtToken: async (messengerId) => { + getSignedUserInfo: async (messengerId) => { window.webkit.messageHandlers.iosListener.postMessage("\(PostMessageFunctions.getUserJwtToken)") .then(response => { //alert(response); From fba94d11fd01b7dac36627f0777cf5f8a0b2a1e8 Mon Sep 17 00:00:00 2001 From: QSD_faris Date: Thu, 14 Mar 2024 13:32:31 +0100 Subject: [PATCH 2/3] add new script changes --- Sources/WebView.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Sources/WebView.swift b/Sources/WebView.swift index 50d68f3..fb8ed16 100644 --- a/Sources/WebView.swift +++ b/Sources/WebView.swift @@ -325,7 +325,7 @@ private enum InjectionScripts { userInfo: window.DESKPRO_MESSENGER_OPTIONS?.userInfo, launcherButtonConfig: DESKPRO_MESSENGER_OPTIONS.launcherButtonConfig, messengerAppConfig: DESKPRO_MESSENGER_OPTIONS.messengerAppConfig, - parentViewHeight: "fullscreen", + parentViewDimensions: "fullscreen", open: DESKPRO_MESSENGER_OPTIONS.openOnInit, }); @@ -339,7 +339,7 @@ private enum InjectionScripts { token: deviceToken }); }, - getViewHeight: async (messengerId) => { + getViewDimensions: async (messengerId) => { return "fullscreen"; }, getSignedUserInfo: async (messengerId) => { @@ -352,7 +352,7 @@ private enum InjectionScripts { const { width, height } = data; }, close: async (messengerId, data) => { - window.webkit.messageHandlers.iosListener.postMessage("\(PostMessageFunctions.closeWebView)") + const result = await window.webkit.messageHandlers.iosListener.postMessage("\(PostMessageFunctions.closeWebView)") }, appEvent: async (messengerId, event) => { //alert(event.id) @@ -363,4 +363,8 @@ private enum InjectionScripts { childMethods: undefined, }; """ + + static let logoutScript = """ + window.DESKPRO_MESSENGER_CONNECTION.childMethods.logout("1"); + """ } From afc204508b8d253f6df96788f12b98fe811a408b Mon Sep 17 00:00:00 2001 From: QSD_faris Date: Thu, 14 Mar 2024 14:17:20 +0100 Subject: [PATCH 3/3] update swift example --- .../SwiftExample.xcodeproj/project.pbxproj | 77 ++++++++--- .../xcshareddata/swiftpm/Package.resolved | 121 +++++++++++++++++- .../SwiftExample/AppDelegate.swift | 95 ++++++++++++-- .../AppIcon.appiconset/Contents.json | 1 + .../AppIcon.appiconset/elephant-2.jpg | Bin 0 -> 47695 bytes .../elephant.imageset/Contents.json | 21 +++ .../elephant.imageset/elephant.svg | 1 + .../Base.lproj/LaunchScreen.storyboard | 30 ++++- .../SwiftExample/Base.lproj/Main.storyboard | 37 +++++- .../SwiftExample/GoogleService-Info.plist | 30 +++++ Examples/SwiftExample/SwiftExample/Info.plist | 12 ++ .../SwiftExample/SwiftExample.entitlements | 8 ++ .../SwiftExample/ViewController.swift | 55 +++++++- 13 files changed, 445 insertions(+), 43 deletions(-) create mode 100644 Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/elephant-2.jpg create mode 100644 Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/Contents.json create mode 100644 Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/elephant.svg create mode 100644 Examples/SwiftExample/SwiftExample/GoogleService-Info.plist create mode 100644 Examples/SwiftExample/SwiftExample/SwiftExample.entitlements diff --git a/Examples/SwiftExample/SwiftExample.xcodeproj/project.pbxproj b/Examples/SwiftExample/SwiftExample.xcodeproj/project.pbxproj index baa6312..4d6e640 100644 --- a/Examples/SwiftExample/SwiftExample.xcodeproj/project.pbxproj +++ b/Examples/SwiftExample/SwiftExample.xcodeproj/project.pbxproj @@ -7,13 +7,16 @@ objects = { /* Begin PBXBuildFile section */ - 5E19A4E92B71A0950056D784 /* messenger-sdk-ios in Frameworks */ = {isa = PBXBuildFile; productRef = 5E19A4E82B71A0950056D784 /* messenger-sdk-ios */; }; 5E19F5942B477AE400E37F55 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E19F5932B477AE400E37F55 /* AppDelegate.swift */; }; 5E19F5962B477AE400E37F55 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E19F5952B477AE400E37F55 /* SceneDelegate.swift */; }; 5E19F5982B477AE400E37F55 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E19F5972B477AE400E37F55 /* ViewController.swift */; }; 5E19F59B2B477AE400E37F55 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E19F5992B477AE400E37F55 /* Main.storyboard */; }; 5E19F59D2B477AE400E37F55 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E19F59C2B477AE400E37F55 /* Assets.xcassets */; }; 5E19F5A02B477AE400E37F55 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5E19F59E2B477AE400E37F55 /* LaunchScreen.storyboard */; }; + 5E66BF0C2B7FB63100FAF349 /* messenger-sdk-ios in Frameworks */ = {isa = PBXBuildFile; productRef = 5E66BF0B2B7FB63100FAF349 /* messenger-sdk-ios */; }; + 5EE6D3A52BA3196B008A6DD3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5EE6D3A42BA3196B008A6DD3 /* GoogleService-Info.plist */; }; + 5EF899182B728D75005547BC /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 5EF899172B728D75005547BC /* FirebaseAnalytics */; }; + 5EF899422B728D75005547BC /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = 5EF899412B728D75005547BC /* FirebaseMessaging */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -38,6 +41,8 @@ 5E19F59C2B477AE400E37F55 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 5E19F59F2B477AE400E37F55 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 5E19F5A12B477AE400E37F55 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5EE6D3A42BA3196B008A6DD3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../Downloads/GoogleService-Info.plist"; sourceTree = ""; }; + 5EF898E22B726952005547BC /* SwiftExample.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SwiftExample.entitlements; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -45,7 +50,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5E19A4E92B71A0950056D784 /* messenger-sdk-ios in Frameworks */, + 5EF899182B728D75005547BC /* FirebaseAnalytics in Frameworks */, + 5EF899422B728D75005547BC /* FirebaseMessaging in Frameworks */, + 5E66BF0C2B7FB63100FAF349 /* messenger-sdk-ios in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -71,6 +78,7 @@ 5E19F5922B477AE400E37F55 /* SwiftExample */ = { isa = PBXGroup; children = ( + 5EF898E22B726952005547BC /* SwiftExample.entitlements */, 5E19F5932B477AE400E37F55 /* AppDelegate.swift */, 5E19F5952B477AE400E37F55 /* SceneDelegate.swift */, 5E19F5972B477AE400E37F55 /* ViewController.swift */, @@ -78,6 +86,7 @@ 5E19F59C2B477AE400E37F55 /* Assets.xcassets */, 5E19F59E2B477AE400E37F55 /* LaunchScreen.storyboard */, 5E19F5A12B477AE400E37F55 /* Info.plist */, + 5EE6D3A42BA3196B008A6DD3 /* GoogleService-Info.plist */, ); path = SwiftExample; sourceTree = ""; @@ -100,7 +109,9 @@ ); name = SwiftExample; packageProductDependencies = ( - 5E19A4E82B71A0950056D784 /* messenger-sdk-ios */, + 5EF899172B728D75005547BC /* FirebaseAnalytics */, + 5EF899412B728D75005547BC /* FirebaseMessaging */, + 5E66BF0B2B7FB63100FAF349 /* messenger-sdk-ios */, ); productName = SwiftExample; productReference = 5E19F5902B477AE400E37F55 /* SwiftExample.app */; @@ -131,7 +142,8 @@ ); mainGroup = 5E19F5872B477AE400E37F55; packageReferences = ( - 5E19A4E72B71A0950056D784 /* XCRemoteSwiftPackageReference "messenger-sdk-ios" */, + 5EF899162B728D75005547BC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + 5E66BF0A2B7FB63100FAF349 /* XCRemoteSwiftPackageReference "messenger-sdk-ios" */, ); productRefGroup = 5E19F5912B477AE400E37F55 /* Products */; projectDirPath = ""; @@ -148,6 +160,7 @@ buildActionMask = 2147483647; files = ( 5E19F5A02B477AE400E37F55 /* LaunchScreen.storyboard in Resources */, + 5EE6D3A52BA3196B008A6DD3 /* GoogleService-Info.plist in Resources */, 5E19F59D2B477AE400E37F55 /* Assets.xcassets in Resources */, 5E19F59B2B477AE400E37F55 /* Main.storyboard in Resources */, ); @@ -307,34 +320,39 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = SwiftExample/SwiftExample.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 49M8DX7784; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = HC9N5Z797X; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/SwiftExample", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SwiftExample/Info.plist; + INFOPLIST_KEY_NSCameraUsageDescription = "This app requires camera access to take photos for uploading images directly from the camera."; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "This app requires microphone access to record audio for video uploads directly from the camera."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 0.0.1; - PRODUCT_BUNDLE_IDENTIFIER = com.SwiftExample; + PRODUCT_BUNDLE_IDENTIFIER = HC9N5Z797X.com.deskpro.mobile.ios; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Debug; }; @@ -343,34 +361,39 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = SwiftExample/SwiftExample.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 49M8DX7784; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = HC9N5Z797X; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/SwiftExample", ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SwiftExample/Info.plist; + INFOPLIST_KEY_NSCameraUsageDescription = "This app requires camera access to take photos for uploading images directly from the camera."; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "This app requires microphone access to record audio for video uploads directly from the camera."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 0.0.1; - PRODUCT_BUNDLE_IDENTIFIER = com.SwiftExample; + PRODUCT_BUNDLE_IDENTIFIER = HC9N5Z797X.com.deskpro.mobile.ios; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Release; }; @@ -398,22 +421,40 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 5E19A4E72B71A0950056D784 /* XCRemoteSwiftPackageReference "messenger-sdk-ios" */ = { + 5E66BF0A2B7FB63100FAF349 /* XCRemoteSwiftPackageReference "messenger-sdk-ios" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/deskpro/messenger-sdk-ios.git"; + requirement = { + kind = exactVersion; + version = 0.0.10; + }; + }; + 5EF899162B728D75005547BC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 0.0.7; + minimumVersion = 10.20.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 5E19A4E82B71A0950056D784 /* messenger-sdk-ios */ = { + 5E66BF0B2B7FB63100FAF349 /* messenger-sdk-ios */ = { isa = XCSwiftPackageProductDependency; - package = 5E19A4E72B71A0950056D784 /* XCRemoteSwiftPackageReference "messenger-sdk-ios" */; + package = 5E66BF0A2B7FB63100FAF349 /* XCRemoteSwiftPackageReference "messenger-sdk-ios" */; productName = "messenger-sdk-ios"; }; + 5EF899172B728D75005547BC /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5EF899162B728D75005547BC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + 5EF899412B728D75005547BC /* FirebaseMessaging */ = { + isa = XCSwiftPackageProductDependency; + package = 5EF899162B728D75005547BC /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseMessaging; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 5E19F5882B477AE400E37F55 /* Project object */; diff --git a/Examples/SwiftExample/SwiftExample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/SwiftExample/SwiftExample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 6e18c34..f944a0c 100644 --- a/Examples/SwiftExample/SwiftExample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Examples/SwiftExample/SwiftExample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,12 +1,129 @@ { "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c", + "version" : "1.2022062300.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "3e464dad87dad2d29bb29a97836789bf0f8f67d2", + "version" : "10.18.1" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk.git", + "state" : { + "revision" : "b880ec8ec927a838c51c12862c6222c30d7097d7", + "version" : "10.20.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "ceec9f28dea12b7cf3dabf18b5ed7621c88fd4aa", + "version" : "10.20.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "a732a4b47f59e4f725a2ea10f0c77e93a7131117", + "version" : "9.3.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "bc27fad73504f3d4af235de451f02ee22586ebd3", + "version" : "7.12.1" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "a673bc2937fbe886dd1f99c401b01b6d977a9c98", + "version" : "1.49.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "76135c9f4e1ac85459d5fec61b6f76ac47ab3a4c", + "version" : "3.3.1" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "9d108e9112aa1d65ce508facf804674546116d9c", + "version" : "1.22.3" + } + }, { "identity" : "messenger-sdk-ios", "kind" : "remoteSourceControl", "location" : "https://github.com/deskpro/messenger-sdk-ios.git", "state" : { - "revision" : "0638f13a32f5781145a3a18dc553e9f181aafe85", - "version" : "0.0.7" + "revision" : "fba94d11fd01b7dac36627f0777cf5f8a0b2a1e8", + "version" : "0.0.10" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692", + "version" : "2.30909.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e", + "version" : "2.3.1" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "65e8f29b2d63c4e38e736b25c27b83e012159be8", + "version" : "1.25.2" } } ], diff --git a/Examples/SwiftExample/SwiftExample/AppDelegate.swift b/Examples/SwiftExample/SwiftExample/AppDelegate.swift index 0c70830..5bd244a 100644 --- a/Examples/SwiftExample/SwiftExample/AppDelegate.swift +++ b/Examples/SwiftExample/SwiftExample/AppDelegate.swift @@ -7,29 +7,106 @@ import UIKit import UserNotifications +import FirebaseCore +import FirebaseMessaging +import messenger_sdk_ios -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - +protocol PushNotificationDelegate: AnyObject, MessagingDelegate { + + func didRegisterForRemoteNotifications(withDeviceToken token: String, type: TokenType) +} +enum TokenType: String { + case apnsToken, fcmToken +} +@main +class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate { + + weak var pushNotificationDelegate: PushNotificationDelegate? + + var messenger: DeskPro? + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. + + FirebaseConfiguration.shared.setLoggerLevel(.debug) + FirebaseApp.configure() + + UNUserNotificationCenter.current().delegate = self + + Messaging.messaging().delegate = self + return true } - + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { - let hexString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() - print("Device token \(hexString)") + let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() + //print("token: \(token)") + //pushNotificationDelegate?.didRegisterForRemoteNotifications(withDeviceToken: token, type: .apnsToken) } - + + func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { + if let fcm = Messaging.messaging().fcmToken { + print("fcmToken: \(fcm)") + pushNotificationDelegate?.didRegisterForRemoteNotifications(withDeviceToken: fcm, type: .fcmToken) + } + } + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) } +} +extension AppDelegate: UNUserNotificationCenterDelegate { + + //triggered when the app is in the foreground + func userNotificationCenter(_ center: UNUserNotificationCenter, + willPresent notification: UNNotification) async + -> UNNotificationPresentationOptions { + let userInfo = notification.request.content.userInfo + + print(isValidNotification(userInfo: userInfo)) + return [[.alert, .sound]] + } + //triggered when notification is tapped + func userNotificationCenter(_ center: UNUserNotificationCenter, + didReceive response: UNNotificationResponse) async { + let userInfo = response.notification.request.content.userInfo + + print(isValidNotification(userInfo: userInfo)) + } + + //triggered sometimes, when app is in the background + func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + + if isValidNotification(userInfo: userInfo) { + + let center = UNUserNotificationCenter.current() + var identifiers: [String] = [] + center.getDeliveredNotifications(completionHandler: { notifications in + + for notification in notifications { + identifiers.append(notification.request.identifier) + } + + print("identifiers: \(identifiers.count)") + if identifiers.count > 1 { + print(identifiers) + identifiers.removeFirst() + print(identifiers) + center.removeDeliveredNotifications(withIdentifiers: identifiers) + } + + completionHandler(.newData) + }) + } + } + + func isValidNotification(userInfo: [AnyHashable: Any]) -> Bool { + return DeskPro.isDeskProPushNotification(data: userInfo) + } } - diff --git a/Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..4ab31e9 100644 --- a/Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "elephant-2.jpg", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/elephant-2.jpg b/Examples/SwiftExample/SwiftExample/Assets.xcassets/AppIcon.appiconset/elephant-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4af123adeeb4d299bdbe9a9466ee389f18e4e41a GIT binary patch literal 47695 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 literal 0 HcmV?d00001 diff --git a/Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/Contents.json b/Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/Contents.json new file mode 100644 index 0000000..fc9c047 --- /dev/null +++ b/Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "elephant.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/elephant.svg b/Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/elephant.svg new file mode 100644 index 0000000..a1e2b0d --- /dev/null +++ b/Examples/SwiftExample/SwiftExample/Assets.xcassets/elephant.imageset/elephant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Examples/SwiftExample/SwiftExample/Base.lproj/LaunchScreen.storyboard b/Examples/SwiftExample/SwiftExample/Base.lproj/LaunchScreen.storyboard index 865e932..0f16c38 100644 --- a/Examples/SwiftExample/SwiftExample/Base.lproj/LaunchScreen.storyboard +++ b/Examples/SwiftExample/SwiftExample/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,11 @@ - - + + + - + + + @@ -11,10 +14,21 @@ - + - + + + + + + + + + + + + @@ -22,4 +36,10 @@ + + + + + + diff --git a/Examples/SwiftExample/SwiftExample/Base.lproj/Main.storyboard b/Examples/SwiftExample/SwiftExample/Base.lproj/Main.storyboard index f874cee..2a33120 100644 --- a/Examples/SwiftExample/SwiftExample/Base.lproj/Main.storyboard +++ b/Examples/SwiftExample/SwiftExample/Base.lproj/Main.storyboard @@ -136,10 +136,10 @@ - + - +