rn-linkrunner 2.11.0 → 3.0.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/LinkrunnerSDK.podspec +1 -1
- package/android/build.gradle +1 -1
- package/android/src/main/java/io/linkrunner/LinkrunnerModule.kt +6 -1
- package/android/src/main/java/io/linkrunner/utils/ModelConverter.kt +27 -2
- package/ios/LinkrunnerSDK.swift +20 -0
- package/ios/Podfile +1 -1
- package/ios/Pods/LinkrunnerKit/LICENSE +21 -0
- package/ios/Pods/LinkrunnerKit/README.md +15 -0
- package/ios/Pods/LinkrunnerKit/Sources/Linkrunner/HmacSignatureGenerator.swift +95 -0
- package/ios/Pods/LinkrunnerKit/Sources/Linkrunner/Linkrunner.swift +1109 -0
- package/ios/Pods/LinkrunnerKit/Sources/Linkrunner/Models.swift +356 -0
- package/ios/Pods/LinkrunnerKit/Sources/Linkrunner/RequestSigningInterceptor.swift +110 -0
- package/ios/Pods/LinkrunnerKit/Sources/Linkrunner/SHA256.swift +12 -0
- package/ios/Pods/LinkrunnerKit/Sources/Linkrunner/SKAdNetworkService.swift +428 -0
- package/ios/Pods/Pods.xcodeproj/project.pbxproj +440 -0
- package/ios/Pods/Pods.xcodeproj/xcuserdata/shofiyabootwala.xcuserdatad/xcschemes/LinkrunnerKit.xcscheme +58 -0
- package/ios/Pods/Pods.xcodeproj/xcuserdata/shofiyabootwala.xcuserdatad/xcschemes/xcschememanagement.plist +16 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit-Info.plist +26 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit-dummy.m +5 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit-prefix.pch +12 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit-umbrella.h +16 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit.debug.xcconfig +17 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit.modulemap +6 -0
- package/ios/Pods/Target Support Files/LinkrunnerKit/LinkrunnerKit.release.xcconfig +17 -0
- package/lib/commonjs/index.js +6 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +6 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +5 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +8 -2
- package/src/types.ts +5 -0
package/LinkrunnerSDK.podspec
CHANGED
package/android/build.gradle
CHANGED
|
@@ -116,7 +116,7 @@ dependencies {
|
|
|
116
116
|
implementation 'com.facebook.react:react-android:0.80.0'
|
|
117
117
|
|
|
118
118
|
// Linkrunner SDK
|
|
119
|
-
implementation "io.linkrunner:android-sdk:
|
|
119
|
+
implementation "io.linkrunner:android-sdk:4.0.1"
|
|
120
120
|
|
|
121
121
|
// Kotlin standard libraries - use stable versions
|
|
122
122
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
|
|
@@ -329,7 +329,12 @@ class LinkrunnerModule(private val reactContext: ReactApplicationContext) : Reac
|
|
|
329
329
|
campaignDataMap.putString("groupName", campaignData.groupName)
|
|
330
330
|
campaignDataMap.putString("assetName", campaignData.assetName)
|
|
331
331
|
campaignDataMap.putString("assetGroupName", campaignData.assetGroupName)
|
|
332
|
-
|
|
332
|
+
campaignDataMap.putString("adNetworkCampaignId", campaignData.adNetworkCampaignId)
|
|
333
|
+
campaignDataMap.putString("adSetId", campaignData.adSetId)
|
|
334
|
+
campaignDataMap.putString("adSetName", campaignData.adSetName)
|
|
335
|
+
campaignDataMap.putString("adCreativeId", campaignData.adCreativeId)
|
|
336
|
+
campaignDataMap.putString("adCreativeName", campaignData.adCreativeName)
|
|
337
|
+
|
|
333
338
|
response.putMap("campaignData", campaignDataMap)
|
|
334
339
|
}
|
|
335
340
|
}
|
|
@@ -74,7 +74,27 @@ object ModelConverter {
|
|
|
74
74
|
data.assetGroupName?.let { assetGroupName ->
|
|
75
75
|
map.putString("assetGroupName", assetGroupName)
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
|
|
78
|
+
data.adNetworkCampaignId?.let { adNetworkCampaignId ->
|
|
79
|
+
map.putString("adNetworkCampaignId", adNetworkCampaignId)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
data.adSetId?.let { adSetId ->
|
|
83
|
+
map.putString("adSetId", adSetId)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
data.adSetName?.let { adSetName ->
|
|
87
|
+
map.putString("adSetName", adSetName)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
data.adCreativeId?.let { adCreativeId ->
|
|
91
|
+
map.putString("adCreativeId", adCreativeId)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
data.adCreativeName?.let { adCreativeName ->
|
|
95
|
+
map.putString("adCreativeName", adCreativeName)
|
|
96
|
+
}
|
|
97
|
+
|
|
78
98
|
data.assetName?.let { assetName ->
|
|
79
99
|
map.putString("assetName", assetName)
|
|
80
100
|
}
|
|
@@ -164,7 +184,12 @@ object ModelConverter {
|
|
|
164
184
|
campaignDataMap.putString("groupName", campaignData.groupName)
|
|
165
185
|
campaignDataMap.putString("assetName", campaignData.assetName)
|
|
166
186
|
campaignDataMap.putString("assetGroupName", campaignData.assetGroupName)
|
|
167
|
-
|
|
187
|
+
campaignDataMap.putString("adNetworkCampaignId", campaignData.adNetworkCampaignId)
|
|
188
|
+
campaignDataMap.putString("adSetId", campaignData.adSetId)
|
|
189
|
+
campaignDataMap.putString("adSetName", campaignData.adSetName)
|
|
190
|
+
campaignDataMap.putString("adCreativeId", campaignData.adCreativeId)
|
|
191
|
+
campaignDataMap.putString("adCreativeName", campaignData.adCreativeName)
|
|
192
|
+
|
|
168
193
|
map.putMap("campaignData", campaignDataMap)
|
|
169
194
|
}
|
|
170
195
|
}
|
package/ios/LinkrunnerSDK.swift
CHANGED
|
@@ -219,6 +219,26 @@ class LinkrunnerSDK: NSObject {
|
|
|
219
219
|
campaignDataMap["assetGroupName"] = assetGroupName
|
|
220
220
|
campaignDataMap["asset_group_name"] = assetGroupName
|
|
221
221
|
}
|
|
222
|
+
if let adNetworkCampaignId = campaignData.adNetworkCampaignId {
|
|
223
|
+
campaignDataMap["adNetworkCampaignId"] = adNetworkCampaignId
|
|
224
|
+
campaignDataMap["ad_network_campaign_id"] = adNetworkCampaignId
|
|
225
|
+
}
|
|
226
|
+
if let adSetId = campaignData.adSetId {
|
|
227
|
+
campaignDataMap["adSetId"] = adSetId
|
|
228
|
+
campaignDataMap["ad_set_id"] = adSetId
|
|
229
|
+
}
|
|
230
|
+
if let adSetName = campaignData.adSetName {
|
|
231
|
+
campaignDataMap["adSetName"] = adSetName
|
|
232
|
+
campaignDataMap["ad_set_name"] = adSetName
|
|
233
|
+
}
|
|
234
|
+
if let adCreativeId = campaignData.adCreativeId {
|
|
235
|
+
campaignDataMap["adCreativeId"] = adCreativeId
|
|
236
|
+
campaignDataMap["ad_creative_id"] = adCreativeId
|
|
237
|
+
}
|
|
238
|
+
if let adCreativeName = campaignData.adCreativeName {
|
|
239
|
+
campaignDataMap["adCreativeName"] = adCreativeName
|
|
240
|
+
campaignDataMap["ad_creative_name"] = adCreativeName
|
|
241
|
+
}
|
|
222
242
|
if let assetName = campaignData.assetName {
|
|
223
243
|
campaignDataMap["assetName"] = assetName
|
|
224
244
|
campaignDataMap["asset_name"] = assetName
|
package/ios/Podfile
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Linkrunner Private Limited
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Linkrunner iOS SDK
|
|
2
|
+
|
|
3
|
+
A Swift package for integrating Linkrunner functionality into your iOS applications.
|
|
4
|
+
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
For setup instructions, usage examples, and API reference, please visit:
|
|
8
|
+
|
|
9
|
+
[Linkrunner iOS SDK Documentation](https://docs.linkrunner.io/sdk/ios/installation)
|
|
10
|
+
|
|
11
|
+
## License
|
|
12
|
+
|
|
13
|
+
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
|
14
|
+
|
|
15
|
+
Copyright (c) 2025 Linkrunner Private Limited
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import CommonCrypto
|
|
3
|
+
|
|
4
|
+
public class HmacSignatureGenerator {
|
|
5
|
+
// MARK: - Constants
|
|
6
|
+
private static let HMAC_ALGORITHM = kCCHmacAlgSHA256
|
|
7
|
+
|
|
8
|
+
// MARK: - Properties
|
|
9
|
+
private let secretKey: String
|
|
10
|
+
private let keyId: String
|
|
11
|
+
|
|
12
|
+
// MARK: - Initialization
|
|
13
|
+
public init(secretKey: String, keyId: String) {
|
|
14
|
+
self.secretKey = secretKey
|
|
15
|
+
self.keyId = keyId
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// MARK: - Models
|
|
19
|
+
public struct SignedRequest {
|
|
20
|
+
public let signature: String
|
|
21
|
+
public let timestamp: Int64
|
|
22
|
+
public let keyId: String
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// MARK: - Public Methods
|
|
26
|
+
public func signRequest(
|
|
27
|
+
payload: String?,
|
|
28
|
+
timestamp: Int64 = Int64(Date().timeIntervalSince1970 * 1000),
|
|
29
|
+
onCanonicalString: ((String) -> Void)? = nil
|
|
30
|
+
) -> SignedRequest {
|
|
31
|
+
// Calculate content hash if payload exists, otherwise use empty string
|
|
32
|
+
let contentHash: String
|
|
33
|
+
if let payload = payload, !payload.isEmpty {
|
|
34
|
+
contentHash = sha256Hash(payload)
|
|
35
|
+
} else {
|
|
36
|
+
contentHash = ""
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Build the canonical string with timestamp and content hash
|
|
40
|
+
let stringToSign = buildCanonicalString(timestamp: timestamp, contentHash: contentHash)
|
|
41
|
+
onCanonicalString?(stringToSign)
|
|
42
|
+
// Generate the signature
|
|
43
|
+
let signature = generateHmac(data: stringToSign)
|
|
44
|
+
|
|
45
|
+
return SignedRequest(signature: signature, timestamp: timestamp, keyId: keyId)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// MARK: - Private Methods
|
|
49
|
+
private func buildCanonicalString(timestamp: Int64, contentHash: String) -> String {
|
|
50
|
+
return "\(timestamp)\n\(contentHash)"
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private func generateHmac(data: String) -> String {
|
|
54
|
+
guard let dataBytes = data.data(using: .utf8) else {
|
|
55
|
+
return ""
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Create a mutable pointer to hold the HMAC result
|
|
59
|
+
let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
|
|
60
|
+
var hmacResult = [UInt8](repeating: 0, count: digestLength)
|
|
61
|
+
|
|
62
|
+
// Calculate HMAC using a more compatible approach
|
|
63
|
+
let keyData = Data(secretKey.utf8)
|
|
64
|
+
|
|
65
|
+
keyData.withUnsafeBytes { keyBytes in
|
|
66
|
+
dataBytes.withUnsafeBytes { dataBytes in
|
|
67
|
+
let keyPtr = keyBytes.baseAddress?.assumingMemoryBound(to: UInt8.self)
|
|
68
|
+
let dataPtr = dataBytes.baseAddress?.assumingMemoryBound(to: UInt8.self)
|
|
69
|
+
|
|
70
|
+
CCHmac(
|
|
71
|
+
CCHmacAlgorithm(kCCHmacAlgSHA256),
|
|
72
|
+
keyPtr, keyBytes.count,
|
|
73
|
+
dataPtr, dataBytes.count,
|
|
74
|
+
&hmacResult
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Convert to base64
|
|
80
|
+
let hmacData = Data(hmacResult)
|
|
81
|
+
return hmacData.base64EncodedString()
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private func sha256Hash(_ data: String) -> String {
|
|
85
|
+
guard let dataBytes = data.data(using: .utf8) else { return "" }
|
|
86
|
+
|
|
87
|
+
var hashBytes = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
|
|
88
|
+
dataBytes.withUnsafeBytes { buffer in
|
|
89
|
+
_ = CC_SHA256(buffer.baseAddress, CC_LONG(buffer.count), &hashBytes)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let hashData = Data(hashBytes)
|
|
93
|
+
return hashData.base64EncodedString()
|
|
94
|
+
}
|
|
95
|
+
}
|