通过插件在Unity中的Apple idfa

时间:2015-12-10 03:39:39

标签: c# ios xcode

我从另一个堆栈溢出答案中借用了这段代码:

example.mm

const char* getIdfa()
{
    if([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled])
    {
        NSString * idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
        //return (const char*)[idfa UTF8String]; // ##### malloc error I uncomment this line #####
    }
    return nil;
}

iOSplugin.cs

#if UNITY_IOS
    [DllImport("__Internal")]
    public static extern string getIdfa();
#endif

Xcode构建可能影响问题的设置: 项目格式:xcode 3.1兼容 Obj-C自动参考计数:是

如果我取消注释这一行:

return (const char*)[fdsa UTF8String];

然后我收到以下错误:

(531,0x19e9ef000) malloc: *** error for object 0x1357d44e1: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

有一些名为cocoaToMonoString的函数的引用可以解决这个问题,但是我找不到任何关于它的例子或文档。

如何将Xcode中的字符串返回Unity?

2 个答案:

答案 0 :(得分:3)

只需两美分的贡献。

现在您可以使用Application.RequestAdvertisingIdentifierAsync获取IDFA(或Android的GAID):

Application.RequestAdvertisingIdentifierAsync(
        (string advertisingId, bool trackingEnabled, string error) =>
            Debug.Log("advertisingId " + advertisingId + " " + trackingEnabled + " " + error)
);

此方法返回一个布尔值,表示成功时为true;如果当前平台不支持广告标识符,则返回false。

答案 1 :(得分:1)

[idfa UTF8String] 这是对NSString内部字节数组的引用。 它无法传递回Unity / C#。

添加此功能:

static const char* MakeStringCopy(const char* string)
{
    if (string == NULL)
        return NULL;

    char* res = (char*)malloc(strlen(string) + 1);
    strcpy(res, string);
    return res;
}

并返回:

return MakeStringCopy([idfa UTF8String]);