读书人

UIDIvice的几个拓展效能(获取唯一标示

发布时间: 2012-08-17 02:08:34 作者: rapoo

UIDIvice的几个拓展功能(获取唯一标示、判断是否越狱)

最近的项目中用到了几个比较不常用的方法:

?

(1)获取设备的唯一标示,有的应用,如银行、支付、广告等可能需要绑定设备,但是苹果由于种种原因现在已经停止了使用UIDivice的uniqueIdentifier属性,所以只有改用MAC地址。

?

(2)有些金融类的应用出于安全对已越狱的设备进行友谊提示,所以要判断ios是否越狱。

?

?

#import <Foundation/Foundation.h>@interface UIDevice (Help)/* *根据mac地址和设备信息获取设备唯一标示(ios5以后的系统中已经停止使用设备标示uniqueIdentifier) */- (NSString *) uniqueDeviceIdentifier;/* *根据mac地址获取设备唯一标示(ios5以后的系统中已经停止使用设备标示uniqueIdentifier) */- (NSString *) uniqueGlobalDeviceIdentifier;/* *判断设备是否越狱 */- (BOOL)isJailbroken;@end

?

?

#import "UIDevice+Help.h"#import "NSString+MD5Addition.h"#include <sys/socket.h>#include <sys/sysctl.h>#include <net/if.h>#include <net/if_dl.h>@interface UIDevice(Private)- (NSString *) macaddress;@end@implementation UIDevice (Help)#pragma mark -#pragma mark Private Methods/* *获取MAC地址 */- (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");        free(buf);        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;}- (BOOL)isJailbroken {    BOOL jailbroken = NO;      NSString *cydiaPath = @"/Applications/Cydia.app";      NSString *aptPath = @"/private/var/lib/apt/";      if ([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) {          jailbroken = YES;      }      if ([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) {          jailbroken = YES;      }      return jailbroken;  }  @end
?

MD5加密

?

#import <Foundation/Foundation.h>@interface NSString(MD5Addition)- (NSString *) stringFromMD5;@end
#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

读书人网 >移动开发

热点推荐