@tyrads.com/tyrads-sdk 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+ }
@@ -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
- if let url = URL(string: "https://example.com") {
23
- UIApplication.shared.open(url, options: [:], completionHandler: { _ in })
24
- }
24
+ Tyrads.instance.showOffers()
25
25
  }
26
26
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyrads.com/tyrads-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Tyrads SDK for React Native ",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/commonjs/index.js",