Skip to content

Commit 5afc90d

Browse files
author
TakayukiCho
committed
Merge release/2024.06.25T04.11.09 into master
2 parents efdd7ed + e6cfdd8 commit 5afc90d

File tree

13 files changed

+227
-8
lines changed

13 files changed

+227
-8
lines changed

.spm-version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.15.0
1+
2.16.0

CHANGELOG.md

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
| モジュール名 | Description | 最新のバージョン |
44
| :-- | :-- | :-- |
5-
| KarteCore | イベントトラッキング機能を提供します。 | 2.27.0 |
5+
| KarteCore | イベントトラッキング機能を提供します。 | 2.28.0 |
66
| KarteInAppMessaging | アプリ内メッセージ機能を提供します。 | 2.17.1 |
77
| KarteRemoteNotification | プッシュ通知の受信および効果測定機能を提供します。 | 2.11.0 |
88
| KarteVariables | 設定値配信機能を提供します。 | 2.10.0 |
@@ -11,13 +11,20 @@
1111
| KarteUtilities | KarteCore モジュール等が利用するUtility機能を提供します。通常直接参照する必要はありません。 | 3.12.0 |
1212
| KarteNotificationServiceExtension | リッチプッシュ通知機能を提供します。 | 1.2.0 |
1313

14+
# Releases - 2024.06.25
15+
## Version 2.16.0
16+
17+
### Core 2.28.0
18+
** 🔨CHANGED**
19+
- AppTrackingTransparencyの許諾状況をKARTE側に同期する機能を追加しました。
20+
1421
# Releases - 2024.06.13
1522
## Version 2.15.0
1623

1724
### CrashReporting 2.8.0
1825
** 🔨CHANGED**
1926
- Privacy manifestの設定を更新しました。
20-
27+
2128
### InAppMessaging 2.17.1
2229
** 💊FIXED**
2330
- 一部の別ライブラリと併用した場合にcrashする不具合を修正しました。

Karte.xcodeproj/project.pbxproj

+22-2
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@
343343
0CFD001924ECF53100598C8C /* TrackClientSessionMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFD001824ECF53100598C8C /* TrackClientSessionMock.swift */; };
344344
0CFD001D24ECF8BB00598C8C /* TrackClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFD001C24ECF8BB00598C8C /* TrackClientTests.swift */; };
345345
0CFD001F24ED08E800598C8C /* ReachabilityServiceMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CFD001E24ED08E800598C8C /* ReachabilityServiceMock.swift */; };
346+
142B4AEA2C2551DD0090ADDD /* ATTService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142B4AE92C2551DD0090ADDD /* ATTService.swift */; };
347+
142B4AEC2C25542C0090ADDD /* ATTStatusUpdatedSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142B4AEB2C25542C0090ADDD /* ATTStatusUpdatedSpec.swift */; };
348+
142B4AEE2C2554D00090ADDD /* ATTServiceSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142B4AED2C2554D00090ADDD /* ATTServiceSpec.swift */; };
346349
1E9A3C652949BBFD006B54D3 /* ApiKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A3C642949BBFD006B54D3 /* ApiKey.swift */; };
347350
1ECAFE542B5D3608003638E8 /* DecodingError+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ECAFE532B5D3608003638E8 /* DecodingError+Extension.swift */; };
348351
1EE766B7297546440040278E /* Karte-custom-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1EE766B6297544B60040278E /* Karte-custom-Info.plist */; };
@@ -931,6 +934,9 @@
931934
0CFD001824ECF53100598C8C /* TrackClientSessionMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackClientSessionMock.swift; sourceTree = "<group>"; };
932935
0CFD001C24ECF8BB00598C8C /* TrackClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackClientTests.swift; sourceTree = "<group>"; };
933936
0CFD001E24ED08E800598C8C /* ReachabilityServiceMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReachabilityServiceMock.swift; sourceTree = "<group>"; };
937+
142B4AE92C2551DD0090ADDD /* ATTService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ATTService.swift; sourceTree = "<group>"; };
938+
142B4AEB2C25542C0090ADDD /* ATTStatusUpdatedSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ATTStatusUpdatedSpec.swift; sourceTree = "<group>"; };
939+
142B4AED2C2554D00090ADDD /* ATTServiceSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ATTServiceSpec.swift; sourceTree = "<group>"; };
934940
1E9A3C642949BBFD006B54D3 /* ApiKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiKey.swift; sourceTree = "<group>"; };
935941
1ECAFE532B5D3608003638E8 /* DecodingError+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DecodingError+Extension.swift"; sourceTree = "<group>"; };
936942
1EE766B6297544B60040278E /* Karte-custom-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Karte-custom-Info.plist"; sourceTree = "<group>"; };
@@ -1814,6 +1820,7 @@
18141820
683762F8252F201D00E690CE /* SelectorDetector.swift */,
18151821
0C50509129C17ECA007C5C9B /* JailbreakDetection.swift */,
18161822
0C8392C02406C7750014C2BF /* CoreService.swift */,
1823+
142B4AE82C2551C90090ADDD /* ATT */,
18171824
0C8392582406C4260014C2BF /* AppInfo */,
18181825
1E9A3C632949BBFD006B54D3 /* ApiKey */,
18191826
0CE339AF23F39C9300E2EB98 /* AppKey */,
@@ -2157,6 +2164,7 @@
21572164
0CE792FF238653AD00F0D932 /* PluginNativeAppIdentifyEventSpec.swift */,
21582165
0CE79300238653AD00F0D932 /* ViewEventSpec.swift */,
21592166
0CE79301238653AD00F0D932 /* FetchVariablesEventSpec.swift */,
2167+
142B4AEB2C25542C0090ADDD /* ATTStatusUpdatedSpec.swift */,
21602168
0CE79302238653AD00F0D932 /* EventSpec.swift */,
21612169
0CE79303238653AD00F0D932 /* EventFieldNameSpec.swift */,
21622170
0CE79304238653AD00F0D932 /* IdentifyEventSpec.swift */,
@@ -2236,6 +2244,7 @@
22362244
isa = PBXGroup;
22372245
children = (
22382246
0CA52D5C2387BE9E00A575BC /* ConfigurationTests.swift */,
2247+
142B4AED2C2554D00090ADDD /* ATTServiceSpec.swift */,
22392248
6807B2AA251D80C900CDAB43 /* ExperimentalConfigurationTests.swift */,
22402249
0CA52D582387BE4C00A575BC /* OptOutConfigSpec.swift */,
22412250
0CA52D682387CC4D00A575BC /* VersionServiceSpec.swift */,
@@ -2276,6 +2285,14 @@
22762285
path = KarteVariablesTests;
22772286
sourceTree = "<group>";
22782287
};
2288+
142B4AE82C2551C90090ADDD /* ATT */ = {
2289+
isa = PBXGroup;
2290+
children = (
2291+
142B4AE92C2551DD0090ADDD /* ATTService.swift */,
2292+
);
2293+
path = ATT;
2294+
sourceTree = "<group>";
2295+
};
22792296
1E9A3C632949BBFD006B54D3 /* ApiKey */ = {
22802297
isa = PBXGroup;
22812298
children = (
@@ -3106,6 +3123,7 @@
31063123
0C69D41524EB9DC600D75893 /* TrackingTask.swift in Sources */,
31073124
0CE339EC23F39C9300E2EB98 /* AppKey.swift in Sources */,
31083125
36F3BC7824F8DAC1002D4382 /* LogAppender.swift in Sources */,
3126+
142B4AEA2C2551DD0090ADDD /* ATTService.swift in Sources */,
31093127
0C8392652406C54E0014C2BF /* SystemInfo.swift in Sources */,
31103128
0C8392BB2406C7010014C2BF /* JSONConvertible.swift in Sources */,
31113129
0C75093925007A7500624E3C /* OperationMode.swift in Sources */,
@@ -3316,6 +3334,7 @@
33163334
0C8392FD240822A40014C2BF /* EventNameSpec.swift in Sources */,
33173335
0CFD001D24ECF8BB00598C8C /* TrackClientTests.swift in Sources */,
33183336
0C69D41824EBA34500D75893 /* RegisterPushCommandSpec.swift in Sources */,
3337+
142B4AEC2C25542C0090ADDD /* ATTStatusUpdatedSpec.swift in Sources */,
33193338
0CFD001124EBD2DC00598C8C /* TrackCallbackSpec.swift in Sources */,
33203339
0C83931A240838050014C2BF /* InspectorSpec.swift in Sources */,
33213340
0C839312240831B30014C2BF /* LifecycleEventSpec.swift in Sources */,
@@ -3343,6 +3362,7 @@
33433362
68BBBCD524BB5156009A1CE0 /* IAMProcessSpec.swift in Sources */,
33443363
0CE79326238653AD00F0D932 /* Support.swift in Sources */,
33453364
680C29B52446B99200FB1363 /* TrackBodyParametersSpec.swift in Sources */,
3365+
142B4AEE2C2554D00090ADDD /* ATTServiceSpec.swift in Sources */,
33463366
0C8392F02407BF370014C2BF /* VisitorIdGeneratorMock.swift in Sources */,
33473367
0C8393112408319F0014C2BF /* IdentifySpec.swift in Sources */,
33483368
0CCFA7BB24A5D8D500E0F184 /* NotificationSettingsProviderMock.swift in Sources */,
@@ -3828,7 +3848,7 @@
38283848
"@executable_path/Frameworks",
38293849
"@loader_path/Frameworks",
38303850
);
3831-
MARKETING_VERSION = 2.27.0;
3851+
MARKETING_VERSION = 2.28.0;
38323852
PRODUCT_BUNDLE_IDENTIFIER = io.karte.KarteCore;
38333853
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
38343854
SKIP_INSTALL = YES;
@@ -3863,7 +3883,7 @@
38633883
"@executable_path/Frameworks",
38643884
"@loader_path/Frameworks",
38653885
);
3866-
MARKETING_VERSION = 2.27.0;
3886+
MARKETING_VERSION = 2.28.0;
38673887
PRODUCT_BUNDLE_IDENTIFIER = io.karte.KarteCore;
38683888
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
38693889
SKIP_INSTALL = YES;

KarteCore.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Pod::Spec.new do |s|
1010
s.name = 'KarteCore'
11-
s.version = '2.27.0'
11+
s.version = '2.28.0'
1212
s.summary = 'KARTE Core SDK'
1313
s.homepage = 'https://karte.io'
1414
s.author = { 'PLAID' => '[email protected]' }

KarteCore/Core/ATT/ATTService.swift

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//
2+
// Copyright 2024 PLAID, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// https://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
17+
import Foundation
18+
import AppTrackingTransparency
19+
20+
@available(iOS 14, *)
21+
internal class ATTService {
22+
static func getATTStatusLabel(attStatus: ATTrackingManager.AuthorizationStatus) -> String {
23+
switch attStatus {
24+
case .authorized:
25+
"authorized"
26+
case .restricted:
27+
"restricted"
28+
case .notDetermined:
29+
"notDetermined"
30+
case .denied:
31+
"denied"
32+
@unknown default:
33+
"unknown"
34+
}
35+
}
36+
37+
static func sendATTStatus(attStatus: ATTrackingManager.AuthorizationStatus) {
38+
let attStatusLabel = getATTStatusLabel(attStatus: attStatus)
39+
Tracker.track(event: Event(.attStatusUpdated(attStatus: attStatusLabel)))
40+
}
41+
}

KarteCore/Core/CoreService.swift

+7
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
import Foundation
1818
import KarteUtilities
19+
import AppTrackingTransparency
1920

2021
internal class CoreService {
2122
lazy var appInfo: AppInfo = {
2223
AppInfo()
2324
}()
25+
2426
lazy var pvService: PvService = {
2527
PvService()
2628
}()
@@ -116,6 +118,11 @@ internal class CoreService {
116118
visitorIdService.renew()
117119
}
118120

121+
@available(iOS 14, *)
122+
func sendATTStatus(attStatus: ATTrackingManager.AuthorizationStatus) {
123+
ATTService.sendATTStatus(attStatus: attStatus)
124+
}
125+
119126
func teardown() {
120127
visitorIdService.clean()
121128
versionService.clean()

KarteCore/KarteApp.swift

+18
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import KarteUtilities
1818
import UIKit
19+
import AppTrackingTransparency
1920

2021
/// KARTE SDKのエントリポイントであると共に、SDKの構成および依存ライブラリ等の管理を行うクラスです。
2122
///
@@ -164,6 +165,18 @@ public extension KarteApp {
164165
shared.renewVisitorId()
165166
}
166167

168+
/// AppTrackingTransparencyの許諾状況をKARTE側に送信します。
169+
///
170+
/// att_status_updatedというイベント経由で送信許諾状況を送信しています。
171+
///
172+
/// - Parameters:
173+
/// - attStatus: `ATTrackingManager.AuthorizationStatus`
174+
@available(iOS 14, *)
175+
@objc
176+
class func sendATTStatus(attStatus: ATTrackingManager.AuthorizationStatus) {
177+
shared.sendATTStatus(attStatus: attStatus)
178+
}
179+
167180
/// KARTE SDKの機能に関連するカスタムURLスキームを処理します。
168181
///
169182
/// なお初期化が行われていない状態で呼び出した場合はカスタムURLスキームの処理は行われません。
@@ -317,6 +330,11 @@ extension KarteApp {
317330
coreService?.renewVisitorId()
318331
}
319332

333+
@available(iOS 14, *)
334+
func sendATTStatus(attStatus: ATTrackingManager.AuthorizationStatus) {
335+
coreService?.sendATTStatus(attStatus: attStatus)
336+
}
337+
320338
func application(_ app: UIApplication, open url: URL) -> Bool {
321339
var handled = false
322340
for module in modules {

KarteCore/Tracking/Event/Event.swift

+10
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ public extension Event {
106106
case pluginNativeAppIdentify(subscribe: Bool, fcmToken: String?)
107107
/// `_fetch_variables` イベント
108108
case fetchVariables
109+
/// `att_status_updated`イベント
110+
case attStatusUpdated(attStatus: String)
109111

110112
/// 列挙子に応じた `イベント名` および `オブジェクト` を返します。
111113
func build() -> (EventName, [String: JSONValue]) {
@@ -185,6 +187,14 @@ public extension Event {
185187
name = .pluginNativeAppIdentify
186188
vals = values.compactMapValues { $0 }
187189

190+
case let .attStatusUpdated(attStatus: attStatus):
191+
let values: [String: JSONConvertible?] = [
192+
field(.attStatus): attStatus
193+
]
194+
195+
name = .attStatusUpdated
196+
vals = values.compactMapValues { $0 }
197+
188198
case .fetchVariables:
189199
name = .fetchVariables
190200
vals = [:]

KarteCore/Tracking/Event/EventFieldName.swift

+2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public extension EventFieldName {
5959
static let viewName = EventFieldName("view_name")
6060
/// title フィールド
6161
static let title = EventFieldName("title")
62+
// attStatusフィールド
63+
static let attStatus = EventFieldName("att_status")
6264
}
6365

6466
extension EventFieldName {

KarteCore/Tracking/Event/EventName.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ public struct EventName: Codable {
5050
.messageReady, .messageOpen, .messageClick, .messageClose, .messageSuppressed,
5151
.massPushClick,
5252
.pluginNativeAppIdentify,
53-
.fetchVariables:
53+
.fetchVariables,
54+
.attStatusUpdated:
5455
return false
5556
default:
5657
return true
@@ -122,4 +123,6 @@ public extension EventName {
122123
static let pluginNativeAppIdentify = EventName("plugin_native_app_identify")
123124
/// _fetch_variables イベント
124125
static let fetchVariables = EventName("_fetch_variables")
126+
/// att_status_updated イベント
127+
static let attStatusUpdated = EventName("att_status_updated")
125128
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//
2+
// Copyright 2024 PLAID, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// https://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
17+
import Quick
18+
import Nimble
19+
@testable import KarteCore
20+
import AppTrackingTransparency
21+
22+
23+
class ATTServiceSpec: QuickSpec {
24+
25+
override func spec() {
26+
describe("its run") {
27+
it("returns authorized label") {
28+
if #available(iOS 14, *) {
29+
let result = ATTService.getATTStatusLabel(attStatus: ATTrackingManager.AuthorizationStatus.authorized)
30+
expect(result).to(equal("authorized"))
31+
}
32+
}
33+
34+
it("returns denied label") {
35+
if #available(iOS 14, *) {
36+
let result = ATTService.getATTStatusLabel(attStatus: ATTrackingManager.AuthorizationStatus.denied)
37+
expect(result).to(equal("denied"))
38+
}
39+
}
40+
41+
it("returns restricted label") {
42+
if #available(iOS 14, *) {
43+
let result = ATTService.getATTStatusLabel(attStatus: ATTrackingManager.AuthorizationStatus.restricted)
44+
expect(result).to(equal("restricted"))
45+
}
46+
47+
}
48+
49+
it("returns notDetermined label") {
50+
if #available(iOS 14, *) {
51+
let result = ATTService.getATTStatusLabel(attStatus: ATTrackingManager.AuthorizationStatus.notDetermined)
52+
expect(result).to(equal("notDetermined"))
53+
}
54+
}
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)