Unity3d获取IOS设备唯一标识,以及IDFA

之前苹果设备上获取唯一标识符,可以通过获取Mac地址。但是现在苹果把这条路堵死了。
不过没关系,苹果已经给出了替代方案,可以调用相应的接口,生成一串字符串,用生成的
字符串来代替之前的Mac地址。


Unity端

新建个脚本,然后绑定到一个对象上,脚本代码如下,这片代码我就不多说了,不懂得自己
去看下IOS和Unity的互调。弄完后导出IOS工程。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Runtime.InteropServices;//Must be Defined

public class GetIdentertyControl : MonoBehaviour {

    // Use this for initialization
    public Text IDFA;
    public Text Verdorid;

    [DllImport("__Internal")]
    private static extern void _GetIDFA ();

    public void GetIDFA(string str){
        if (string.IsNullOrEmpty(str)) {
            Debug.Log("IDFA is NULL");
            return;
        }
        IDFA.text = str;
    }

    [DllImport("__Internal")]
    private static extern void _GetVerdorid ();

    public void GetVerdorid(string str){
        if (string.IsNullOrEmpty(str)) {
            Debug.Log("Verdorid is NULL");
            return;
        }
        Verdorid.text = str;
    }
    public void OnClickButton(){
        if(Application.platform != RuntimePlatform.OSXEditor){
            _GetVerdorid();
            _GetIDFA();
            _GetDevName();
            _GetImage();
        }
    }
}

IOS端

  • 先新建个OC的类吧,然后把官方的KeychainItemWrapper代码拷贝进去吧。然后你
    会发现,报错了..这个是因为我们导出的工程默认是使用ARC的,但是官方的这个是不
    使用的。你可以自己根据提示慢慢改也可也使用我弄好的KeychainItemWrapper直接
    导入你工程就好了。(PS:赚点积分)
  • 导入两个包
    这里写图片描述
    然后再新建一个类,来使用之前导入的KeychainItemWrapper,代码如下:
#import "UUID.h"
#import "KeychainItemWrapper.h"

#define APP_IDENTIFIER @"*****************"//这里填你开发者账号的Team

@implementation UUID

+ (NSString*) uuid {

    CFUUIDRef puuid = CFUUIDCreate( nil );
    CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
    NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
    CFRelease(puuid);
    CFRelease(uuidString);

    return result;
}


+ (void) saveToKeyChain {

    NSString *uuid = [self uuid];

    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:APP_IDENTIFIER accessGroup:nil];

    [wrapper setObject:uuid forKey:(__bridge id)kSecValueData];


}

+ (NSString*) getUUIDFromKeyChain {
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:APP_IDENTIFIER accessGroup:nil];

    NSString *password = [wrapper objectForKey:(__bridge id)kSecValueData];
    return password;
}

@end
  • 再新建个类,这个类就是和Unity进行消息互换的。
    代码如下:
#import "InteractiveToUnity.h"
#import "GetImage.h"
#import "UUID.h"
#import 

@implementation InteractiveToUnity

void _GetIDFA (){
    const char* gameObject = "GetIdenterty";
    const char* functionname = "GetIDFA";
    NSString *str = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    UnitySendMessage(gameObject, functionname, [str UTF8String]);
};
void _GetVerdorid (){
    const char* gameObject = "GetIdenterty";
    const char* functionname = "GetVerdorid";
    NSString *str=[UUID getUUIDFromKeyChain];
    if(str == nil || [str  isEqual: @""]){
        [UUID saveToKeyChain];
        str = [UUID getUUIDFromKeyChain];
    }
    UnitySendMessage(gameObject, functionname, [str UTF8String]);
};
@end

简单说下吧,_GetVerdorid这个函数就是生成,并获得设备识别号,_GetIDFA就是获得广告标志符。
这里面调用了ASIdentifierManager所以必须要#import ,如果你的项
目不需要这东西,你可以不加。至于UnitySendMessage这个应该不用我再说了,不知道的人自己搜下
相关的资料吧。


你可能感兴趣的:(unity3d)