Skip to content
This repository was archived by the owner on Jun 27, 2023. It is now read-only.

Commit 35f96a0

Browse files
bsneedBrandon Sneed
and
Brandon Sneed
authored
feat(ios): make idfa for ios external to analytics (segmentio#210)
* feat(ios): make idfa for ios external to analytics * fix(js): fixed test and linter errors * fix(ios): make analytics-ios 4.0.5 the minimum version Co-authored-by: Brandon Sneed <[email protected]>
1 parent 8c14089 commit 35f96a0

File tree

11 files changed

+146
-34
lines changed

11 files changed

+146
-34
lines changed

packages/core/RNAnalytics.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Pod::Spec.new do |s|
2020
s.source_files = 'ios/**/*.{m,h}'
2121
s.static_framework = true
2222

23-
s.dependency 'Analytics', '~> 4.0.4'
23+
s.dependency 'Analytics', '~> 4.0.5'
2424
s.dependency 'React'
2525
end
2626

packages/core/android/src/main/java/com/segment/analytics/reactnative/core/RNAnalytics.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ object RNAnalytics {
3131
private val integrations = mutableSetOf<Integration.Factory>()
3232
private val onReadyCallbacks = mutableMapOf<String, Analytics.Callback<Any?>>()
3333

34+
fun setIDFA(idfa: String) {
35+
// do nothing; iOS only.
36+
}
37+
3438
fun addIntegration(integration: Integration.Factory) {
3539
integrations.add(integration)
3640
}

packages/core/docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
**Ƭ Integration**: *`function` \| `object`*
2626

27-
*Defined in [analytics.ts:8](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L8)*
27+
*Defined in analytics.ts:8*
2828

2929
___
3030

packages/core/docs/classes/analytics.client.md

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
* [middleware](analytics.client.md#middleware)
2626
* [reset](analytics.client.md#reset)
2727
* [screen](analytics.client.md#screen)
28+
* [setIDFA](analytics.client.md#setidfa)
2829
* [setup](analytics.client.md#setup)
2930
* [track](analytics.client.md#track)
3031
* [useNativeConfiguration](analytics.client.md#usenativeconfiguration)
@@ -39,7 +40,7 @@
3940

4041
**● ready**: *`false`* = false
4142

42-
*Defined in [analytics.ts:147](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L147)*
43+
*Defined in analytics.ts:147*
4344

4445
Whether the client is ready to send events to Segment.
4546

@@ -55,7 +56,7 @@ ___
5556

5657
**alias**(newId: *`string`*, options?: *[Options]()*): `Promise`<`void`>
5758

58-
*Defined in [analytics.ts:317](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L317)*
59+
*Defined in analytics.ts:325*
5960

6061
Merge two user identities, effectively connecting two sets of user data as one. This may not be supported by all integrations.
6162

@@ -77,7 +78,7 @@ ___
7778

7879
**catch**(handler: *[ErrorHandler]()*): `this`
7980

80-
*Defined in [analytics.ts:162](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L162)*
81+
*Defined in analytics.ts:162*
8182

8283
Catch React-Native bridge errors
8384

@@ -98,7 +99,7 @@ ___
9899

99100
**disable**(): `Promise`<`void`>
100101

101-
*Defined in [analytics.ts:356](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L356)*
102+
*Defined in analytics.ts:364*
102103

103104
Completely disable the sending of any analytics data.
104105

@@ -113,7 +114,7 @@ ___
113114

114115
**enable**(): `Promise`<`void`>
115116

116-
*Defined in [analytics.ts:346](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L346)*
117+
*Defined in analytics.ts:354*
117118

118119
Enable the sending of analytics data. Enabled by default.
119120

@@ -128,7 +129,7 @@ ___
128129

129130
**flush**(): `Promise`<`void`>
130131

131-
*Defined in [analytics.ts:337](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L337)*
132+
*Defined in analytics.ts:345*
132133

133134
Trigger an upload of all queued events.
134135

@@ -143,7 +144,7 @@ ___
143144

144145
**getAnonymousId**(): `Promise`<`string`>
145146

146-
*Defined in [analytics.ts:361](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L361)*
147+
*Defined in analytics.ts:369*
147148

148149
Retrieve the anonymousId.
149150

@@ -156,7 +157,7 @@ ___
156157

157158
**group**(groupId: *`string`*, traits?: *[JsonMap]()*, options?: *[Options]()*): `Promise`<`void`>
158159

159-
*Defined in [analytics.ts:304](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L304)*
160+
*Defined in analytics.ts:312*
160161

161162
Associate a user with a group, organization, company, project, or w/e _you_ call them.
162163

@@ -179,7 +180,7 @@ ___
179180

180181
**identify**(user: *`string`*, traits?: *[JsonMap]()*, options?: *[Options]()*): `Promise`<`void`>
181182

182-
*Defined in [analytics.ts:291](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L291)*
183+
*Defined in analytics.ts:299*
183184

184185
Associate a user with their unique ID and record traits about them.
185186

@@ -202,7 +203,7 @@ ___
202203

203204
**middleware**(middleware: *[Middleware]()*): `this`
204205

205-
*Defined in [analytics.ts:200](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L200)*
206+
*Defined in analytics.ts:208*
206207

207208
Append a new middleware to the middleware chain.
208209

@@ -240,7 +241,7 @@ ___
240241

241242
**reset**(): `Promise`<`void`>
242243

243-
*Defined in [analytics.ts:327](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L327)*
244+
*Defined in analytics.ts:335*
244245

245246
Reset any user state that is cached on the device.
246247

@@ -255,7 +256,7 @@ ___
255256

256257
**screen**(name: *`string`*, properties?: *[JsonMap]()*, options?: *[Options]()*): `Promise`<`void`>
257258

258-
*Defined in [analytics.ts:276](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L276)*
259+
*Defined in analytics.ts:284*
259260

260261
Record the screens or views your users see.
261262

@@ -271,14 +272,33 @@ When a user views a screen in your app, you'll want to record that here. For som
271272

272273
**Returns:** `Promise`<`void`>
273274

275+
___
276+
<a id="setidfa"></a>
277+
278+
### setIDFA
279+
280+
**setIDFA**(idfa: *`string`*): `void`
281+
282+
*Defined in analytics.ts:172*
283+
284+
Sets the IDFA value on iOS. Customers are now responsible for collecting IDFA on their own.
285+
286+
**Parameters:**
287+
288+
| Name | Type |
289+
| ------ | ------ |
290+
| idfa | `string` |
291+
292+
**Returns:** `void`
293+
274294
___
275295
<a id="setup"></a>
276296

277297
### setup
278298

279299
**setup**(writeKey: *`string`*, configuration?: *[Configuration](../interfaces/analytics.configuration.md)*): `Promise`<`void`>
280300

281-
*Defined in [analytics.ts:239](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L239)*
301+
*Defined in analytics.ts:247*
282302

283303
Setup the Analytics module. All calls made before are queued and only executed if the configuration was successful.
284304

@@ -308,7 +328,7 @@ ___
308328

309329
**track**(event: *`string`*, properties?: *[JsonMap]()*, options?: *[Options]()*): `Promise`<`void`>
310330

311-
*Defined in [analytics.ts:258](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L258)*
331+
*Defined in analytics.ts:266*
312332

313333
Record the actions your users perform.
314334

@@ -331,7 +351,7 @@ ___
331351

332352
**useNativeConfiguration**(): `this`
333353

334-
*Defined in [analytics.ts:212](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L212)*
354+
*Defined in analytics.ts:220*
335355

336356
Use the native configuration.
337357

packages/core/docs/interfaces/analytics.configuration.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
**● android**: *`undefined` \| `object`*
3333

34-
*Defined in [analytics.ts:120](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L120)*
34+
*Defined in analytics.ts:120*
3535

3636
Android specific settings.
3737

@@ -42,7 +42,7 @@ ___
4242

4343
**● debug**: *`undefined` \| `false` \| `true`*
4444

45-
*Defined in [analytics.ts:38](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L38)*
45+
*Defined in analytics.ts:38*
4646

4747
___
4848
<a id="defaultprojectsettings"></a>
@@ -51,7 +51,7 @@ ___
5151

5252
**● defaultProjectSettings**: *`undefined` \| `object`*
5353

54-
*Defined in [analytics.ts:46](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L46)*
54+
*Defined in analytics.ts:46*
5555

5656
Default project settings to use, if Segment.com cannot be reached. An example configuration can be found here, using your write key: [](https://cdn-settings.segment.com/v1/projects/YOUR_WRITE_KEY/settings)[https://cdn-settings.segment.com/v1/projects/YOUR\_WRITE\_KEY/settings](https://cdn-settings.segment.com/v1/projects/YOUR_WRITE_KEY/settings)
5757

@@ -62,7 +62,7 @@ ___
6262

6363
**● flushAt**: *`undefined` \| `number`*
6464

65-
*Defined in [analytics.ts:54](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L54)*
65+
*Defined in analytics.ts:54*
6666

6767
The number of queued events that the analytics client should flush at. Setting this to `1` will not queue any events and will use more battery.
6868

@@ -75,7 +75,7 @@ ___
7575

7676
**● ios**: *`undefined` \| `object`*
7777

78-
*Defined in [analytics.ts:102](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L102)*
78+
*Defined in analytics.ts:102*
7979

8080
iOS specific settings.
8181

@@ -86,7 +86,7 @@ ___
8686

8787
**● proxy**: *`undefined` \| `object`*
8888

89-
*Defined in [analytics.ts:72](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L72)*
89+
*Defined in analytics.ts:72*
9090

9191
Whether the analytics client should send all requests through your own hosted proxy rather than directly to Segment. See: iOS: [https://segment.com/docs/connections/sources/catalog/libraries/mobile/ios/#proxy-http-calls](https://segment.com/docs/connections/sources/catalog/libraries/mobile/ios/#proxy-http-calls) android: [https://segment.com/docs/connections/sources/catalog/libraries/mobile/android/#proxy-http-calls](https://segment.com/docs/connections/sources/catalog/libraries/mobile/android/#proxy-http-calls)
9292

@@ -99,7 +99,7 @@ ___
9999

100100
**● recordScreenViews**: *`undefined` \| `false` \| `true`*
101101

102-
*Defined in [analytics.ts:19](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L19)*
102+
*Defined in analytics.ts:19*
103103

104104
Whether the analytics client should automatically make a screen call when a view controller is added to a view hierarchy. Because the iOS underlying implementation uses method swizzling, we recommend initializing the analytics client as early as possible.
105105

@@ -112,7 +112,7 @@ ___
112112

113113
**● trackAppLifecycleEvents**: *`undefined` \| `false` \| `true`*
114114

115-
*Defined in [analytics.ts:26](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L26)*
115+
*Defined in analytics.ts:26*
116116

117117
Whether the analytics client should automatically track application lifecycle events, such as "Application Installed", "Application Updated" and "Application Opened".
118118

@@ -125,7 +125,7 @@ ___
125125

126126
**● trackAttributionData**: *`undefined` \| `false` \| `true`*
127127

128-
*Defined in [analytics.ts:32](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L32)*
128+
*Defined in analytics.ts:32*
129129

130130
Whether the analytics client should automatically track attribution data from enabled providers using the mobile service.
131131

@@ -138,7 +138,7 @@ ___
138138

139139
**● using**: *[Integration](../#integration)[]*
140140

141-
*Defined in [analytics.ts:37](https://github.com/adkenyon/analytics-react-native/blob/master/packages/core/src/analytics.ts#L37)*
141+
*Defined in analytics.ts:37*
142142

143143
Register a set of integrations to be used with this Analytics instance.
144144

packages/core/ios/RNAnalytics/RNAnalytics.m

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
static NSMutableSet* RNAnalyticsIntegrations = nil;
1414
static NSLock* RNAnalyticsIntegrationsLock = nil;
15+
static NSString* RNAnalyticsAdvertisingId = nil;
16+
static BOOL RNAnalyaticsUseAdvertisingId = NO;
1517

1618
@implementation RNAnalytics
1719

@@ -60,9 +62,14 @@ +(void)initialize {
6062
config.trackApplicationLifecycleEvents = [options[@"trackAppLifecycleEvents"] boolValue];
6163
config.trackAttributionData = [options[@"trackAttributionData"] boolValue];
6264
config.flushAt = [options[@"flushAt"] integerValue];
63-
config.enableAdvertisingTracking = [options[@"ios"][@"trackAdvertising"] boolValue];
65+
config.enableAdvertisingTracking = RNAnalyaticsUseAdvertisingId = [options[@"ios"][@"trackAdvertising"] boolValue];
6466
config.defaultSettings = options[@"defaultProjectSettings"];
6567

68+
// set this block regardless. the data will come in after the fact most likely.
69+
config.adSupportBlock = ^NSString * _Nonnull{
70+
return RNAnalyticsAdvertisingId;
71+
};
72+
6673
if ([options valueForKey:@"proxy"]) {
6774
NSDictionary *proxyOptions = (NSDictionary *)[options valueForKey:@"proxy"];
6875

@@ -124,6 +131,10 @@ - (NSDictionary*)withContextAndIntegrations :(NSDictionary*)context :(NSDictiona
124131
return @{ @"context": context, @"integrations": integrations ?: @{}};
125132
}
126133

134+
RCT_EXPORT_METHOD(setIDFA:(NSString *)idfa) {
135+
RNAnalyticsAdvertisingId = idfa;
136+
}
137+
127138

128139
RCT_EXPORT_METHOD(track:(NSString*)name :(NSDictionary*)properties :(NSDictionary*)integrations :(NSDictionary*)context) {
129140
[SEGAnalytics.sharedAnalytics track:name

packages/core/src/__tests__/configuration.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ it('uses the default configuration', async () => {
2727
flushInterval: undefined
2828
},
2929
ios: {
30-
trackAdvertising: true,
30+
trackAdvertising: false,
3131
trackDeepLinks: false
3232
}
3333
})
@@ -54,7 +54,7 @@ it('produces a valid configuration', async () => {
5454
flushInterval: 72
5555
},
5656
ios: {
57-
trackAdvertising: true,
57+
trackAdvertising: false,
5858
trackDeepLinks: true
5959
}
6060
})
@@ -80,7 +80,7 @@ it('produces a valid configuration', async () => {
8080
flushInterval: 72
8181
},
8282
ios: {
83-
trackAdvertising: true,
83+
trackAdvertising: false,
8484
trackDeepLinks: true
8585
}
8686
})

packages/core/src/analytics.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,14 @@ export module Analytics {
164164

165165
return this
166166
}
167+
168+
/**
169+
* Sets the IDFA value on iOS. Customers are now responsible for collecting
170+
* IDFA on their own.
171+
*/
172+
public setIDFA(idfa: string) {
173+
Bridge.setIDFA(idfa)
174+
}
167175

168176
/**
169177
* Append a new middleware to the middleware chain.

packages/core/src/bridge.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export interface Bridge {
8181
enable(): Promise<void>
8282
disable(): Promise<void>
8383
getAnonymousId(): Promise<string>
84+
setIDFA(idfa: string): Promise<void>
8485
}
8586

8687
const bridge: Bridge = NativeModules.RNAnalytics

0 commit comments

Comments
 (0)