UIDevice uniqueIdentifier deprecated - What to do now?

后端 未结 30 2210
日久生厌
日久生厌 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

    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  // Per msqr
    #include 
    #include 
    #include 
    
    @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 
    
    @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
    

提交回复
热议问题