-
Notifications
You must be signed in to change notification settings - Fork 13
/
README.html
816 lines (652 loc) · 27.2 KB
/
README.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta charset="utf-8"/>
<title>TransUnion TruValidate Device Risk SDK for iOS</title>
<style>/*STYLES FOR STANDARD HTML TAGS*/
body {margin-left:16px;
margin-right:12px;
margin-top:12px;
margin-bottom:12px;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
vertical-align:top;
color:#000;
background: #fff;
}
h1 {font-family:proxima nova, proxima, helvetica, arial, sans-serif;
font-weight:normal;
font-size:24pt;
color:#165E53;
vertical-align:top;
margin-bottom:14px;
margin-top:24px;
letter-spacing:normal;
}
h2{font-family:proxima nova, proxima, helvetica, arial, sans-serif;
font-weight:700;
font-size:18pt;
color:#165E53;
vertical-align:top;
margin-bottom:14px;
margin-top:24px;
letter-spacing:normal;
}
h3{font-family:proxima nova, proxima, helvetica, arial, sans-serif;
font-weight:normal;
font-size:15pt;
margin-bottom:12px;
margin-top:22px;
color:#219181;
letter-spacing:normal;
}
h4{font-size:12pt;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
color:#333;
margin-bottom:8px;
margin-top:20px;
font-weight:bold;
letter-spacing:normal;
}
h5{font-size:12pt;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
color:#333;
margin-bottom:8px;
margin-top:16px;
font-weight:bold;
font-style:italic;
}
p{
font-size: 14px;
color: #000;
font-family: proxima nova, proxima, helvetica, arial, sans-serif;
font-weight: normal;
margin-top:4px;
margin-bottom:4px;
line-height:15px;
}
ul{margin-left:0px;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
font-weight:normal;
font-size:14px;
margin-top:8px;
margin-bottom:6px;
}
}
ol{margin-left:0px;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
font-weight:normal;
font-size:14px;
margin-top:10px;
margin-bottom:6px;
}
li{margin-top:8px;
margin-bottom:6px;
line-height:15px;
letter-spacing:normal;
}
a.link{color:#197F00;
font-weight:300;
}
a.hover{color:#999;
font-weight:300;
}
a.visited{color:#063;
font-weight:300;
}
a {color:#197F00;
font-weight:300;
}
a.prev{color:#063;
}
a.next{color:#053;
}
a:hover {color:#999}
a:active {color:#999}
a.active {color:#999}
img{margin-bottom:6px;
}
table{border-spacing:0px;
border:1px solid #9BB0A3;
margin-top:12px;
margin-bottom:12px;
border-width:thin;}
tr{font-family:proxima, helvetica, arial, sans-serif;}
th{background-color:#79806C;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
padding-left:2px;
padding-right:2px;
padding-top:2px;
padding-bottom:2px;
line-height: 15pt;
font-style:bold;
text-align:left;
valign:top;
color:white;
border:1px solid #9BB0A3;}
th p {
color:white;
}
td{text-align:left;
padding-left:2px;
padding-right:1px;
padding-top:2px;
vertical-align:top;
padding-bottom:1px;
border:1px solid #9BB0A3;
border-width:thin;
letter-spacing:normal;
line-height:15px;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
}
td p{
padding-left:0px;
padding-right:0px;
padding-top:0px;
vertical-align:top;
padding-bottom:0px;
letter-spacing:normal;
line-height:15px;
font-family:proxima nova, proxima, helvetica, arial, sans-serif;
margin-top: 0px;
margin-bottom: 0px;
}
td ul{margin-left:12px;
padding-left:4px;
padding-right:4px;
padding-top:0px;
padding-bottom:2px;
margin-bottom:2px;
margin-top:0px;
letter-spacing:normal;
line-height:15px;
}
td ul li {
margin-top:0px;
}
ol ol {
list-style-type:lower-alpha;
}
li p {
margin-top:8px;
}
li table tbody tr td p {
margin-top:2px;
}
/* HTML Styling: Ensures links under p tags have underlines */
p a {
text-decoration:underline;
}
/* General HTML: Styles images */
img {
margin-top:6px;
}
</style>
</head>
<body>
<h1 id="devicerisksdkforios">Device Risk SDK for iOS</h1>
<h2 id="whatistruvalidatedevicerisk">What is TruValidate Device Risk?</h2>
<p><strong>FraudForce is now Device Risk. Our device-based products, such as Device Risk and Device-Based Authentication (formerly ClearKey), are critical components of our fraud and identity solutions; the new names make it easy to quickly understand our extensive capabilities. We have united these solutions under the TransUnion TruValidate brand. We have taken care not to update anything that might affect your implementations; as a result you’ll still see legacy names in some places.</strong></p>
<hr />
<p>TransUnion identifies devices through information collected by the Device Risk
SDK run on an end-user’s mobile device. The SDK inspects the device
and generates a blackbox that contains all available device information. This
blackbox must then be sent to your servers to be used in a transaction risk
check via the <code>CheckTransactionDetails</code> API.</p>
<figure>
<img src="img/mobile_workflow.png" alt="Mobile SDK workflow" title="iovation mobile SDK workflow" />
<figcaption>Mobile SDK workflow</figcaption>
</figure>
<p>The Device Risk SDK integrates with native and hybrid apps. Hybrid apps
mix native code with content that runs inside web view.</p>
<h2 id="integrationfilesandrequirements">Integration Files and Requirements</h2>
<table>
<colgroup>
<col />
<col />
</colgroup>
<thead>
<tr>
<th> </th>
<th> </th>
</tr>
</thead>
<tbody>
<tr>
<td> File </td>
<td> <code>FraudForce.xcframework</code> </td>
</tr>
<tr>
<td> Version </td>
<td> 5.7.0 </td>
</tr>
<tr>
<td> Required OS Version </td>
<td> iOS 15.0 and higher </td>
</tr>
<tr>
<td> Supported Devices </td>
<td> iPhone SE 1st Gen & up, iPod Touch 7th Gen & up, iPad Air 2 & up</td>
</tr>
<tr>
<td> Required Frameworks </td>
<td> CoreTelephony, Security, SystemConfiguration </td>
</tr>
<tr>
<td> Optional Frameworks </td>
<td> AdSupport, CoreLocation </td>
</tr>
</tbody>
</table>
<h2 id="installation">Installation</h2>
<ol>
<li><p>Download and unzip the SDK from <a href="https://github.com/iovation/deviceprint-SDK-iOS/releases">Github</a>.</p></li>
<li><p>Bring <code>FraudForce.xcframework</code> into your project repository.</p></li>
<li><p>Drag and drop (or select the “+” button) to add the <code>FraudForce.xcframework</code> into the “Frameworks, Libraries, and Embedded Content” section of the “General” pane of the Xcode target editor.
<img src="img/drag_n_drop_xcframework.png" alt="Drag in FraudForce.xcframework" title="Drag FraudForce.xcframework into your application target" /></p>
<ul>
<li>This should also result in <code>FraudForce.xcframework</code> being added to appropriate sections of the “Build Phases” pane (“Link Binary With Libraries” and “Embed Frameworks”).</li>
</ul></li>
<li><p>Optionally add these frameworks (i.e. “Linked Frameworks and Libraries”) if your app makes use of them (and Auto Linking is off):</p>
<ul>
<li><code>AdSupport.framework</code> — If your app displays ads. Do not include if your
app does not use the ad framework, because the App Store will reject
apps that include the framework but don’t use it or does not ask for permission from the user.</li>
<li><code>CoreLocation.framework</code> — If your app uses location monitoring. Do not
include this framework unless your application requests geolocation
permission from the user.</li>
</ul></li>
<li><p><a name="keychain-share"></a>If your app has enabled the “Keychain Sharing” capability:</p>
<ul>
<li>Add “com.iovation.stm” to its list of Keychain Groups</li>
<li>Add the key <code>AppIdentifierPrefix</code> with the string value
<code>$(AppIdentifierPrefix)</code> to your app’s <code>Info.plist</code>.</li>
</ul></li>
<li><p><a name="entitle-wireless"></a>Allow Device Risk to collect wireless network information:</p>
<ul>
<li>Configure your app to include the “Access WiFi Information” capability.
<ul>
<li>This capability is <em>optional</em> but recommended (as it enables additional attribute collection).</li>
<li>Turning the capability on for your application target in Xcode will update the app’s entitlements file and provisioning profile.</li>
</ul></li>
</ul></li>
</ol>
<h2 id="upgradefromuniversaltoxcframeworkinstallation">Upgrade from Universal to XCFramework Installation</h2>
<p>Versions 5.0.0 (2017) through 5.1.0 (2020) were distributed exclusively as a Universal framework. Version 5.2.0 introduced an optional XCFramework asset. Beginning with version 5.3.0, XCFramework is the exclusive distribution format for the Device Risk SDK. To update a project that had previously integrated a Universal framework version of Device Risk, follow these steps to uninstall the deprecated format.</p>
<ol>
<li><p>In the “Frameworks, Libraries, and Embedded Content” section of the “General” pane of the Xcode target editor, remove <code>FraudForce.framework</code>.</p></li>
<li><p>In the “Build Phases” pane of the Xcode target editor, remove the formerly required Run Script phases related to the Universal version of the framework (which were named “Slim Frameworks For Build” and “Clean For Next Build” in prior documentation).</p>
<ul>
<li>The XCFramework format seamlessly packages and allows Xcode to appropriately handle the multiple architectures required to support both Simulators and Devices.</li>
</ul></li>
<li><p>Remove the “Post-actions” script from the “Archive” scheme of your application target (which was named “Archive Framework Symbols” in prior documentation).</p>
<ul>
<li>From the target popup button in the Xcode toolbar, ensure your application target is selected and choose “Edit Scheme…” from the popup menu.</li>
<li>In the scheme editor, select the disclosure triangle for the “Archive” item and then select “Post-actions”.</li>
<li>Remove the Run Script action responsible for including <code>.bcsymbolmap</code> files for Device Risk in the application archive.
<ul>
<li>The utility of <code>.bcsymbolmap</code> files continues to hold true for XCFramework-packaged, dynamic libraries (i.e. they are required to enable symbolication of Device Risk stack frames in the crash logs of subscriber apps). Now, these files are included inside of the <code>.xcframework</code> bundle and are appropriately handled by Xcode 12 and above.</li>
</ul></li>
</ul></li>
<li><p>Follow the Installation instructions (above) to integrate the XCFramework version of Device Risk.</p>
<ul>
<li>Installation steps 4 - 6 should not need to be repeated given a proper installation of a recent version of Device Risk.</li>
</ul></li>
</ol>
<h2 id="sampleprojects">Sample Projects</h2>
<p>This download includes two sample Xcode projects that demonstrate the integration of the Device Risk
SDK for iOS. These projects require at least Xcode 11 and iOS 11.0.</p>
<ul>
<li><p>The <code>iovSample/iovSampleSwiftUI.xcodeproj</code> project uses SwiftUI to demonstrate
integration technique. This application is fully implemented in SwiftUI and can be
tested on a simulator or device.</p></li>
<li><p>The <code>iovSample/iovSampleSwift.xcodeproj</code> project uses Swift to demonstrate
two integration techniques: UIKit and WebKit. Each is implemented in its own
view controller, and may be tested in a tabbed interface on a simulator or device.</p></li>
<li><p>The <code>iovSample/iovSample.xcodeproj</code> project uses Objective-C to demonstrate
two integration techniques: UIKit and WebKit. Each is implemented in its own
view controller, and may be tested in a tabbed interface on a simulator or device.</p></li>
</ul>
<h2 id="usage">Usage</h2>
<p>Use the <code>FraudForce</code> API to enable the Device Risk SDK to start collecting blackbox
data asynchronously, and to generate a new blackbox to submit to your back-end service.</p>
<ol>
<li><p>Import it into your app delegate and call <code>+start</code> when the application
becomes active:</p>
<pre><code>[FraudForce start];
</code></pre>
<p>This method starts a low-priority thread that silently collects data from
the device with minimal impact on your app.</p></li>
<li><p>Include your “Subscriber Key” in your application’s <code>Info.plist</code>, using the key <code>IOVSubKey</code>.</p>
<pre><code><key>IOVSubKey</key>
<string>6S7EJX4BM7HuKUmriUOuQvXta9mBUs4tAVtGToP6tUY=</string>
</code></pre>
<p>This is strongly recommended for all integrations, and it is required for network connections.</p></li>
<li><p>(optional) Provide a <code>FraudForceDelegate</code> object, which is required for network connections.</p>
<pre><code>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[FraudForce delegation:self];
</code></pre>
<p>…</p>
<pre><code>- (BOOL)shouldEnableNetworkCalls
{
return YES;
}
</code></pre></li>
<li><p>To generate a new blackbox, call <code>+blackbox</code>:</p>
<pre><code>NSString *blackbox = [FraudForce blackbox];
</code></pre></li>
<li><p>Submit the blackbox to your service. The service should then send
it to TransUnion to evaluate the transaction. See the iovSample Xcode
projects included with the download for a sample implementation.</p></li>
</ol>
<h3 id="newfeatures">New Features!</h3>
<p>Versions 5.0.0 and above include the ability to make a network call to TransUnion TruValidate’s service. This
enables the Device Risk SDK to collect additional network information. By default this functionality
is turned off and will need to be enabled via a <code>FraudForceDelegate</code> object. Usage of this
feature requires a subscriber key be provided. Please contact your TransUnion client representative to
acquire a subscriber key.</p>
<h3 id="important">Important!</h3>
<p>The blackbox returned from <code>+blackbox</code> should never be empty. An empty blackbox
indicates there is a problem with the integration of the SDK or that the protection
offered by the system may have been compromised.</p>
<h2 id="asynchronousprocessingintegration">Asynchronous Processing Integration</h2>
<p>Each of the native and hybrid integration methods described below benefit
from starting the SDK asynchronous processing whenever your application
becomes active. To do so, import <code>FraudForce</code> and call <code>+start</code> in the
<code>-applicationDidBecomeActive:</code> method of your app delegate:</p>
<pre><code>#import "SampleAppDelegate.h"
@import FraudForce;
-applicationDidBecomeActive:(UIApplication *)application
{
[FraudForce start];
}
</code></pre>
<p>The <code>+start</code> method automatically registers a notification handler to be
called when the application goes into the background. This handler asks the
OS for time to finish any tasks it has running.</p>
<h2 id="integratingintonativeapps">Integrating Into Native Apps</h2>
<p>To integrate into a native app using UIKit:</p>
<ol>
<li><p>Start the asynchronous data collection as described in the
<a href="#asynchronousprocessingintegration">Asynchronous Processing Integration</a> section.</p></li>
<li><p>Import <code>FraudForce</code> and call <code>+blackbox</code> wherever you need a blackbox:</p>
<pre><code>#import "SampleViewController.h"
@import FraudForce;
@implementation SampleViewController
@property (strong, nonatomic) UILabel *blackbox;
// Button press updates text field with blackbox value
- (IBAction)changeMessage:(id)sender
{
self.blackbox.text = [FraudForce blackbox];
}
@end
</code></pre></li>
</ol>
<p>A more extensive example, including submitting a blackbox in an HTTP request,
may be found in the <code>SampleUIKitViewController</code> class for both Swift (iovSampleSwift) and
Objective-C (iovSample) in the sample Xcode projects included in the Device Risk SDK download.</p>
<p>To integrate into a native app using SwiftUI:</p>
<ol>
<li><p>Start the asynchronous data collection as described in the
<a href="#asynchronousprocessingintegration">Asynchronous Processing Integration</a> section.</p></li>
<li><p>Import <code>FraudForce</code> and call <code>blackbox</code> wherever you need a blackbox:</p></li>
</ol>
<p>Example of displaying blackBox in a text label in SwiftUI:</p>
<pre><code> Text(FraudForce.blackbox())
</code></pre>
<h2 id="webkitintegration">WebKit Integration</h2>
<p>For a hybrid application using <a href="https://developer.apple.com/documentation/webkit" title="WebKit Framework Reference">WebKit</a>, create a JavaScript message handler
and add it to the context of the web view.</p>
<ol>
<li><p>Start the asynchronous data collection as described in the
<a href="#asynchronousprocessingintegration">Asynchronous Processing Integration</a> section.</p></li>
<li><p>Build a view controller that implements the WKScriptMessageHandler
protocol. Here’s an example in Swift:</p>
<pre><code>import UIKit
import WebKit
import FraudForce
class SampleWebKitViewController: UIViewController, WKScriptMessageHandler
{
weak var webView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
// Set up Blackbox.injectInto() via a user script.
var js = "var Blackbox = { injectInto: function (id) {\n"
+ " window.webkit.messageHandlers.bb.postMessage(id)\n"
+ " } }\n"
let userScript = WKUserScript(
source: js,
injectionTime: .atDocumentEnd,
forMainFrameOnly: true)
// Set up bb notification.
let userContentController = WKUserContentController()
userContentController.addUserScript(userScript)
userContentController.add(self, name: "bb")
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
// Create the web view.
let webKitView = WKWebView(frame: self.view.bounds, configuration: configuration)
self.view.addSubview(webKitView)
webKitView.translatesAutoresizingMaskIntoConstraints = true
webKitView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
webView = webKitView
}
}
</code></pre>
<p>In this example, we added a script handler called “bb” and appointed the
view controller itself as the delegate. The <code>Blackbox.injectInto()</code>
function calls into this handler.</p></li>
<li><p>To hook up this script handler, add the following method to handle
notifications from JavaScript running in the web view. This example
assumes that an HTML ID for a hidden form field will be passed in the
message body:</p>
<pre><code>func userContentController(
_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage)
{
// Consider checking properties of message.webView.URL, such as the host
// property, to ensure that it's a request from a known source.
guard message.name == "bb" else {
return
}
// Inject the blackbox.
message.webView?.evaluateJavaScript(
"document.getElementById('\(message.body)').value = '\(FraudForce.blackbox())'",
completionHandler: nil)
}
</code></pre>
<p>The last statement simply injects the blackbox from a call to
<code>FraudForce.blackbox()</code> into the hidden form field. Consider adding code
to check the domain and other attributes of the requesting web page to
ensure it is allowed to have a blackbox.</p></li>
<li><p>Then, invoke <code>FraudForce.injectinfo()</code> function any place in the HTML
that you need a blackbox:</p>
<pre><code><form name="txn" onsubmit="try { FraudForce.injectInto('bbox'); } catch(e) {} return true;">
<input type="hidden" id="bbox" name="bbox" />
<!-- Other fields as required --->
<input type="submit" />
</form>
</code></pre>
<p><strong>NOTE:</strong> The <code>try</code>/<code>catch</code> statement ignores errors if none of the
<code>FraudForce.injectInto</code> object hierarchy exists. This is essential if
the HTML will be used outside of your app.</p></li>
<li><p>If you have full control over the HTML that will be loaded into
WKWebView, including the name of a hidden field into which to inject a
blackbox, append the code to inject the blackbox to the user script.
Change the JavaScript variable declaration above to:</p>
<pre><code>var js = "var Blackbox = { injectInto: function (id) {\n"
+ " window.webkit.messageHandlers.bb.postMessage(id)\n"
+ " } }\n"
+ "document.getElementById('bbox').value = '\(FraudForce.blackbox())'\n"
</code></pre></li>
</ol>
<p>Find a complete example in the <code>SampleWKWebViewViewController</code> class for Swift (iovSampleSwift) and <code>SampleWebKitViewController</code>
class for Objective-C (iovSample) in the sample Xcode projects included in the Device Risk SDK download.</p>
<h2 id="changes">Changes</h2>
<h3 id="v5.7.0">v5.7.0</h3>
<ul>
<li>Recognition improvements.</li>
<li>Performance improvements.</li>
<li>OS requirement raised to iOS 15.</li>
<li>XCFramework is now signed under TransUnion Developer Account.</li>
<li>Added SwiftUI Sample App to sample projects.</li>
</ul>
<h3 id="v5.6.0">v5.6.0</h3>
<ul>
<li>Added privacy manifest file.</li>
<li>Collection changes required by privacy manifest.</li>
</ul>
<h3 id="v5.5.0">v5.5.0</h3>
<ul>
<li>Recognition improvements.</li>
<li>XCFramework is now signed.</li>
</ul>
<h3 id="v5.4.1">v5.4.1</h3>
<ul>
<li>Performance improvements.</li>
<li>Updated sample projects.</li>
</ul>
<h3 id="v5.4.0">v5.4.0</h3>
<ul>
<li>Recognition improvements.</li>
<li>OS requirement raised to iOS 12.</li>
</ul>
<h3 id="v5.3.0">v5.3.0</h3>
<ul>
<li>Recognition improvements.</li>
<li>Distribution is now exclusively XCFramework.
<ul>
<li>Includes support for simulators on M1 (arm64) Macs.</li>
<li>Updated sample projects to use <code>.xcframework</code>.</li>
<li>Removed (Universal framework) integration scripts.</li>
</ul></li>
</ul>
<h3 id="v5.2.0">v5.2.0</h3>
<ul>
<li>Performance improvements.</li>
<li>Improved handling of background tasks.</li>
<li>OS requirement raised to iOS 11.
<ul>
<li>SDK supports 64-bit devices only.</li>
</ul></li>
<li>XCFramework artifact released.</li>
</ul>
<h3 id="v5.1.0">v5.1.0</h3>
<ul>
<li>Blackbox format improvements.</li>
<li>Performance improvements.</li>
<li>Addressed all “Main Thread Checker” complaints.
<ul>
<li>Additional protections silence extraneous warnings and streamline development in newer Xcode environments.</li>
<li><code>FraudForce.blackbox</code> continues to be safe to call from any thread.</li>
</ul></li>
<li>Updated sample projects to resolve Xcode 11 build errors.</li>
</ul>
<h3 id="v5.0.4">v5.0.4</h3>
<ul>
<li>Improved thread safety.</li>
<li>Updated integration scripts to support macOS Catalina.</li>
</ul>
<h3 id="v5.0.3">v5.0.3</h3>
<ul>
<li>SDK built with Xcode’s “New Build System”, the default as of Xcode 10.</li>
<li>Updated sample projects.</li>
</ul>
<h3 id="v5.0.2">v5.0.2</h3>
<ul>
<li>Minor recognition improvements.</li>
<li>Updated the iovSample project (Objective-C) to the latest language, project, and system standards.
<ul>
<li>Removed the UIWebView integration sample.</li>
</ul></li>
<li>Minor improvements to the iovSampleSwift project.</li>
<li>Note a new entitlement is recommended for apps built with Xcode 10 (and above). See the <a href="#entitle-wireless">Installation steps</a> for details.</li>
</ul>
<h3 id="v5.0.1">v5.0.1</h3>
<ul>
<li>Minor recognition improvements.
<ul>
<li>Recognized devices previously returned (via <code>CheckTransactionDetails</code>) the following attributes
<ul>
<li><code>mobile.app.procName</code></li>
<li><code>mobile.system.voipAllowed</code></li>
</ul></li>
<li>These values are no longer returned. In place of <code>mobile.app.procName</code>, use <code>mobile.app.exeName</code> which returns the same value.</li>
</ul></li>
</ul>
<h3 id="v5.0.0">v5.0.0</h3>
<ul>
<li>New SDK distribution format, <code>FraudForce.framework</code> supersedes the <code>iovation.framework</code>.
The new framework employs a dynamic library (in place of the historical “static archive” approach),
which is the modern, recommended (iOS 8 and above), and more stable approach for library distribution.</li>
<li>New ability to collect additional network information. See “New Features!” in the <a href="#usage">Usage</a> section.</li>
<li>New blackbox compression on iOS (up to 40% reduction in blackbox size).</li>
<li>Improved Swift compatibility.</li>
<li>New Swift sample project <code>iovSample/iovSampleSwift.xcodeproj</code>.</li>
<li>Renamed <code>DevicePrint</code> class to <code>FraudForce</code>.</li>
<li>Removed legacy <code>iovation</code> class (<code>+ioBegin</code>), which was deprecated and replaced in version 4.0.</li>
<li>OS requirement raised to iOS 9.</li>
</ul>
<h3 id="v4.3.0">v4.3.0</h3>
<ul>
<li>Define the framework as a module, which removes integration obstacles for
Swift clients and improves the overall compatibility with current Xcode
build strategies.</li>
<li>Deprecated the collection of device attributes that were dependent on the
ExternalAccessory framework (given restrictions to their availability in
recent versions of iOS).</li>
</ul>
<h3 id="v4.2.0">v4.2.0</h3>
<ul>
<li>Added support for bitcode apps.</li>
<li>Dropped support for iOS 5, as required to support bitcode-enabled apps.</li>
<li>Improved jailbreak detection.</li>
<li>Improved cross-application device recognition for apps using a shared
keychain. See the <a href="#keychain-share">Installation steps</a> for details.</li>
</ul>
<h3 id="v4.1.0">v4.1.0</h3>
<ul>
<li>Minor updates for improved iOS 9 compatibility.</li>
<li>Converted the iovSample WebKit demo class from Swift to Objective-C for
better compatibility with new releases of Xcode.</li>
<li>Minor recognition improvements.</li>
</ul>
<h3 id="v4.0.0">v4.0.0</h3>
<ul>
<li>New API, <code>DevicePrint</code>, handles low-priority asynchronous collection of
device data. The old <code>iovation</code> class and <code>+ioBegin</code> method remain in place
for backward compatibility.</li>
<li>Now requires the SystemConfiguration framework.</li>
<li>Expanded the iovSample project with classes demonstrating both native and
hybrid implementations.</li>
<li>Added WebKit and UIWebView integration instructions.</li>
<li>Removed autolayout from the <code>iovSample.xcode5</code> project so that it can be
compiled and run against iOS 5.</li>
</ul>
<h3 id="v3.1.0">v3.1.0</h3>
<ul>
<li>Collecting additional attributes to be used in forthcoming jailbreak
business rule.</li>
</ul>
<h3 id="v3.0.1">v3.0.1</h3>
<ul>
<li>Updated and enhanced library compression. Binary size is now at 434K.</li>
</ul>
<h3 id="v3.0.0">v3.0.0</h3>
<ul>
<li>Now distributed as a framework instead of standalone .a and .h files.</li>
<li>Collects additional device attributes and data.</li>
<li>Restored collection of the advertising identifier, but only if your app
includes the optional AdSupport framework.</li>
<li>The CoreLocation framework is now optional; the SDK will not use it if it’s
not included in your app.</li>
<li>Now require the ExternalAccessory and CoreTelephony frameworks.</li>
<li>Added 64 bit support.</li>
<li>Simplified the iovSample application code to more closely match current iOS
SDK functionality.</li>
<li>Added iPad and Retina display support to iovSample.</li>
</ul>
<h2 id="copyright">Copyright</h2>
<p>Copyright (c) 2010–2021 TransUnion. All rights reserved.</p>
</body>
</html>