
下载一个爱思助手,连上你的iPhone,在APP上点击右键-「复制标识」,找个地方粘贴,就看到了,如图:以菜鸟裹裹为例,获取到的标识(bundle identifier)为 comcainiaocnwireless
IOS系统中,获取设备唯一标识的方法有很多:
一UDID(Unique Device Identifier)
UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。
二UUID(Universally Unique Identifier)
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码
三MAC Address
四OPEN UDID
五广告标示符(IDFA-identifierForIdentifier)
六Vindor标示符 (IDFV-identifierForVendor)
Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。
经测试,只要设备上有一个tencent的app,重新安装后的identifierForVendor值不变,如果tencent的app全部删除,重新安装后的identifierForVendor值改变。
但是很不幸,上面所有这些表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样。
由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。
通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。
keychain里保存的信息不会因App被删除而丢失。所以,可以利用这个keychain这个特点来保存设备唯一标识。
那么,如何在应用里使用使用keyChain呢,我们需要导入Securityframework ,keychain的 *** 作接口声明在头文件SecItemh里。
直接使用SecItemh里方法 *** 作keychain,需要写的代码较为复杂,我们可以使用已经封装好了的工具类KeychainItemWrapper来对keychain进行 *** 作。
KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用 *** 作的封装类,在官网上下载了GenericKeychain项目后,
只需要把“KeychainItemWrapperh”和“KeychainItemWrapperm”拷贝到我们项目,并导入Securityframework 。KeychainItemWrapper的用法:
/ 初始化一个保存用户帐号的KeychainItemWrapper /
KeychainItemWrapper wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"
accessGroup:@"YOUR_APP_ID_HEREcomyourcompanyAppIdentifier"];
//保存数据
[wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];
[wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];
//从keychain里取出帐号密码
NSString password = [wrapper objectForKey:(id)kSecValueData];
//清空设置
[wrapper resetKeychainItem];
其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Securityframework 里头文件“SecItemh”里定义好的key,用其他字符串做key程序会出错!
IDFA(Identifier for Advertising,广告识别符)是一种iOS设备识别码,广告平台可借此对广告和用户进行追踪,通过抓取用户浏览记录,打通不同App之间的广告。
最常见的就是当你在某个电商app浏览了一款商品后打开了某个资讯类app时,就可以看到关于这款商品的广告。
用户可以通过授权跟踪权限来决定是否被广告商识别,授权行为从系统层面下沉到了App层面。
在手机中直观地体现就是,当App获取IDFA时,就会像获取相机权限、相册权限一样,d出一个窗口,出现“想要获取权限以在其他公司拥有的App和网站中追踪您的活动”的字样。用户可以选择“允许追踪”或“禁止追踪”。
最近项目中有个需求,在iOS设备上使用iOS系统提供的内容分享功能,从第三方App应用直接分享实体内容到我们的应用中。其大概的原理是这样的,首先为我们的iOS应用注册可以打开document types(文档类型),然后在第三方应用中,如果它们使用了iOS提供的分享功能,那么就会看到我们的应用程序,点击进行分享。
而关于需求的设计和实现的具体思路,我会在下一篇博客中详细讲解。这篇文章是来讲一下在iOS系统中为了更好的进行类型标识,而提供的一套共用的规范,也就是标题中提到的“Uniform Type Identifier(UTI)”,我把它翻译成“统一类型标识符”,下面统一简称为“UTI”。
网上关于UTI的使用教程少之又少,所以我只是参考了苹果官方文档提供的讲解,这篇博客权当是我对于官方文档的一个理解吧!!自认为很重要的部分,我会贴出来官方文档原文,以便于大家学习理解,不至于被我的歪词所误导,同时也推荐大家从开发者中心上搜一些文档来看,这里推荐几篇:
1 Cocoa Core Competencies -- Uniform Type Identifier
这篇文档提供了一个视图来说明UTI是什么,怎么工作和被谁使用,是个非常好的新手指南。
2 Uniform Type Identifier介绍和使用
这篇文档详细得描述了UTI的基础概念和属性,还有它们的使用方法,内容非常丰富,本文主要参考的就是这篇
3 System-Declared Uniform Type Identifiers
这篇文档提供了在OS X系统中定义的一个UTI的列表,我们可以查看每一种官方提供的UTI的定义和涵义。
4 UTType Reference
这篇文档提供了对UTI字符串直接 *** 作的函数方法
5 一步一步为iOS应用添加自定义的document type和新的UTI
顾名思义,这篇文档,讲解的是如何在iOS应用中导入新的UTI和添加自定义的document type。
为什么会有UTI,打个比方,它就像是如今世界各国作为官方语言统讲得英文。为什么这么比喻呢,因为中国人讲母语汉语,法国人讲母语法语,但是如果一个中国人到了法国,而又不懂法语,碰到的法国人不懂汉语,那么他们如何交流沟通呢,这就是英文的用武之地了。而相对而言,苹果 *** 作系统相当于整个世界,各个不同的程序或者服务相当于各个国家,俩个不同的程序想要互通交流,就比如互相发送文件,可是一个使用文件扩展名,一个使用MIME类型,俩者的数据类型不同,无法解析,都互相不认识,那么怎么交流沟通呢在这样的情景下,UTI就有了用武之地啦,它就充当的是现实世界的英文这个角色。
Uniform type identifiers(UTIs)提供了在整个系统里面标识数据的一个统一的方式,比如documents(文档)、pasteboard data(剪贴板数据)和bundles(包)。
大多数情况下,一个UTI提供的是系统中所有程序和服务都能够识别并且依赖的一个唯一的标识,这么讲可能有些太抽象,我们使用一下官方文档中给出的例子,比如一个JPEG类型的文件,在不同的环境下,可以有下面几种不同的标识方法:
而UTI则是用‘publicjpeg’这个字符串标识,完全代替了这些不一致的标签,这个字符串和其他任何一个旧标签都是完全兼容的,而且他们之间可以相互转换。由于UTI可以标识任何类型的实体,所以他们相对于旧标签来说灵活性更强了;使用UTI我们可以表示下面这些实体:
Apple给我们提供了在iOS和Mac应用中通用的UTI字符串集合,比如,'publicdata'、'publicitem'、'publicimage'等,这些我们都可以在官方文档中进行查阅他们的涵义。除此之外,我们也可以在应用程序中自定义自己的UTI字符串,比如我们可以定义一个标识特殊文档格式的UTI字符串叫'ccicocshaobozheng',如果其他的应用程序想要支持我们这种格式的文档,他们就可以用'ccicocshaobozheng'来标识我们的文档。
看到我们上边的举例了,那么我们来说一下定义UTI字符串时所用到的字符集。通常一个UTI字符串是一个包含ASCII字符的Unicode字符串,同时也可以加入罗马字母和阿拉伯数字,如(A-Z),(a-z),(0-9)还有点号("")和连接符("-")。而任何包含非法字符的字符串,如包含下划线'_',都无法作为UTI来标识内容,而且Apple不会有任何错误反馈。
就像我上面的例子一样,UTI的定义和我们开发iOS程序时填写organization时一样,采取的是反域名规则。如下面这几种:
而UTI中的域名,如‘com’、‘public’这些,仅仅是用来表示这个UTI字符串在域名层级中的位置,它不会影响任何相似类型的分组。比如,‘public’域名就是大部分应用程序用来标识标准类型的,而目前仅仅只有Apple可以创建‘public’域名的UTI。
另外,我们可能会碰到的是一种‘dyn’域名,是动态域名,意思就是我们使用中,不会指定这种类型的UTI为某一个字符串,然后系统运行过程中,会自动识别帮我们处理。针对这种动态标识,我们是看不到的,但是我们可以通过UTI字符串的 *** 作方式转换成我们的常用类型,比如OSType,MIME类型等。
最后一种就是可以自定义的域名,代表性的就是‘com’域名,Apple也给我们提供了一些他们定义的'com'域名的UTI。
UTI相对于其他那些旧标签的一个关键优势就是在于,它可以在一个顺应结构中声明。而用我们面向对象的方式说,UTI就是可继承的,而且是多继承方式。先上图:
如上图所示,‘publichtml’这个UTI就是继承于‘publictext’这个UTI,因为‘publichtml’标识的是HTML文本格式,也属于是文本格式的一种,而文本、等等这些内容又都属于是数据的一种,所以他们继承于'publicdata'这个UTI。
上面这个UTI继承结构图,指的是UTI中的内容形式的继承结构,此外,原则上来说,指定UTI层次的时候,即可以指定它的功能结构,也可以指定它的物理结构,上图是就是一个内容形式的功能结构图物理结构指的就是这个UTI的物理实质,比如它标识一个目录,一个文件等,而功能结构指的就是这个UTI的用图,比如同样是文件,它标识的可以是、视频等等。 而官方文档也给出了一般指定UTI层次结构的规则:
然而,指定UTI的功能层次并不是强制的,但是这样做是考虑到可以更好地将UTI集成到系统一些特性中,就比如Spotlight应用,就可以把我们指定的功能性UTI和命名属性联系起来。下面是一个UTI功能顺应结构和物理顺应结构图:
这个顺应性使得我们的UTI在决定类型上拥有更高的灵活性,不仅避免了大量的条件判断的使用,而且还可以关联你想不到的一些类型。
在Mac OS中我们开发应用时我们可以经常使用到UTI,但是在开发iOS应用程序时,我们应用到UTI的场景不是很多,这也是现在网上教程偏少得原因。而在iOS开发中,一般我们使用UTI来标识剪贴板的类型。而在具体使用到Apple给我们提供的UTI字符串的时候,我们必须使用在UTCoreTypesh文件中定义的常量来代替直接使用字符串。关于UIPasteboard的详细使用,大家可以去这篇博客中详细学习一下: 精通UIPasteboard粘贴板 。
现在我们来看一下苹果提供的一些直接 *** 作UTI的函数方法,简单列举几个。我们可以在MobileCoreServices这个framework中的UITypeh文件中找到,我们也可以仔细的看一下这个framework中的其他文件,都是对UTI的一些定义和声明。
苹果允许Mac开发者为他们的Mac App中独有的数据格式自定义新的UTI。它们一般被声明在下面几个文件中
使用官方给我们的一个UTI声明的例子,Publicjpeg声明:
一个UTI声明的属性列表:
<section>
<div style="margin-top:1667em;margin-bottom:1667em;">
<table border="0" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<th scope="col" style="font-weight:400;background-color:#93A5BB;padding:03em 0667em;font-size:13px;color:#FFFFFF;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#9BB3CD;border-right-width:1px;border-right-style:solid;border-right-color:#9BB3CD;">
<p style="font-weight:700;line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;margin-bottom:033em;">
Key
</p>
</th>
<th scope="col" style="font-weight:400;background-color:#93A5BB;padding:03em 0667em;font-size:13px;color:#FFFFFF;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#9BB3CD;border-right-width:1px;border-right-style:solid;border-right-color:#9BB3CD;">
<p style="font-weight:700;line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;margin-bottom:033em;">
Value type
</p>
</th>
<th scope="col" style="font-weight:400;background-color:#93A5BB;padding:03em 0667em;font-size:13px;color:#FFFFFF;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#9BB3CD;border-right-width:1px;border-right-style:solid;border-right-color:#9BB3CD;">
<p style="font-weight:700;line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;margin-bottom:033em;">
Description
</p>
</th>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTExportedTypeDeclarations</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
array of dictionaries
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
An array of exported UTI declarations (that is, identifiers owned by the bundle’s publisher)
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTImportedTypeDeclarations</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
array of dictionaries
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
An array of imported UTI declarations (that is, identifiers owned by another company or organization)
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTTypeIdentifier</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
string
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
The UTI for the declared type This key is required for UTI declarations
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTTypeTagSpecification</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
dictionary
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
A dictionary defining one or more equivalent type identifiers
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTTypeConformsTo</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
array of strings
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
The UTIs to which this identifier conforms
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTTypeIconFile</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
string
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
The name of the bundle icon resource to associate with this UTI
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTTypeDescription</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
string
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
A user-visible description of this type You can localize this string by including it in an <code style="font-family:Courier, Consolas, monospace;color:#666666;">InfoPliststrings</code> file
</p>
</td>
</tr>
<tr>
<td scope="row">
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
<code style="font-family:Courier, Consolas, monospace;color:#666666;">UTTypeReferenceURL</code>
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
string
</p>
</td>
<td>
<p style="line-height:normal;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;">
The URL of a reference document describing this type
</p>
</td>
</tr>
</tbody>
</table><br />
</div>
</section>
<section>
<a name="//apple_ref/doc/uid/TP40001319-CH204-SW4" title="Recommendations for Declaring new Uniform Type Identifiers" style="color:#3366CC;font-family:'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif;font-size:13px;background-color:#FFFFFF;"></a>
</section>
<p>
<br />
</p>
而且自定义的UTI必须指定UTExportedTypeDeclarations或者UTImportedTypeDeclarations,这样如果是你定义的UTI,第三方应用程序和服务都可以使用,而如果是其他人定义的UTI,那么加入到你的项目中后,你就可以看到这种类型的数据。
原文地址: 郑少博的技术博客---详解苹果提供的UTI(统一类型标识符)
1、点击XCode的菜单-Windows->Organizer。
2、直接复制、粘贴,就可以得到iPhone手机的UUID了。
UUID (Universally Unique Identifier)是一个软件建构的标准,是通用唯一识别码的意思。UUID被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。
UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。
目前最广泛应用的UUID,即是微软的Microsoft'sGloballyUniqueIdentifiers(GUIDs),而其他重要的应用,则有Linuxext2/ext3档案系统、LUKS加密分割区、GNOME、KDE、MacOSX等等。
首先,要开发苹果app,必须要掌握苹果app开发工具,那就是Objective-c和c语言。在开发苹果app软件的时候,需要走以下流程。
1形成开发App软件的idea
2苹果App软件的主要功能设计
3App的大概界面构思和设计(使用流程设计)
4大功能模块代码编写
5大概的界面模块编写
6把大概的界面和功能连接后,app的大致demo就出来了
7demo自己试用和体验几遍后,根据情况修改
8app的08左右版本完成后可以加入proction的图标和部分UI
9没有大错误后,09版本可以尝试寻找beta用户
10根据测试用户的反馈,重复7-9的步骤
11app完成后,加入appicon,等等UI元素。反复测试无错误后上传iTunes
如何发布苹果app,需要做哪些准备呢?
一:必须获得ISO开发证书
为了获取IOS开发证书,你首先需要利用电脑上的钥匙串访问程序(KeychainAess)生成证书签名请求(CSR)。创建的CSR将提示钥匙串访问同时产生公有和私有密钥对。私有密钥缺省保存在钥匙串的“登录”,你可以在钥匙串访问的目录下面的“密钥”。
接下来,你还得完成:提交CSR(SubmittingaCertificateSigningRequestforApproval)、证明CSR(ApprovingCertificateSigningRequests)、证明CSR(ApprovingCertificateSigningRequests)、下载并安装开发证书(DownloadingandInstallingDevelopment)四个步骤。
二:设置注册设备这里的设备是指IPHONE或IPAD设备。因为开发后,需要在真机上运行设备的UUID可以通过ITUES或XCODE的”组织”窗口得到
三:APPIDAppid是应用程序标识,每个AppID由苹果生成的唯一标识的10个字符“BundleSeedID”前缀和自定义的“BundleIdentifier”后缀组成。后缀推荐格式为域名的反写,即com公司产品。APPID是逻辑概念,与硬件无关。
四:这个部分是重点。也分为开发证书和发布证书
首先是要创建开发profile然后安装证书。接着,创建开发profile并安装证书
苹果app开发公司又该如何在这激烈的竞争中站稳脚呢?
对于一个新创的APP开发公司,团队技术精湛也是尤其的重要,因此不少的开发公司都开始接外包案子这一业务,但这是快钱,不利于一个企业的长期发展,代工产业,拼到最后就是接案数量以及价格,对于公司的品牌没有多大的加分,更没有留下一个属于自己的产品。苹果app开发公司应该在APP数量以及APP品牌上面多下功夫,两条线的策略,一条是以尽可能多数量的APP开发来开创现金流,外包的业务只是适合一些小公司,所以另一条是开创自有品牌的苹果APP软件。如何吸引用户经常性的愿意转发分享也必须纳入考虑,功能与创意都是一时的,用户活跃度才是关键。
方法一:通过Windows下的iTunes 1、数据线连接iPhone手机,在Windows下打开iTunes,在 iPhone 管理界面下点击“序列号”查看自己的 UUID 标识符。 2、此时点击菜单-编辑->复制 3、新建一个文档或文本文件,粘贴就会出现类似于3cfe09dc0a545766ed912db6c32a65b37cc06ae5这就是iPhone手机的UUID 方法二:通过XCode的Organizer 1、点击XCode的菜单-Windows->Organizer,会出现如此界面 2、直接复制、粘贴就可以了 方法三:通过代码实现 对于IOS开发者通过以下代码实现 -(NSString) uuid { CFUUIDRef puuid = CFUUIDCreate( nil ); CFStringRef uuidString = CFUUIDCreateString( nil, puuid ); NSString result = (NSString )CFStringCreateCopy( NULL, uuidString); CFRelease(puuid); CFRelease(uuidString); return [result autorelease]; }
以上就是关于ios 怎么查看bundle identifier全部的内容,包括:ios 怎么查看bundle identifier、苹果ios多开怎么识别唯一标识、关于苹果IDFA 新规 以及在iOS 14中的获取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)