@tyrads.com/tyrads-sdk 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +1 -1
- package/ios/Tyrads/AcmoConfig.swift +31 -0
- package/ios/Tyrads/InitModel.swift +46 -0
- package/ios/Tyrads/Tyrads.swift +151 -0
- package/ios/TyradsSdk.swift +3 -3
- package/package.json +1 -1
package/android/build.gradle
CHANGED
@@ -95,7 +95,7 @@ dependencies {
|
|
95
95
|
//noinspection GradleDynamicVersion
|
96
96
|
implementation "com.facebook.react:react-native:+"
|
97
97
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
98
|
-
implementation ("com.github.tyrads-com:tyrads-sdk-android:rnp-1.1.
|
98
|
+
implementation ("com.github.tyrads-com:tyrads-sdk-android:rnp-1.1.5")
|
99
99
|
|
100
100
|
}
|
101
101
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
//
|
2
|
+
// AcmoConfig.swift
|
3
|
+
// TyradsSdk
|
4
|
+
//
|
5
|
+
// Created by ibnShamas on 8/13/24.
|
6
|
+
//
|
7
|
+
|
8
|
+
import Foundation
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
struct AcmoConfig {
|
12
|
+
static let API_VERSION = "1.1"
|
13
|
+
static let BUILD_VERSION = "2"
|
14
|
+
static let SDK_VERSION = "\(API_VERSION).\(BUILD_VERSION)"
|
15
|
+
static let SDK_PLATFORM = "React Native"
|
16
|
+
static let BASE_URL = "https://api.tyrads.com/v\(API_VERSION)/"
|
17
|
+
static let TAG = "TyrAds SDK"
|
18
|
+
|
19
|
+
static let PRIMARY_COLOR = UIColor(red: 0/255, green: 36/255, blue: 51/255, alpha: 1)
|
20
|
+
static let PRIMARY_COLOR_LIGHT = UIColor(red: 153/255, green: 145/255, blue: 145/255, alpha: 1)
|
21
|
+
static let PRIMARY_COLOR_DARK = UIColor.black
|
22
|
+
|
23
|
+
static let SECONDARY_COLOR = UIColor(red: 44/255, green: 179/255, blue: 136/255, alpha: 1)
|
24
|
+
static let SECONDARY_COLOR_LIGHT = UIColor(red: 203/255, green: 235/255, blue: 207/255, alpha: 1)
|
25
|
+
static let SIDEBAR_BACKGROUND_COLOR_LIGHT = UIColor(white: 1, alpha: 0.54)
|
26
|
+
static let SIDEBAR_BACKGROUND_COLOR_DARK = UIColor(red: 17/255, green: 45/255, blue: 30/255, alpha: 1)
|
27
|
+
static let APPBAR_BG = UIColor(red: 0/255, green: 33/255, blue: 48/255, alpha: 1)
|
28
|
+
|
29
|
+
// Note: ThemeMode.light doesn't have a direct equivalent in iOS
|
30
|
+
// You would typically handle this in your app's theme configuration
|
31
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
//
|
2
|
+
// InitModel.swift
|
3
|
+
// TyradsSdk
|
4
|
+
//
|
5
|
+
// Created by ibnShamas on 8/13/24.
|
6
|
+
//
|
7
|
+
|
8
|
+
import Foundation
|
9
|
+
|
10
|
+
struct AcmoInitModel: Codable {
|
11
|
+
let data: Data
|
12
|
+
}
|
13
|
+
|
14
|
+
struct Data: Codable {
|
15
|
+
let newRegisteredUser: Bool
|
16
|
+
let user: User
|
17
|
+
let publisherApp: PublisherApp
|
18
|
+
|
19
|
+
enum CodingKeys: String, CodingKey {
|
20
|
+
case newRegisteredUser = "newRegisteredUser"
|
21
|
+
case user
|
22
|
+
case publisherApp
|
23
|
+
}
|
24
|
+
|
25
|
+
init(from decoder: Decoder) throws {
|
26
|
+
let container = try decoder.container(keyedBy: CodingKeys.self)
|
27
|
+
newRegisteredUser = try container.decodeIfPresent(Bool.self, forKey: .newRegisteredUser) ?? false
|
28
|
+
user = try container.decode(User.self, forKey: .user)
|
29
|
+
publisherApp = try container.decode(PublisherApp.self, forKey: .publisherApp)
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
struct User: Codable {
|
34
|
+
let publisherUserId: String
|
35
|
+
}
|
36
|
+
|
37
|
+
struct PublisherApp: Codable {
|
38
|
+
let headerColor: String
|
39
|
+
let mainColor: String
|
40
|
+
|
41
|
+
init(from decoder: Decoder) throws {
|
42
|
+
let container = try decoder.container(keyedBy: CodingKeys.self)
|
43
|
+
headerColor = try container.decodeIfPresent(String.self, forKey: .headerColor) ?? ""
|
44
|
+
mainColor = try container.decodeIfPresent(String.self, forKey: .mainColor) ?? ""
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,151 @@
|
|
1
|
+
import Foundation
|
2
|
+
import UIKit
|
3
|
+
import AppTrackingTransparency
|
4
|
+
import AdSupport
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
/// The TyradsSdk class provides methods for configuring the SDK and displaying offers.
|
9
|
+
public class Tyrads {
|
10
|
+
/// Shared instance of the TyradsSdk.
|
11
|
+
public static let instance = Tyrads()
|
12
|
+
|
13
|
+
private var apiKey: String = ""
|
14
|
+
private var apiSecret: String = ""
|
15
|
+
private var publisherUserID: String = ""
|
16
|
+
private var newUser: Bool = false
|
17
|
+
private var loginData: AcmoInitModel?
|
18
|
+
var initializationWait = DispatchSemaphore(value: 0)
|
19
|
+
private var debugMode: Bool = false
|
20
|
+
|
21
|
+
private func log(_ message: String) {
|
22
|
+
if debugMode {
|
23
|
+
NSLog(message)
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
/// Configures the Tyrads SDK with the provided API key and secret key.
|
28
|
+
///
|
29
|
+
/// - Parameters:
|
30
|
+
/// - apiKey: The API key provided by Tyrads.
|
31
|
+
/// - secretKey: The secret key provided by Tyrads.
|
32
|
+
@objc public func configure( apiKey: String, secretKey: String, debugMode: Bool = false) {
|
33
|
+
self.apiKey = apiKey
|
34
|
+
self.apiSecret = secretKey
|
35
|
+
self.debugMode = debugMode
|
36
|
+
}
|
37
|
+
|
38
|
+
/// Logs in the user with the provided user ID or retrieves the user ID from UserDefaults.
|
39
|
+
///
|
40
|
+
/// - Parameter userID: Optional. The user ID to log in with. If nil, the SDK will attempt to retrieve the user ID from UserDefaults.
|
41
|
+
@objc public func loginUser(_ userID: String? = nil) {
|
42
|
+
do {
|
43
|
+
let userId = userID ?? UserDefaults.standard.string(forKey: "acmo-tyrads-sdk-user-id") ?? ""
|
44
|
+
|
45
|
+
let identifierType = "IDFA"
|
46
|
+
var advertisingId = ""
|
47
|
+
if #available(iOS 14, *) {
|
48
|
+
log("Requesting tracking authorization for iOS 14+")
|
49
|
+
ATTrackingManager.requestTrackingAuthorization { status in
|
50
|
+
switch status {
|
51
|
+
case .authorized:
|
52
|
+
advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString
|
53
|
+
self.log("Tracking authorized. Advertising ID: \(advertisingId)")
|
54
|
+
case .denied:
|
55
|
+
advertisingId = ""
|
56
|
+
self.log("Tracking denied")
|
57
|
+
case .restricted:
|
58
|
+
advertisingId = ""
|
59
|
+
self.log("Tracking restricted")
|
60
|
+
case .notDetermined:
|
61
|
+
advertisingId = ""
|
62
|
+
self.log("Tracking not determined")
|
63
|
+
@unknown default:
|
64
|
+
self.log("Unknown tracking status")
|
65
|
+
}
|
66
|
+
}
|
67
|
+
} else {
|
68
|
+
advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString
|
69
|
+
log("iOS version < 14. Advertising ID: \(advertisingId)")
|
70
|
+
}
|
71
|
+
let fd: [String: Any] = [
|
72
|
+
"publisherUserId": userId,
|
73
|
+
"platform": "iOS",
|
74
|
+
"identifierType": identifierType,
|
75
|
+
"identifier": advertisingId
|
76
|
+
]
|
77
|
+
|
78
|
+
log("Initializing with data: \(fd)")
|
79
|
+
|
80
|
+
guard let url = URL(string: AcmoConfig.BASE_URL + "initialize") else {
|
81
|
+
log("Failed to create URL")
|
82
|
+
return
|
83
|
+
}
|
84
|
+
|
85
|
+
var request = URLRequest(url: url)
|
86
|
+
request.httpMethod = "POST"
|
87
|
+
request.setValue(AcmoConfig.SDK_PLATFORM, forHTTPHeaderField: "X-SDK-Platform")
|
88
|
+
request.setValue(AcmoConfig.SDK_VERSION, forHTTPHeaderField: "X-SDK-Version")
|
89
|
+
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
90
|
+
request.setValue(self.apiKey, forHTTPHeaderField: "X-API-Key")
|
91
|
+
request.setValue(self.apiSecret, forHTTPHeaderField: "X-API-Secret")
|
92
|
+
|
93
|
+
do {
|
94
|
+
request.httpBody = try JSONSerialization.data(withJSONObject: fd)
|
95
|
+
} catch {
|
96
|
+
log("Failed to serialize request body: \(error)")
|
97
|
+
return
|
98
|
+
}
|
99
|
+
|
100
|
+
let task = URLSession.shared.dataTask(with: request) { data, response, error in
|
101
|
+
|
102
|
+
if let error = error {
|
103
|
+
self.log("Network request failed: \(error)")
|
104
|
+
return
|
105
|
+
}
|
106
|
+
|
107
|
+
guard let data = data else {
|
108
|
+
self.log("No data received from the server")
|
109
|
+
return
|
110
|
+
}
|
111
|
+
|
112
|
+
if let responseString = String(data: data, encoding: .utf8) {
|
113
|
+
self.log("Received response: \(responseString)")
|
114
|
+
|
115
|
+
let jsonData = responseString.data(using: .utf8)!
|
116
|
+
let decoder = JSONDecoder()
|
117
|
+
guard let acmoInitModel = try? decoder.decode(AcmoInitModel.self, from: jsonData) else {
|
118
|
+
self.log("Failed to decode response")
|
119
|
+
return
|
120
|
+
}
|
121
|
+
self.loginData = acmoInitModel
|
122
|
+
self.publisherUserID = self.loginData?.data.user.publisherUserId ?? ""
|
123
|
+
self.newUser = self.loginData?.data.newRegisteredUser ?? false
|
124
|
+
self.log("Login successful. Publisher User ID: \(self.publisherUserID), New User: \(self.newUser)")
|
125
|
+
self.initializationWait.signal()
|
126
|
+
}
|
127
|
+
|
128
|
+
|
129
|
+
}
|
130
|
+
|
131
|
+
task.resume()
|
132
|
+
log("Network request started")
|
133
|
+
|
134
|
+
|
135
|
+
} catch {
|
136
|
+
log("An error occurred: \(error)")
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
|
141
|
+
|
142
|
+
/// Shows the Tyrads offer wall.
|
143
|
+
@objc public func showOffers() {
|
144
|
+
self.initializationWait.wait()
|
145
|
+
let urlString: String = "https://websdk.tyrads.com/?apiKey=\(Tyrads.instance.apiKey)&apiSecret=\(Tyrads.instance.apiSecret)&userID=\(Tyrads.instance.publisherUserID)&newUser=\(Tyrads.instance.newUser)&platform=\(AcmoConfig.SDK_PLATFORM)&hc=\(Tyrads.instance.loginData?.data.publisherApp.headerColor ?? "")&mc=\(Tyrads.instance.loginData?.data.publisherApp.mainColor ?? "")";
|
146
|
+
|
147
|
+
if let url = URL(string: urlString) {
|
148
|
+
UIApplication.shared.open(url, options: [:], completionHandler: { _ in })
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
package/ios/TyradsSdk.swift
CHANGED
@@ -8,19 +8,19 @@ class TyradsSdk: NSObject {
|
|
8
8
|
@objc
|
9
9
|
func `init`(_ apiKey: String, secretKey: String) {
|
10
10
|
NSLog("TyradsModule: init called with apiKey: \(apiKey) and secretKey: \(secretKey)")
|
11
|
+
Tyrads.instance.configure(apiKey: apiKey, secretKey: secretKey)
|
11
12
|
}
|
12
13
|
|
13
14
|
@objc
|
14
15
|
func loginUser(_ userId: String) {
|
15
16
|
NSLog("TyradsModule: loginUser called with userId: \(userId)")
|
17
|
+
Tyrads.instance.loginUser(userId)
|
16
18
|
// Implement your login logic here
|
17
19
|
}
|
18
20
|
|
19
21
|
@objc
|
20
22
|
func showOffers() {
|
21
23
|
NSLog("TyradsModule: showOffers called")
|
22
|
-
|
23
|
-
UIApplication.shared.open(url, options: [:], completionHandler: { _ in })
|
24
|
-
}
|
24
|
+
Tyrads.instance.showOffers()
|
25
25
|
}
|
26
26
|
}
|