Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
R
react-native-device-info
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
放牛的园子
react-native-device-info
Commits
f4c65d18
Commit
f4c65d18
authored
Jul 03, 2016
by
Ryan Leckey
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use persistent UID for iOS
parent
6a202768
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
162 additions
and
1 deletion
+162
-1
DeviceUID.h
RNDeviceInfo/DeviceUID.h
+5
-0
DeviceUID.m
RNDeviceInfo/DeviceUID.m
+155
-0
RNDeviceInfo.m
RNDeviceInfo/RNDeviceInfo.m
+2
-1
No files found.
RNDeviceInfo/DeviceUID.h
0 → 100644
View file @
f4c65d18
#import <Foundation/Foundation.h>
@interface
DeviceUID
:
NSObject
+
(
NSString
*
)
uid
;
@end
RNDeviceInfo/DeviceUID.m
0 → 100644
View file @
f4c65d18
// Initial work from:
// https://gist.github.com/miguelcma/e8f291e54b025815ca46
// Modified as the original version crashes.
#import "DeviceUID.h"
@import
UIKit
;
@interface
DeviceUID
()
@property
(
nonatomic
,
strong
,
readonly
)
NSString
*
uidKey
;
@property
(
nonatomic
,
strong
,
readonly
)
NSString
*
uid
;
@end
@implementation
DeviceUID
@synthesize
uid
=
_uid
;
#pragma mark - Public methods
+
(
NSString
*
)
uid
{
return
[[[
DeviceUID
alloc
]
initWithKey
:
@"deviceUID"
]
uid
];
}
#pragma mark - Instance methods
-
(
id
)
initWithKey
:
(
NSString
*
)
key
{
self
=
[
super
init
];
if
(
self
)
{
_uidKey
=
key
;
_uid
=
nil
;
}
return
self
;
}
/*! Returns the Device UID.
The UID is obtained in a chain of fallbacks:
- Keychain
- NSUserDefaults
- Apple IFV (Identifier for Vendor)
- Generate a random UUID if everything else is unavailable
At last, the UID is persisted if needed to.
*/
-
(
NSString
*
)
uid
{
if
(
!
_uid
)
_uid
=
[[
self
class
]
valueForKeychainKey
:
_uidKey
service
:
_uidKey
];
if
(
!
_uid
)
_uid
=
[[
self
class
]
valueForUserDefaultsKey
:
_uidKey
];
if
(
!
_uid
)
_uid
=
[[
self
class
]
appleIFA
];
if
(
!
_uid
)
_uid
=
[[
self
class
]
appleIFV
];
if
(
!
_uid
)
_uid
=
[[
self
class
]
randomUUID
];
[
self
save
];
return
_uid
;
}
/*! Persist UID to NSUserDefaults and Keychain, if not yet saved
*/
-
(
void
)
save
{
if
(
!
[
DeviceUID
valueForUserDefaultsKey
:
_uidKey
])
{
[
DeviceUID
setValue
:
_uid
forUserDefaultsKey
:
_uidKey
];
}
if
(
!
[
DeviceUID
valueForKeychainKey
:
_uidKey
service
:
_uidKey
])
{
[
DeviceUID
setValue
:
_uid
forKeychainKey
:
_uidKey
inService
:
_uidKey
];
}
}
#pragma mark - Keychain methods
/*! Create as generic NSDictionary to be used to query and update Keychain items.
* param1
* param2
*/
+
(
NSMutableDictionary
*
)
keychainItemForKey
:
(
NSString
*
)
key
service
:
(
NSString
*
)
service
{
NSMutableDictionary
*
keychainItem
=
[[
NSMutableDictionary
alloc
]
init
];
keychainItem
[(
__bridge
id
)
kSecClass
]
=
(
__bridge
id
)
kSecClassGenericPassword
;
keychainItem
[(
__bridge
id
)
kSecAttrAccessible
]
=
(
__bridge
id
)
kSecAttrAccessibleAlways
;
keychainItem
[(
__bridge
id
)
kSecAttrAccount
]
=
key
;
keychainItem
[(
__bridge
id
)
kSecAttrService
]
=
service
;
return
keychainItem
;
}
/*! Sets
* param1
* param2
*/
+
(
OSStatus
)
setValue
:
(
NSString
*
)
value
forKeychainKey
:
(
NSString
*
)
key
inService
:
(
NSString
*
)
service
{
NSMutableDictionary
*
keychainItem
=
[[
self
class
]
keychainItemForKey
:
key
service
:
service
];
keychainItem
[(
__bridge
id
)
kSecValueData
]
=
[
value
dataUsingEncoding
:
NSUTF8StringEncoding
];
return
SecItemAdd
((
__bridge
CFDictionaryRef
)
keychainItem
,
NULL
);
}
+
(
NSString
*
)
valueForKeychainKey
:
(
NSString
*
)
key
service
:
(
NSString
*
)
service
{
OSStatus
status
;
NSMutableDictionary
*
keychainItem
=
[[
self
class
]
keychainItemForKey
:
key
service
:
service
];
keychainItem
[(
__bridge
id
)
kSecReturnData
]
=
(
__bridge
id
)
kCFBooleanTrue
;
keychainItem
[(
__bridge
id
)
kSecReturnAttributes
]
=
(
__bridge
id
)
kCFBooleanTrue
;
CFDictionaryRef
result
=
nil
;
status
=
SecItemCopyMatching
((
__bridge
CFDictionaryRef
)
keychainItem
,
(
CFTypeRef
*
)
&
result
);
if
(
status
!=
noErr
)
{
return
nil
;
}
NSDictionary
*
resultDict
=
(
__bridge_transfer
NSDictionary
*
)
result
;
NSData
*
data
=
resultDict
[(
__bridge
id
)
kSecValueData
];
if
(
!
data
)
{
return
nil
;
}
return
[[
NSString
alloc
]
initWithData
:
data
encoding
:
NSUTF8StringEncoding
];
}
#pragma mark - NSUserDefaults methods
+
(
BOOL
)
setValue
:
(
NSString
*
)
value
forUserDefaultsKey
:
(
NSString
*
)
key
{
[[
NSUserDefaults
standardUserDefaults
]
setObject
:
value
forKey
:
key
];
return
[[
NSUserDefaults
standardUserDefaults
]
synchronize
];
}
+
(
NSString
*
)
valueForUserDefaultsKey
:
(
NSString
*
)
key
{
return
[[
NSUserDefaults
standardUserDefaults
]
objectForKey
:
key
];
}
#pragma mark - UID Generation methods
+
(
NSString
*
)
appleIFA
{
NSString
*
ifa
=
nil
;
Class
ASIdentifierManagerClass
=
NSClassFromString
(
@"ASIdentifierManager"
);
if
(
ASIdentifierManagerClass
)
{
// a dynamic way of checking if AdSupport.framework is available
SEL
sharedManagerSelector
=
NSSelectorFromString
(
@"sharedManager"
);
id
sharedManager
=
((
id
(
*
)(
id
,
SEL
))[
ASIdentifierManagerClass
methodForSelector
:
sharedManagerSelector
])(
ASIdentifierManagerClass
,
sharedManagerSelector
);
SEL
advertisingIdentifierSelector
=
NSSelectorFromString
(
@"advertisingIdentifier"
);
NSUUID
*
advertisingIdentifier
=
((
NSUUID
*
(
*
)(
id
,
SEL
))[
sharedManager
methodForSelector
:
advertisingIdentifierSelector
])(
sharedManager
,
advertisingIdentifierSelector
);
ifa
=
[
advertisingIdentifier
UUIDString
];
}
return
ifa
;
}
+
(
NSString
*
)
appleIFV
{
if
(
NSClassFromString
(
@"UIDevice"
)
&&
[
UIDevice
instancesRespondToSelector
:
@selector
(
identifierForVendor
)])
{
// only available in iOS >= 6.0
return
[[
UIDevice
currentDevice
].
identifierForVendor
UUIDString
];
}
return
nil
;
}
+
(
NSString
*
)
randomUUID
{
if
(
NSClassFromString
(
@"NSUUID"
))
{
return
[[
NSUUID
UUID
]
UUIDString
];
}
CFUUIDRef
uuidRef
=
CFUUIDCreate
(
kCFAllocatorDefault
);
CFStringRef
cfuuid
=
CFUUIDCreateString
(
kCFAllocatorDefault
,
uuidRef
);
CFRelease
(
uuidRef
);
NSString
*
uuid
=
[((
__bridge
NSString
*
)
cfuuid
)
copy
];
CFRelease
(
cfuuid
);
return
uuid
;
}
@end
RNDeviceInfo/RNDeviceInfo.m
View file @
f4c65d18
...
...
@@ -7,6 +7,7 @@
//
#import "RNDeviceInfo.h"
#import "DeviceUID.h"
@interface
RNDeviceInfo
()
...
...
@@ -146,7 +147,7 @@ RCT_EXPORT_MODULE()
UIDevice
*
currentDevice
=
[
UIDevice
currentDevice
];
NSUUID
*
identifierForVendor
=
[
currentDevice
identifierForVendor
];
NSString
*
uniqueId
=
[
identifierForVendor
UUIDString
];
NSString
*
uniqueId
=
[
DeviceUID
uid
];
return
@{
@"systemName"
:
currentDevice
.
systemName
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment