在ios7.0出来以前,我们都是通过wifi的mac来当作IOS设备的唯一标识符。如何在ios下获取设备的MAC,你可以参数这篇文章:获取ios的MAC地址

在没有使用IDFA之前,我们在ios7及以上的版本中使用的是CFUUID

string createCUID()
{
string strRet = "";
CFUUIDRef uuid_ref = CFUUIDCreate(NULL); CFStringRef uuid_string_ref= CFUUIDCreateString(NULL, uuid_ref);
CFRelease(uuid_ref); NSString *uuid = [NSString stringWithFormat:@"%@",(NSString*)uuid_string_ref];
CFRelease(uuid_string_ref); strRet = [uuid UTF8String]; return strRet;
}

然后将其存储在Keychain上,这样即使应用删除了,下次安装时值依然存在(跟MAC相似)。

--关于keychain的使用可以参考这里:

>>ios开发--密码存储之keychain的使用

>>IOS7:如何获取不变的UDID

更多关于IOS唯一标示符的信息,可以参考这里:IOS唯一标识符引导

写到这里,应用中依然没有用到IDFA,直到后来需要接入CPA推广。CPA广告商在ios7上使用的就是IDFA,所以我们必须要用它,用它就无法绕开的一个问题就是:提交版本时如何选择才不会被苹果打回?

关于IDFA的相关资料,网上已经很多了,这里主要说明二点:

1、如何获取IDFA并保存至keychain;

2、提交应用时如何选择;

string strRet;

NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
NSString *keyName = [[NSString stringWithFormat:@"%@.adfa.name",identifier]init];
NSString *keyValue = [[NSString stringWithFormat:@"%@.adfa.value",identifier]init]; NSMutableDictionary *KeyNameValue = (NSMutableDictionary *)[CHKeychain load:keyName];
NSString *ValueADFA= [KeyNameValue objectForKey:keyValue]; if(ValueADFA)
{
strRet = [[ValueADFA uppercaseString] UTF8String];
}
else
{
NSString *adId =[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
//NSLog(@"adId: %@",adId);
strRet = [[adId uppercaseString] UTF8String]; NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];
[usernamepasswordKVPairs setObject:adId forKey:keyValue];
[CHKeychain save:keyName data:usernamepasswordKVPairs];
} return strRet;

这里尽量要保证IDFA的唯一性,如果广告联盟使用手工操作,每下载应用一次后手动去重置一下广告跟踪,然后再下载。这样对于它来讲是二次下载,对于我们来讲,这样的用户其实属于“作弊”了。所以没有将IDFA存到UserDefault中,每次都从keychain上取

使用IDFA,程序中一定要引用Adsupport.Framework,因为我们项目并没有使用到友盟或者其它第三方的SDK,所以提交的情况跟其它引用相关SDK的可能不太一样。但网上关于这个提的问题倒很多,已经上线给出建议和解决方案的却并不多。因为我们项目已经提交并审核通过了,这里只是记录一下

首先一定要勾选申请项目内使用了IDFA,然后我们项目勾选的是“Serve advertisements within the app”

关于这个选项,stackoverflow有人提出了方案(原文链接:http://stackoverflow.com/questions/22979151/improper-advertising-identifier-idfa-usage

没有涉及到广告宣传,仅仅只是跟踪用户转换率之类的,勾选第一项。如何有显示广告就勾选第二、三项,如何都有用到就全部勾选吧。我暂时是这么理解的,如有不对的地方,欢迎斧正 :)

希望使用了IDFA的伙伴们,在提交应用的时候不用太苦恼,毕竟提交一次,waiting for review也需要一段时间,来来回回挺折腾的

AppStore中使用IDFA后提交应用的注意事项的更多相关文章

  1. js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行

    js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行 代码如下: <!DOCTYPE html> <html lang="en" xm ...

  2. iframe中使用模态框提交表单后,iframe加载父页面的解决方法

    在iframe中使用模态框提交表单后,会出现iframe加载整个父页面的问题,如下图: 解决方法: 在form表单中添加target属性 _parent 这个属性会使目标文档载入父窗口或者包含来超链接 ...

  3. 已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中。需要对提交的信息进行修改,信息填入不能为空,为空则则有提示。

    jsp结合SQLSERVER向数据库中的表添加图书信息. 已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中.需要对提交的信息进行修改,信息填入不 ...

  4. mvc中form表单提交的几种形式

    第一种方式:submit 按钮 提交 <form action="MyDemand" method="post"> <span>关键字: ...

  5. hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了

    hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...

  6. jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...

  7. servlet中Java连接数据库后的基本操作

    servlet中Java连接数据库后的基本操作 在eclipse中新建一个工程:login 在Server中新建一个服务器,基本的操作不用说了,在前两天的笔记中可以找到; 需要知道数据库的用户名和密码 ...

  8. 在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

    在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法   ==========方法1: --------1. 选相应 ...

  9. A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?

    A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...

随机推荐

  1. CF 554A 字符串水题

    给出一个字符串,问再加入一个字母,最多能形成多少种字符串 inputaoutput51inputhioutput76 # include <iostream> # include < ...

  2. #CSS margin-top父元素下落

    [我的解决方法] 给该父元素添加如下代码 border-top: 1px solid rgba(0,0,0,0); box-sizing:border-box; [原因] css2.1盒模型中规定的内 ...

  3. open-falcon v0.2 监控部署记录

    前言 好吧,不知道为什么要写,其实,官方文档已经很详细.但是,总是想写点什么,怕自己忘记了.那就简单说说吧,在部署过程中,发现官方文档和我想的不一样,可能是我按照顺序习惯了,所以想从新跟着顺写来记录一 ...

  4. IllegalArgumentException: Unmatched braces in the pattern.

    IllegalArgumentException: Unmatched braces in the pattern. 非法参数异常. 不匹配的 吊带 在 样品 中. === 没有管.  项目一直卡在d ...

  5. luoguP4643 阿狸和桃子的挑战 思维

    看下数据范围: \(n \leq 14\),emmmm,状压\(dp\)的分 \(n \leq 10000, m \leq 100000\),emmmm.....???,这是什么数据范围? 再观察一下 ...

  6. Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装

    阅读目录 1. 通过HttpServletRequest获得请求参数和数据 2. 处理方法形参名==请求参数名 3. 如果形参名跟请求参数名不一样怎么办呢?用@RequestParam注解 4. 用实 ...

  7. spring cloud 学习(2) - eureka server注册中心高可用及安全认证

    接上节继续,注册中心单点肯定是不牢靠的,可以参考下面的方案做成注册中心集群: 弄成3个节点,每个节点向其它节点注册,这样只要集群中有一个节点正常工作即可.为了方便在本机弄出这种效果,我们先修改下hos ...

  8. Win32动态链接库和MFC 动态链接库

      通过使用 DLL,程序可以实现模块化,由相对独立的组件组成.例如,一个计帐程序可以按模块来销售.可以在运行时将各个模块加载到主程序中(如果安装了相应模块).因为模块是彼此独立的,所以程序的加载速度 ...

  9. google打不开怎么办?谷歌打不开的解决方法

    www.ggfwzs.com 我是在这里安装插件,安装后可以打开google http://jingyan.baidu.com/article/b907e627d67ad646e6891c52.htm ...

  10. lodash用法系列(2),处理对象

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...