Skip to content

Commit

Permalink
Merge pull request #63 from SourcePointUSA/DIA-4058-refactor-ios-inte…
Browse files Browse the repository at this point in the history
…rface

DIA-4058 refactor ios interface
  • Loading branch information
Nevazhnovu authored Jul 4, 2024
2 parents 9972bef + 2a97fa2 commit aefd883
Show file tree
Hide file tree
Showing 17 changed files with 208 additions and 249 deletions.
170 changes: 71 additions & 99 deletions Assets/ConsentManagementProvider/Plugins/iOS/Source/SwiftBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ import UIKit
@objc public class SwiftBridge: NSObject {
public override init() {
config = Config(
gdprPmId: nil,
ccpaPmId: nil,
usnatPmId: nil,
transitionCCPAAuth: nil,
supportLegacyUSPString: nil,
vendors: [],
Expand Down Expand Up @@ -45,7 +42,6 @@ import UIKit
}

struct Config {
var gdprPmId, ccpaPmId, usnatPmId: String?
var transitionCCPAAuth, supportLegacyUSPString: Bool?
var vendors: [String] = []
var categories: [String] = []
Expand Down Expand Up @@ -73,6 +69,7 @@ import UIKit
var callbackOnSPFinished: СallbackCharMessage? = nil
var callbackOnSPUIFinished: СallbackCharMessage? = nil
var callbackOnCustomConsent: СallbackCharMessage? = nil
let callbacks = Callbacks()

// MARK: - Bridge config
@objc public func addTargetingParam(campaignType: Int, key: String, value: String){
Expand Down Expand Up @@ -107,15 +104,10 @@ import UIKit
gdpr: Bool,
ccpa: Bool,
usnat: Bool,
language: SPMessageLanguage,
gdprPmId: String,
ccpaPmId: String,
usnatPmId: String) {
self.config.gdprPmId = gdprPmId
self.config.ccpaPmId = ccpaPmId
self.config.usnatPmId = usnatPmId
language: String,
messageTimeoutInSeconds: Double) {
guard let propName = try? SPPropertyName(propertyName) else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "`propertyName` invalid!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "`propertyName` invalid!")
return
}
self.consentManager = { SPConsentManager(
Expand All @@ -128,9 +120,10 @@ import UIKit
usnat: usnat ? SPCampaign(targetingParams: usnatTargetingParams, transitionCCPAAuth: config.transitionCCPAAuth, supportLegacyUSPString: config.supportLegacyUSPString) : nil,
ios14: SPCampaign()
),
language: language,
language: SPMessageLanguage.init(rawValue: language) ?? SPMessageLanguage.BrowserDefault,
delegate: self
)}()
self.consentManager?.messageTimeoutInSeconds = messageTimeoutInSeconds
}

@objc public func addCustomVendor(vendor: String) {
Expand All @@ -152,23 +145,15 @@ import UIKit
}

@objc public func dispose() {
callbackDefault = nil
callbackOnConsentReady = nil
callbackOnConsentUIReady = nil
callbackOnConsentAction = nil
callbackOnConsentUIFinished = nil
callbackOnErrorCallback = nil
callbackOnSPFinished = nil
callbackOnSPUIFinished = nil
callbackOnCustomConsent = nil
callbacks.CleanCallbacks()
}

// MARK: - Manage lib
@objc public func loadMessage(authId: String? = nil) {
print("PURE SWIFT loadMessage with authId="+(authId ?? "nil"))
(consentManager != nil) ?
consentManager?.loadMessage(forAuthId: authId) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
}

@objc public func onClearConsentTap() {
Expand All @@ -177,33 +162,17 @@ import UIKit
myVendorAccepted = .Unknown
}

@objc public func onGDPRPrivacyManagerTap() {
if config.gdprPmId != nil {
(consentManager != nil) ?
consentManager?.loadGDPRPrivacyManager(withId: config.gdprPmId!) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Tried to load GDPR pm without gdpr pm id")
}
}

@objc public func onCCPAPrivacyManagerTap() {
if config.ccpaPmId != nil {
(consentManager != nil) ?
consentManager?.loadCCPAPrivacyManager(withId: config.ccpaPmId!) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Tried to load CCPA pm without ccpa pm id")
@objc public func loadPrivacyManager(campaignType: Int, pmId: String, tab: SPPrivacyManagerTab) {
guard let consentManager = consentManager else {
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
return
}
}

@objc public func onUSNATPrivacyManagerTap() {
if config.usnatPmId != nil {
(consentManager != nil) ?
consentManager?.loadUSNatPrivacyManager(withId: config.usnatPmId!) :
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Tried to load USNAT pm without usnat pm id")
switch CAMPAIGN_TYPE(rawValue: campaignType) {
case .GDPR: consentManager.loadGDPRPrivacyManager(withId: pmId, tab: tab)
case .CCPA: consentManager.loadCCPAPrivacyManager(withId: pmId, tab: tab)
case .USNAT: consentManager.loadUSNatPrivacyManager(withId: pmId, tab: tab)
case .IOS14: break
case .none: print("Incorrect campaignType on loadPrivacyManager")
}
}

Expand All @@ -214,10 +183,10 @@ import UIKit
categories: config.categories,
legIntCategories: config.legIntCategories){contents in
self.print(contents)
self.runCallback(callback: self.callbackOnCustomConsent, arg: contents.toJSON())
self.callbacks.RunCallback(callbackType: .OnCustomConsent, arg: contents.toJSON())
}
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
}
}

Expand All @@ -228,10 +197,10 @@ import UIKit
categories: config.categories,
legIntCategories: config.legIntCategories){contents in
self.print(contents)
self.runCallback(callback: self.callbackOnCustomConsent, arg: contents.toJSON())
self.callbacks.RunCallback(callbackType: .OnCustomConsent, arg: contents.toJSON())
}
} else {
self.runCallback(callback: self.callbackOnErrorCallback, arg: "Library was not initialized correctly!")
self.callbacks.RunCallback(callbackType: .OnErrorCallback, arg: "Library was not initialized correctly!")
}
}
}
Expand All @@ -243,7 +212,7 @@ extension SwiftBridge: SPDelegate {
controller.modalPresentationStyle = UIModalPresentationStyle.overFullScreen
top?.present(controller, animated: true)
logger.log("PURE SWIFT onSPUIReady")
runCallback(callback: callbackOnConsentUIReady, arg: "onSPUIReady")
callbacks.RunCallback(callbackType: .OnConsentUIReady, arg: "onSPUIReady")
}

public func onAction(_ action: SPAction, from controller: UIViewController) {
Expand All @@ -257,88 +226,91 @@ extension SwiftBridge: SPDelegate {
if let data = try? JSONEncoder().encode(responce) {
resp = String(data: data, encoding: .utf8) ?? ""
}
runCallback(callback: callbackOnConsentAction, arg: resp)
callbacks.RunCallback(callbackType: .OnConsentAction, arg: resp)
}

public func onSPUIFinished(_ controller: UIViewController) {
UIApplication.shared.firstKeyWindow?.rootViewController?.dismiss(animated: true)
logger.log("PURE SWIFT onSPUIFinished")
runCallback(callback: callbackOnSPUIFinished, arg: "onSPUIFinished")
callbacks.RunCallback(callbackType: .OnSPUIFinished, arg: "onSPUIFinished")
}

public func onConsentReady(userData: SPUserData) {
print("onConsentReady:", userData)
logger.log("PURE SWIFT onConsentReady")
runCallback(callback: callbackOnConsentReady, arg: userData.toJSON())
callbacks.RunCallback(callbackType: .OnConsentReady, arg: userData.toJSON())
}

public func onSPFinished(userData: SPUserData) {
logger.log("SDK DONE")
logger.log("PURE SWIFT onSPFinished")
runCallback(callback: callbackOnSPFinished, arg: userData.toJSON())
callbacks.RunCallback(callbackType: .OnSPFinished, arg: userData.toJSON())
}

public func onError(error: SPError) {
printLog("Something went wrong: ", error)
logger.log("PURE SWIFT onError")
runCallback(callback: callbackOnErrorCallback, arg: error.toJSON())
callbacks.RunCallback(callbackType: .OnErrorCallback, arg: error.toJSON())
}
}

// MARK: - Callback Set Up
extension SwiftBridge {
@objc public func setCallbackDefault(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackDefault")
callbackDefault = callback
}

@objc public func setCallbackOnConsentReady(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentReady")
callbackOnConsentReady = callback
@objc public func setCallback(callback: @escaping СallbackCharMessage, typeCallback: String) -> Void{
callbacks.AddCallback(callback: callback, callbackType: Callbacks.CallbackType.init(rawValue: typeCallback) ?? Callbacks.CallbackType.NotSet)
}

@objc public func setCallbackOnConsentUIReady(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentUIReady")
callbackOnConsentUIReady = callback
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
if OSLogger.defaultLevel == .debug {
printLog(items)
}
}
}

@objc public func setCallbackOnConsentAction(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentAction")
callbackOnConsentAction = callback
}

@objc public func setCallbackOnConsentUIFinished(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnConsentUIFinished")
callbackOnConsentUIFinished = callback
// MARK: - callbacks class
class Callbacks: NSObject {
public typealias СallbackCharMessage = @convention(c) (UnsafePointer<CChar>?) -> Void

enum CallbackType: String {
case NotSet = "CallbackNotSet"
case System = "System"
case Default = "Default"
case OnConsentReady = "OnConsentReady"
case OnConsentUIReady = "OnConsentUIReady"
case OnConsentAction = "OnConsentAction"
case OnConsentUIFinished = "OnConsentUIFinished"
case OnErrorCallback = "OnErrorCallback"
case OnSPFinished = "OnSPFinished"
case OnSPUIFinished = "OnSPUIFinished"
case OnCustomConsent = "OnCustomConsent"
}

var Callbacks: [CallbackType:CallbackSwift] = [:]

@objc public func setCallbackOnErrorCallback(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnErrorCallback")
callbackOnErrorCallback = callback
func AddCallback(callback: @escaping СallbackCharMessage, callbackType: CallbackType) {
printLog("Add callback type: \(callbackType.rawValue)")
Callbacks[callbackType] = CallbackSwift.init(callback: callback, callbackType: callbackType)
}
@objc public func setCallbackOnSPFinished(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnSPFinished")
callbackOnSPFinished = callback

func RunCallback(callbackType: CallbackType, arg: String?) {
printLog("Run callback type: \(callbackType.rawValue) Callback set up:\(String(Callbacks[callbackType] != nil))")
(Callbacks[callbackType]?.callback ?? printChar)(arg ?? "")
}

@objc public func setCallbackOnCustomConsent(callback: @escaping СallbackCharMessage) -> Void{
print("setCallbackOnCustomConsent")
callbackOnCustomConsent = callback
func CleanCallbacks() {
Callbacks = [:]
}
}

func runCallback(callback: СallbackCharMessage?, arg: String?) {
if callback != nil {
callback!(arg)
}else{
(callbackDefault ?? callbackSystem)("onError not set:"+(arg ?? ""))
}
}
public class CallbackSwift {
var callback: Callbacks.СallbackCharMessage
var callbackType: Callbacks.CallbackType

public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
if OSLogger.defaultLevel == .debug {
printLog(items)
}
init(
callback: @escaping Callbacks.СallbackCharMessage = printChar,
callbackType: Callbacks.CallbackType = .NotSet) {
self.callback = callback
self.callbackType = callbackType
}
}

Expand Down
67 changes: 7 additions & 60 deletions Assets/ConsentManagementProvider/Plugins/iOS/Source/Unity.mm
Original file line number Diff line number Diff line change
Expand Up @@ -12,52 +12,10 @@

extern "C"
{
void _setCallbackDefault (СallbackCharMessage callback){
void _setCallback (СallbackCharMessage callback, char* typeCallback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackDefaultWithCallback:callback];
}

void _setCallbackOnConsentReady (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentReadyWithCallback:callback];
}

void _setCallbackOnConsentUIReady (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentUIReadyWithCallback:callback];
}

void _setCallbackOnConsentAction (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentActionWithCallback:callback];
}

void _setCallbackOnConsentUIFinished (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnConsentUIFinishedWithCallback:callback];
}

void _setCallbackOnErrorCallback (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnErrorCallbackWithCallback:callback];
}

void _setCallbackOnSPFinished (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnSPFinishedWithCallback:callback];
}

void _setCallbackOnCustomConsent (СallbackCharMessage callback){
if (swiftBridge == nil)
swiftBridge = [[SwiftBridge alloc] init];
[swiftBridge setCallbackOnCustomConsentWithCallback:callback];
[swiftBridge setCallbackWithCallback:callback typeCallback:[NSString stringWithFormat:@"%s", typeCallback]];
}

void _initLib()
Expand All @@ -81,9 +39,9 @@ void _setSupportLegacyUSPString(bool value)
[swiftBridge setSupportLegacyUSPStringWithValue:value];
}

void _configLib(int accountId, int propertyId, char* propertyName, bool gdpr, bool ccpa, bool usnat, SPMessageLanguage language, char* gdprPmId, char* ccpaPmId, char* usnatPmId)
void _configLib(int accountId, int propertyId, char* propertyName, bool gdpr, bool ccpa, bool usnat, char* language, int messageTimeoutInSeconds)
{
[swiftBridge configLibWithAccountId:accountId propertyId:propertyId propertyName:[NSString stringWithFormat:@"%s", propertyName] gdpr:gdpr ccpa:ccpa usnat:usnat language:language gdprPmId:[NSString stringWithFormat:@"%s", gdprPmId] ccpaPmId:[NSString stringWithFormat:@"%s", ccpaPmId] usnatPmId:[NSString stringWithFormat:@"%s", usnatPmId]];
[swiftBridge configLibWithAccountId:accountId propertyId:propertyId propertyName:[NSString stringWithFormat:@"%s", propertyName] gdpr:gdpr ccpa:ccpa usnat:usnat language:[NSString stringWithFormat:@"%s", language] messageTimeoutInSeconds:messageTimeoutInSeconds];
}

void _loadMessage()
Expand All @@ -95,23 +53,12 @@ void _loadMessageWithAuthId(char * authId)
{
[swiftBridge loadMessageWithAuthId:[NSString stringWithFormat:@"%s", authId]];
}

void _loadGDPRPrivacyManager()
{
[swiftBridge onGDPRPrivacyManagerTap];
}

void _loadCCPAPrivacyManager()

void _loadPrivacyManager(int campaignType, char* pmId, int tab)
{
[swiftBridge onCCPAPrivacyManagerTap];
[swiftBridge loadPrivacyManagerWithCampaignType:campaignType pmId:[NSString stringWithFormat:@"%s", pmId] tab:(SPPrivacyManagerTab)tab];
}

void _loadUSNATPrivacyManager()
{
[swiftBridge onUSNATPrivacyManagerTap];
}


void _cleanConsent()
{
[swiftBridge onClearConsentTap];
Expand Down
Loading

0 comments on commit aefd883

Please sign in to comment.