UIDevice uniqueIdentifier deprecated - What to do now?

后端 未结 30 2103
日久生厌
日久生厌 2020-11-21 06:07

It has just come to light that the UIDevice uniqueIdentifier property is deprecated in iOS 5 and unavailable in iOS 7 and above. No alternative method or pr

相关标签:
30条回答
  • 2020-11-21 06:43

    check this out,

    we can use Keychain instead of NSUserDefaults class, to store UUID created by CFUUIDCreate.

    with this way we could avoid for UUID recreation with reinstallation, and obtain always same UUID for same application even user uninstall and reinstall again.

    UUID will recreated just when device reset by user.

    I tried this method with SFHFKeychainUtils and it's works like a charm.

    0 讨论(0)
  • 2020-11-21 06:43

    I would also suggest changing over from uniqueIdentifier to this open source library (2 simple categories really) that utilize the device’s MAC Address along with the App Bundle Identifier to generate a unique ID in your applications that can be used as a UDID replacement.

    Keep in mind that unlike the UDID this number will be different for every app.

    You simply need to import the included NSString and UIDevice categories and call [[UIDevice currentDevice] uniqueDeviceIdentifier] like so:

    #import "UIDevice+IdentifierAddition.h"
    #import "NSString+MD5Addition.h"
    NSString *iosFiveUDID = [[UIDevice currentDevice] uniqueDeviceIdentifier]
    

    You can find it on Github here:

    UIDevice with UniqueIdentifier for iOS 5


    Here are the categories (just the .m files - check the github project for the headers):

    UIDevice+IdentifierAddition.m

    #import "UIDevice+IdentifierAddition.h"
    #import "NSString+MD5Addition.h"
    
    #include <sys/socket.h> // Per msqr
    #include <sys/sysctl.h>
    #include <net/if.h>
    #include <net/if_dl.h>
    
    @interface UIDevice(Private)
    
    - (NSString *) macaddress;
    
    @end
    
    @implementation UIDevice (IdentifierAddition)
    
    ////////////////////////////////////////////////////////////////////////////////
    #pragma mark -
    #pragma mark Private Methods
    
    // Return the local MAC addy
    // Courtesy of FreeBSD hackers email list
    // Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb.
    - (NSString *) macaddress{
        
        int                 mib[6];
        size_t              len;
        char                *buf;
        unsigned char       *ptr;
        struct if_msghdr    *ifm;
        struct sockaddr_dl  *sdl;
        
        mib[0] = CTL_NET;
        mib[1] = AF_ROUTE;
        mib[2] = 0;
        mib[3] = AF_LINK;
        mib[4] = NET_RT_IFLIST;
        
        if ((mib[5] = if_nametoindex("en0")) == 0) {
            printf("Error: if_nametoindex error\n");
            return NULL;
        }
        
        if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
            printf("Error: sysctl, take 1\n");
            return NULL;
        }
        
        if ((buf = malloc(len)) == NULL) {
            printf("Could not allocate memory. error!\n");
            return NULL;
        }
        
        if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
            printf("Error: sysctl, take 2");
            return NULL;
        }
        
        ifm = (struct if_msghdr *)buf;
        sdl = (struct sockaddr_dl *)(ifm + 1);
        ptr = (unsigned char *)LLADDR(sdl);
        NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
                               *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
        free(buf);
        
        return outstring;
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    #pragma mark -
    #pragma mark Public Methods
    
    - (NSString *) uniqueDeviceIdentifier{
        NSString *macaddress = [[UIDevice currentDevice] macaddress];
        NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];  
        NSString *stringToHash = [NSString stringWithFormat:@"%@%@",macaddress,bundleIdentifier];
        NSString *uniqueIdentifier = [stringToHash stringFromMD5];  
        return uniqueIdentifier;
    }
    
    - (NSString *) uniqueGlobalDeviceIdentifier{
        NSString *macaddress = [[UIDevice currentDevice] macaddress];
        NSString *uniqueIdentifier = [macaddress stringFromMD5];    
        return uniqueIdentifier;
    }
    
    @end
    

    NSString+MD5Addition.m:

    #import "NSString+MD5Addition.h"
    #import <CommonCrypto/CommonDigest.h>
    
    @implementation NSString(MD5Addition)
    
    - (NSString *) stringFromMD5{
        
        if(self == nil || [self length] == 0)
            return nil;
        
        const char *value = [self UTF8String];
        
        unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
        CC_MD5(value, strlen(value), outputBuffer);
        
        NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
            [outputString appendFormat:@"%02x",outputBuffer[count]];
        }
        return [outputString autorelease];
    }
    
    @end
    
    0 讨论(0)
  • 2020-11-21 06:43

    Apple has added a new framework in iOS 11 called DeviceCheck which will help you to get the unique identifier very easily. Read this form more information. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d

    0 讨论(0)
  • 2020-11-21 06:44

    You can achieve from this code : UIDevice-with-UniqueIdentifier-for-iOS-5

    0 讨论(0)
  • 2020-11-21 06:46

    It looks like for iOS 6, Apple is recommending you use the NSUUID class.

    From the message now in the UIDevice docs for uniqueIdentifier property:

    Deprecated in iOS 5.0. Use the identifierForVendor property of this class or the advertisingIdentifier property of the ASIdentifierManager class instead, as appropriate, or use the UUID method of the NSUUID class to create a UUID and write it to the user defaults database.

    0 讨论(0)
  • 2020-11-21 06:46

    UIDevice identifierForVendor introduced in iOS 6 would work for your purposes.

    identifierForVendor is an alphanumeric string that uniquely identifies a device to the app’s vendor. (read-only)

    @property(nonatomic, readonly, retain) NSUUID *identifierForVendor
    

    The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps onthe same device that come from different vendors, and for apps on different devices regardles of vendor.

    Available in iOS 6.0 and later and declared in UIDevice.h

    For iOS 5 refer this link UIDevice-with-UniqueIdentifier-for-iOS-5

    0 讨论(0)
提交回复
热议问题