openudid源码_openid oauth20

hacker|
80

文章目录:

友盟统计怎么用

问题一:iOS 友盟统计怎么用 送给有需要的朋友,这里我封装了友盟统计的功能,只需要导入这个类,就可以很方便的使用:

[objc] view plaincopyprint?

01.

02. HYBUMAnalyticsHelper.h

03. UMAnalyticsDemo

04.

05. Created by 黄仪标 on 14/11/19.

06. Copyright (c) 2014年 黄仪标. All rights reserved.

07.

08.

09.#import

10.

11./*!

12. * @brief 友盟统计功能相关操作API封装

13. *

14. * @author huangyibiao

15. */

16.@interface HYBUMAnalyticsHelper : NSObject

17.

18./*!

19. * 启动友盟统计功能

20. */

21.+ (void)UMAnalyticStart;

22.

23./ 在viewWillAppear调用,才能够获取正确的页面访问路径、访问深度(PV)的数据

24.+ (void)beginLogPageView:(__unsafe_unretained Class)pageView;

25.

26./ 在viewDidDisappeary调用,才能够获取正确的页面访问路径、访问深度(PV)的数据

27.+ (void)endLogPageView:(__unsafe_unretained Class)pageView;

28.

29.@end

HYBUMAnalyticsHelper.h

UMAnalyticsDemo

Created by 黄仪标 on 14/11/19.

Copyright (c) 2014年 黄仪标. All rights reserved.

#import

/*!

* @brief 友盟统计功能相关操作API封装

*

* @author huangyibiao

*/

@interface HYBUMAnalyticsHelper : NSObject

/*!

* 启动友盟统计功能

*/

+ (void)UMAnalyticStart;

/ 在viewWillAppear调用,才能够获取正确的页面访问路径、访问深度(PV)的数据

+ (void)beginLogPageView:(__unsafe_unretained Class)pageView;

/ 在viewDidDis......

问题二:如何使用友盟统计 加入XCode工程,实现基本使用

导入SDK

下载Analytics_iPhone_SDK_1.6.4.zip并解压缩

解压缩之后可以看到如下2个文件: MobClick.h libMobClickLibrary.a

我们在编辑SDK时,使用的设置为 Base SDK:iOS 4.2,iOS Depolyment Target: iOS 3.0,因此该版本的SDK支持从iOS 3.0 ~ 4.2的设备使用,在工程中引入友盟统计SDK时,推荐设置Base SDK为最新的iOS SDK最新版(当前最新版为iOS 4.2)

导入插件

请在你的工程目录结构中,右键点击Classes文件夹,选择Add-Existing Files...选择这两个文件。或者将这两个文件拖入XCode工程目录结构中,在弹出的界面中选择Copy item

问题三:如何使用友盟统计 可以使用来财猫,只需要开启客户端,软件自动就能帮 助你的APP提高友盟统计量。

问题四:android开发友盟统计怎么使用 统计的维度很多,不过最基本的新增用户和启动次数。关于这个,可能就需要涉及到Android的activity的生命周期和状态改变。为了更好的理解,做了个简单的代码尝试。

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.e(TAG,enter onCreate”);

}

protectedvoid onStart() {

super.onStart();

Log.e(TAG,onStart);

}

问题五:iOS 友盟统计怎么用 加入XCode工程,实现基本使用 导入SDK 下载Analytics_iPhone_SDK_1.6.4.zip并解压缩 解压缩之后可以看到如下2个文件: MobClick.h libMobClickLibrary.a 我们在编辑SDK时,使用的设置为 Base SDK:iOS 4.2,iOS Depolyment Target: iOS 3.0

问题六:友盟统计怎么统计在线人数? 友盟统计是如何识别用户的? 友盟UMID 方案解析!

香布拉啦2014-12-16 11:40

1. 基本概念

根据能否追踪到单个独立的设备, 可以将一个统计系统分为可区分统计(Discriminative Statistics)和不可区分统计(Non-Discriminative Statistics)。友盟提供的是可区分统计,也就是会利用一个身份标识符(Unique ID,以后简称 ID)长期追踪单个设备的数据。作为对比,早期的网站统计都是不可区分统计,例如页面访问次数,独立 IP 数等;现代的网站统计都是基于 Cookie 或硬件指纹的可区分统计。由于智能设备提供了足够多的硬件指纹和计算能力,友盟从第一天开始就专注于可区分统计。

大多数移动统计的 ID 都是通过系统 ID 生成的,包括但不限于 IMEI、MAC、Android ID。最著名的 ID 莫过于 UDID, 迫于隐私的压力,苹果最终废弃了 UDID 和 MAC 地址。

大多数网站统计都是基于 Cookie的,因此是暂态ID(Temporal ID)。OpenUDID 就是一个典型的暂态ID。

苹果的 IDFA 和 IDFV 都是系统ID,但是他们同时也是暂态ID。

由于可区分统计涉及到用户隐私,因此友盟在计算中使用的都不是系统 ID ,而是自己的 UMID。友盟不会向第三方[1]提供包含原始 ID 或 UMID 的数据,而是提供聚合后的结果。UMID 既不是系统ID也不是暂态ID,它是一个在不断演化的ID解决方案。本文将会解释友盟为什么要设计 UMID,又为何要不断地改进这个方案。

2. ID质量

进行可区分统计的基础是确立一个可靠的身份标识符,这看上去是一个很简单的事情,只需要选择一个ID,或者人为构造一个类Cookie ID,就可以完成独立用户量、留存等分析。但遗憾的是,除了苹果已经废除的UDID,几乎没有一个接近完美的ID。

为了方便讨论,首先忽略假数据的存在,假设每个设备都有一个真实的身份标识X。可区分统计的目标是选择一个合适的身份标识I,使得基于I的统计结果尽可能地和 X 一致。

首先,我们引入两个概念ID冲突(Collision)和ID漂移(Jitter)。

ID冲突

对于某个设备 *** (Device Cohort),在某个时间段内,总是可以测量 X 和 I 的数量,用 Count(X) 和 Count (I) 来表示。如果在足够短的时间内

Count(X) Count(I)

我们称 I 是一个存在冲突的 ID。

ID漂移

对于某个设备 *** (Device Cohort),在某个时间段内,总是可以测量 X 和 I 的数量,用 Count(X) 和 Count (I) 来表示。如果在足够长的时间内

Count(X)

问题七:如何在自己网站显示友盟统计数据 1.登录友盟网址打开百度搜索”zz友盟“ 打开友盟统计网站,然后打开然后点击”注册“然后你账号了就直接登录,没有的就要注册账号

2.点击”产品“-选择u-wab(网站统计)

3.打开的页面 点击”立即使用“ 添加你的网站地址了-点击”添加网站“

把自己的网站信息填写就可以了

4.确定添加后,会跳到下一步 获取代码,在这里我们看到有很多的代码,我们看自己的喜爱选择一种代码,复制过来

5.将复制的代码放在您要跟踪的每个网页标记之前

6.点击生成,就可以统计了

很高兴回答你的问题,期待你的采纳,谢谢

问题八:怎样把友盟统计或者百度统计放到网站上 用的是什么建站源码,一般放在页脚源码,将统计js代码放上,同时在友盟统计后台添加站点,百度同理

问题九:友盟统计的用户活跃度是怎么定义的 Android 统计分析 SDK使用指南

1. 建立App,下载SDK

登录你的帐号后,看到友盟的管理后台,点击+添加新应用,进入新应用信息填写的页面。

App建立成功后,可以获得该App的AppKey,以及最新的开发指南和SDK文件。

可在 这里 下载SDK,包含开发文档,demo程序和jar包。

说明:在新应用信息填写中,请尽量填 *** 实的信息。您可以通过友盟统计分析平台的特性节省重复建立App的时间。

如果您要对App不同的发布渠道进行统计,不需要创建新App,请使用分发渠道分析,通过分发渠道分析,您可以更方便的对比数据。

2. 实现基本的使用基本统计实现本的页面跳转,机型,分辨率,地理位置 …的统计1. 导入umeng-sdk*.jar(简称SDK)下载最新版sdk的zip包,解压将其中的umeng-sdk.jar释放到本地目录,Eclipse用户右键您的工程根目录,选择Properties - Java Build Path - Libraries, 然后点击 Add External JARs... 选择指向 Analytics_Android_SDK_*.jar的路径,点击OK,即导入成功。

2. 配置 AndroidManifest.xml ……说明:

META-DATA 用途

UMENG_APPKEY 用来定位该应用程序的唯一性。

UMENG_CHANNEL 用来标注应用推广渠道,区分新用户的来源来查看统计,您可以使用20位以内的英文和数字为渠道定名,替换valu......

问题十:百度统计和友盟统计哪一个更好? 用百度的,收录方面会更好点。比如:百度分享 就明确说过了,“使用了百度分享的网页可以更快地被百度爬虫发现,从而帮助网站的内容更快地被百度抓取”。

如果不考虑百度收录,用其他也可以。当然用与不用百度的可能也不是很明显。

ios开发怎么使用cocoapods

一、概要

iOS开发时,项目中会引用许多第三方库,CocoaPods()可以用来方便的统一管理这些第三方库(从一个坑出来,又进了另一个坑而已……)。

二、安装

由于网上的教程基本都大同小异,但细节之处还不是很完善,所以借机会在这里补充下:

注:要使用CocoaPods,那就要下载安装它,而下载安装CocoaPods需要Ruby环境

1、Ruby环境搭建

当前安装环境为Mac mini 10.8.5。Mac OS本身自带Ruby,但还是更新一下保险,因为我第一次安装在没有更新Ruby的情况下就失败了。

a 查看下当前ruby版本:打开终端输入 ruby -v(确实安装了,不过用这个版本接下来工作失败了,所以更新下ruby)

[objc] view plain copy print?

ritekiMac-mini:PodTest lucky$ ruby -v

ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

ritekiMac-mini:PodTest lucky$

b 更新ruby

终端输入如下命令(把Ruby镜像指向taobao,避免被墙,你懂得)

gem sources --remove

gem sources -a

gem sources -l (用来检查使用替换镜像位置成功)

[objc] view plain copy print?

ritekiMac-mini:~ lucky$ gem sources --remove

removed from sources

ritekiMac-mini:~ lucky$ gem sources -a

added to sources

ritekiMac-mini:~ lucky$ gem sources -l

*** CURRENT SOURCES ***

补充:(2016-01-20更新)

淘宝已经关闭HTTP协议的景象服务,改为HTTPS协议。

淘宝ruby地址:

2、下载安装CocoaPods

终端输入:sudo gem install cocoapods

[html] view plain copy print?

ritekiMac-mini:~ lucky$ sudo gem install cocoapods

CHANGELOG:

## 0.32.1

##### Bug Fixes

* Fixed the Podfile `default_subspec` attribute in nested subspecs.

[Fabio Pelosin][irrationalfab]

\ [#2050]()

Successfully installed cocoapods-0.32.1

Installing ri documentation for cocoapods-0.32.1

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rdoc/rdoc.rb:280: warning: conflicting chdir during another chdir block

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rdoc/rdoc.rb:287: warning: conflicting chdir during another chdir block

Done installing documentation for cocoapods after 10 seconds

1 gem installed

这样就下载安装好了CocoaPods

3、使用CocoaPods

a 新建一个项目,名字PodTest

b 终端中,cd到项目总目录(注意:包含PodTest文件夹、PodTest.xcodeproj、PodTestTest的那个总目录)

[objc] view plain copy print?

cd /Users/lucky/Desktop/PodTest

c 建立Podfile(配置文件)

接着上一步,终端输入 vim Podfile

键盘输入 i,进入编辑模式,输入

platform :ios, ‘7.0‘

pod ‘MBProgressHUD‘, ‘~ 0.8‘

然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq

注意:键盘输入 :后,才能输入wq。回车后发现PodTest项目总目录中多一个Podfile文件

激动人心的时刻到了:确定终端cd到项目总目录,然后输入 pod install,等待一会,大约3分钟。

查看项目根目录:

注意:现在打开项目不是点击 PodTest.xodeproj了,而是点击 PodTest.xcworkspace

对于工程发生的变化,有几点需要说明:

a、第三方库会以成静态库方式引入工程使用

CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程就放在刚才新生成的Pods目录下。整个第三方库工程会生成一个名称为libPods.a的静态库提供给工程使用。

b、xcworkspace(PodTest.xcworkspace)的作用是管理工程和第三方库

PodTest工程和Pods工程被以workspace的形式组织和管理。

打开项目后看到项目结构并且测试一下:

运行结果:

补充:

1、CocoaPods的基本安装及使用都详细的说明了,但还有一些补充,当需要同时导入多个第三方时候怎么办 ?

这就需要修改Podfile了,就是用vim编辑的那个保存在项目根目录中的文件,修改完了Podfile文件,需要重新执行一次pod install命令。

例如:

platform :ios

pod ‘JSONKit‘, ‘~ 1.4‘

pod ‘AFNetworking‘, ‘~ 2.0‘

2、CocoaPods可以查找你想要的第三方库

终端输入命令:pod search UI

疯了了,我怎么查找这么大众的关键字,好多库~~

然后重新编辑Podfile文件,按照之前的步骤,把更多的库都导入项目!

3、上文中“建立Podfile(配置文件)接着上一步,终端输入 vim Podfile”步骤,如果不习惯使用vim编辑器,也可以使用linux命令touch,生成一个空的Podfile文件,然后使用其他的文本编辑器都可以,例如:

[objc] view plain copy print?

lizhongfudeMacBook-Pro:~ lizhongfu$ cd /Users/lizhongfu/Desktop/TestProject

lizhongfudeMacBook-Pro:TestProject lizhongfu$ touch Podfile

编辑好Podfile文件后,就可以执行pod install第三方导入了(详见:补充第1条),CocoaPods就开始为我们做下载源码、配置依赖关系、引入需要的framework等一些列工作。

4、如果已经生成了CocoaPods管理的工程,则可以在Xcode中编辑Podfile,编辑保存后,别忘记cd到根目录,调用pod install命令

5、项目存在多个Target的时候,需要配置Podfile文件来支持新增加的Target,否则只支持项目默认建立时生成的Target:

a、如果新建一个Target,命名为Second,并且Second与Test两个Target所需要的第三方支持相同,也就是使用相同的Pods依赖库,则可以使用

link_with关键字:

[objc] view plain copy print?

link_with ‘Test‘, ‘Second‘

platform :ios

platform :ios, ‘9.0’

pod ‘AFNetworking‘, ‘~ 2.0‘

b、如果不同的Target需要不同的依赖库,则可以

[objc] view plain copy print?

platform :ios

target :‘Test‘ do

pod ‘Reachability‘

pod ‘SBJson‘

pod ‘AFNetworking‘

end

target :‘Second‘ do

pod ‘OpenUDID‘

end

6、出现/Library/Ruby/Gems/2.0.0/gems/claide-0.8.1/lib/claide/command.rb:417:in `help!‘: [!] You cannot run CocoaPods as root. (CLAide::Help)

重新打开一个终端,然后pod install,不要sudo pod install。

7、如果$ pod install时候遇到:

Analyzing dependencies

Fetching podspec for `UAAppReviewManager` from `..`

[!] Unable to satisfy the following requirements:

- `UAAppReviewManager (from `..`)` required by `Podfile`

8、如果要移除Cocoapods,则可以:

a. 删除工程文件夹下的Podfile、Podfile.lock及Pods文件夹

b. 删除xcworkspace文件

c. 使用xcodeproj文件打开工程,删除Frameworks组下的Pods.xcconfig及libPods.a引用

d. 在工程设置中的Build Phases下删除Check Pods Manifest.lock及Copy Pods Resources

ios开发cocoa pods用什么源

一、概要

iOS开发时,项目中会引用许多第三方库,CocoaPods()可以用来方便的统一管理这些第三方库(从一个坑出来,又进了另一个坑而已……)。

二、安装

由于网上的教程基本都大同小异,但细节之处还不是很完善,所以借机会在这里补充下:

注:要使用CocoaPods,那就要下载安装它,而下载安装CocoaPods需要Ruby环境

1、Ruby环境搭建

当前安装环境为Mac mini 10.8.5。Mac OS本身自带Ruby,但还是更新一下保险,因为我第一次安装在没有更新Ruby的情况下就失败了。

a 查看下当前ruby版本:打开终端输入 ruby -v(确实安装了,不过用这个版本接下来工作失败了,所以更新下ruby)

[objc] view plain copy print?

ritekiMac-mini:PodTest lucky$ ruby -v

ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

ritekiMac-mini:PodTest lucky$

b 更新ruby

终端输入如下命令(把Ruby镜像指向taobao,避免被墙,你懂得)

gem sources --remove

gem sources -a

gem sources -l (用来检查使用替换镜像位置成功)

[objc] view plain copy print?

ritekiMac-mini:~ lucky$ gem sources --remove

removed from sources

ritekiMac-mini:~ lucky$ gem sources -a

added to sources

ritekiMac-mini:~ lucky$ gem sources -l

*** CURRENT SOURCES ***

补充:(2016-01-20更新)

淘宝已经关闭HTTP协议的景象服务,改为HTTPS协议。

淘宝ruby地址:

2、下载安装CocoaPods

终端输入:sudo gem install cocoapods

[html] view plain copy print?

ritekiMac-mini:~ lucky$ sudo gem install cocoapods

CHANGELOG:

## 0.32.1

##### Bug Fixes

* Fixed the Podfile `default_subspec` attribute in nested subspecs.

[Fabio Pelosin][irrationalfab]

\ [#2050]()

Successfully installed cocoapods-0.32.1

Installing ri documentation for cocoapods-0.32.1

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rdoc/rdoc.rb:280: warning: conflicting chdir during another chdir block

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rdoc/rdoc.rb:287: warning: conflicting chdir during another chdir block

Done installing documentation for cocoapods after 10 seconds

1 gem installed

这样就下载安装好了CocoaPods

3、使用CocoaPods

a 新建一个项目,名字PodTest

b 终端中,cd到项目总目录(注意:包含PodTest文件夹、PodTest.xcodeproj、PodTestTest的那个总目录)

[objc] view plain copy print?

cd /Users/lucky/Desktop/PodTest

c 建立Podfile(配置文件)

接着上一步,终端输入 vim Podfile

键盘输入 i,进入编辑模式,输入

platform :ios, ‘7.0‘

pod ‘MBProgressHUD‘, ‘~ 0.8‘

然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq

注意:键盘输入 :后,才能输入wq。回车后发现PodTest项目总目录中多一个Podfile文件

激动人心的时刻到了:确定终端cd到项目总目录,然后输入 pod install,等待一会,大约3分钟。

查看项目根目录:

注意:现在打开项目不是点击 PodTest.xodeproj了,而是点击 PodTest.xcworkspace

对于工程发生的变化,有几点需要说明:

a、第三方库会以成静态库方式引入工程使用

CocoaPods会将所有的第三方库以target的方式组成一个名为Pods的工程,该工程就放在刚才新生成的Pods目录下。整个第三方库工程会生成一个名称为libPods.a的静态库提供给工程使用。

b、xcworkspace(PodTest.xcworkspace)的作用是管理工程和第三方库

PodTest工程和Pods工程被以workspace的形式组织和管理。

打开项目后看到项目结构并且测试一下:

运行结果:

补充:

1、CocoaPods的基本安装及使用都详细的说明了,但还有一些补充,当需要同时导入多个第三方时候怎么办 ?

这就需要修改Podfile了,就是用vim编辑的那个保存在项目根目录中的文件,修改完了Podfile文件,需要重新执行一次pod install命令。

例如:

platform :ios

pod ‘JSONKit‘, ‘~ 1.4‘

pod ‘AFNetworking‘, ‘~ 2.0‘

2、CocoaPods可以查找你想要的第三方库

终端输入命令:pod search UI

疯了了,我怎么查找这么大众的关键字,好多库~~

然后重新编辑Podfile文件,按照之前的步骤,把更多的库都导入项目!

3、上文中“建立Podfile(配置文件)接着上一步,终端输入 vim Podfile”步骤,如果不习惯使用vim编辑器,也可以使用linux命令touch,生成一个空的Podfile文件,然后使用其他的文本编辑器都可以,例如:

[objc] view plain copy print?

lizhongfudeMacBook-Pro:~ lizhongfu$ cd /Users/lizhongfu/Desktop/TestProject

lizhongfudeMacBook-Pro:TestProject lizhongfu$ touch Podfile

编辑好Podfile文件后,就可以执行pod install第三方导入了(详见:补充第1条),CocoaPods就开始为我们做下载源码、配置依赖关系、引入需要的framework等一些列工作。

4、如果已经生成了CocoaPods管理的工程,则可以在Xcode中编辑Podfile,编辑保存后,别忘记cd到根目录,调用pod install命令

5、项目存在多个Target的时候,需要配置Podfile文件来支持新增加的Target,否则只支持项目默认建立时生成的Target:

a、如果新建一个Target,命名为Second,并且Second与Test两个Target所需要的第三方支持相同,也就是使用相同的Pods依赖库,则可以使用

link_with关键字:

[objc] view plain copy print?

link_with ‘Test‘, ‘Second‘

platform :ios

platform :ios, ‘9.0’

pod ‘AFNetworking‘, ‘~ 2.0‘

b、如果不同的Target需要不同的依赖库,则可以

[objc] view plain copy print?

platform :ios

target :‘Test‘ do

pod ‘Reachability‘

pod ‘SBJson‘

pod ‘AFNetworking‘

end

target :‘Second‘ do

pod ‘OpenUDID‘

end

6、出现/Library/Ruby/Gems/2.0.0/gems/claide-0.8.1/lib/claide/command.rb:417:in `help!‘: [!] You cannot run CocoaPods as root. (CLAide::Help)

重新打开一个终端,然后pod install,不要sudo pod install。

7、如果$ pod install时候遇到:

Analyzing dependencies

Fetching podspec for `UAAppReviewManager` from `..`

[!] Unable to satisfy the following requirements:

- `UAAppReviewManager (from `..`)` required by `Podfile`

8、如果要移除Cocoapods,则可以:

a. 删除工程文件夹下的Podfile、Podfile.lock及Pods文件夹

b. 删除xcworkspace文件

c. 使用xcodeproj文件打开工程,删除Frameworks组下的Pods.xcconfig及libPods.a引用

d. 在工程设置中的Build Phases下删除Check Pods Manifest.lock及Copy Pods Resources

明明就是iOS系统的,结果微信要安装苹果定制版的居然提示这个,求助怎么回事,有谁知道的求告知

您好!很高兴能为您解答,    拒绝 iOS 应用获取设备的 UDID的原因

UDID本来是为了方便一个应用来统计用户行为的,但是因为是一个唯一ID,而且直接看不到跟用户隐私的关系,所以是开放出来的。但是,当有大量的App在市场中,而UDID对于每个App都是一样的时候,用户的隐私其实受到了一定程度的侵犯。假设有很多App联合在一起,因为UDID是统一的,那么他们就可以拼凑出用户的隐私出来。所以从这个角度苹果去掉了UDID的支持,而每个应用可以自行生成自己的UUID,所以,单一app的统计仍旧不会发生问题。所以主要的原因是隐私问题。

、必须使用UDID时建议的UUID替代方案

-(NSString*) uuid {

CFUUIDRef puuid = CFUUIDCreate( nil );

CFStringRef uuidString = CFUUIDCreateString( nil, puuid );

NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);

CFRelease(puuid);

CFRelease(uuidString);

return [result autorelease];

}

苹果公司建议采用上述代码为应用生成唯一标识字符串。开发者可以在应用第一次启动时调用一次,然后将该串存储起来,以便以后替代UDID来使用。显而易见,这种方法问题很多。如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备;如果你从一台旧设备中备份文件到新设备中,两台设备就拥有相同的CFUUID;如果你从临时文件中备份操作系统,就会出现一个设备里存在不同CFUUID的情况。

2、使用开源方案OpenUDID

贡献者在readme文档中说:

OpenUDID is a drop-in replacement for the deprecated [UIDevice uniqueIdentifier] a.k.a. UDID on iOS, and otherwise is an industry-friendly equivalent for iOS and Android.

The agenda for this community driven project is to: – Provide a reliable proxy and replacement for a universal unique device identifier. That is, persistent and sufficiently unique, on a per device basis. – NOT use an obvious other sensitive unique identifier (like the MAC address) to avoid further deprecation and to protect device-level privacy concerns – Enable the same OpenUDID to be accessed by any app on the same device – Supply open-source code to generate and access the OpenUDID, for iOS and Android – Incorporate, from the beginning, a system that will enable user opt-out to match Apple’s initial intent.

愿景很好,也确实没有用到MAC地址,同时能保证同一台设备上的不同应用使用同一个OpenUDID。但是仔细分析,还是能发现问题。

unsigned char result[16];

const char *cStr = [[[NSProcessInfo processInfo] globallyUniqueString] UTF8String];

CC_MD5( cStr, strlen(cStr), result );

_openUDID = [NSStringstringWithFormat:

@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%08x",

result[0], result[1], result[2], result[3],

result[4], result[5], result[6], result[7],

result[8], result[9], result[10], result[11],

result[12], result[13], result[14], result[15],

arc4random() % 4294967295];

这里使用了NSProcessInfo类。

当设备上第一个使用OpenUDID解决方案的应用第一次调用时,确实会生成一个唯一的识别码。同时,为了与官方的UDID位数相同,还在MD5值后面追加了8位随机码。然后,该方案使用到了NSUserDefaults类(应用设置)。应用将获取到的唯一识别码保存到应用的UserDefaults中,如果程序以后需要使用唯一识别码,就从UserDefaults中获取,这样就保证可以拿到同一个识别码。但是,如果用户删除了应用,UserDefaults同样会被清空,为了避免重新生成唯一识别码,该方案还使用到了UIPasteboard类(设备剪切板)。应用在将唯一识别码保存到UserDefaults的同时,也会将其保存到以特殊的key标识的UIPasteboard中。代码如:

1

2

UIPasteboard* slotPB = [UIPasteboardpasteboardWithName:availableSlotPBid create:YES];

[slotPB setData:[NSKeyedArchiver archivedDataWithRootObject:dict] forPasteboardType:kOpenUDIDDomain];

其中availableSlotPBid是一个字符串key,前缀是“org.OpenUDID.slot.”,点后面加上数字。这个数字默认是从0到99(当然你可以修改源代码使它更大或者更小)。

如果设备上安装了第二个使用OpenUDID解决方案的应用,当应用调用生成OpenUDID的方法时,将会从UIPasteboard中获取唯一识别码(遍历key从0到99的UIPasteboard),这里取到的就是之前第一个应用保存到UIPasteboard中的。也就是说,只要用户设备上有一个使用了OpenUDID的应用存在时,其他后续安装的应用如果获取OpenUDID,都将会获得第一个应用生成的那个。

看起来似乎很好,很复杂。但是仔细想想,还是有问题,如果把使用了OpenUDID方案的应用全部都删除,再重新获取OpenUDID,此时的OpenUDID就跟以前的不一样了(本人测了一下,确实如此)。可见,这种方法还是不保险。

3、开源方案SecureUDID

稍微看了下SecureUDID源码,发现其与OpenUDID其实差不多,只是初始获取的唯一识别码稍有不同。同时,从作者的Readme文档中可见,这个方案同样存在很多问题。如原文:

Is this a true UDID replacement?

SecureUDID has two properties that you should know about before you use it. First, as indicated above, the identifier is not derived from hardware attributes. Second, the persistence of an identifier cannot be guaranteed in all situations. This means that, while unlikely, it is technically possible for two distinct devices to report the same identifier, and for the same device to report different identifiers. Consider this carefully in your application. Here is a list of situations where this identifier will not exhibit the uniqueness/persistence of a traditional UDID.

* The user has opted-out of the SecureUDID system, in which case you will receive a well-formed string of zeroes.

* Device A is backed up and then restored to Device B, which is an identical model. This is common when someone breaks their phone, for example, and is likely desirable: you will receive Device A’s SecureUDID.

* The SecureUDID data is removed, via user intervention, UIPasteboard data purge, or by a malicious application.

* The SecureUDID backing store becomes corrupt.

* All SecureUDID applications are uninstalled from a device, followed by a UIPasteboard data purge.

我发现,其实前面的OpenUDID也基本存在以上问题,只是作者没写出来。看来还是SecureUDID的贡献者比较厚道。

4、与WIFI MAC地址相关

网上同样有一些与WIFI MAC地址相关的替代方案,主要分三种:第一种直接使用“MAC Address”;第二种,使用“MD5(MAC Address)”;第三种,“MD5(MAC Address+CFBundleIdentifier)”。github上有个开源项目(UIDevice-with-UniqueIdentifier-for-iOS-5)实现了这几种方法。

使用这种方法也存在问题:1、市面上有部分机器(虽然数量极少,但是本人在使用过程中确实发现过这种情况)无法获得MAC地址,有人说这部分机器是联通阉割无WIFI版的,具体不得而知了。2、MAC地址跟UDID一样,存在隐私问题。苹果现在禁用UDID,不能保证以后不会禁用MAC地址。

5、部分大公司私有的解决方案,但是他们怎么会告诉你呢?

所以,如果你想以一种万无一失的方法追踪某台设备,现在还没有比UDID更合适的选择。但是,苹果现在不让用了,苦逼的开发者们,该怎么办呢?

友盟统计怎么查看7.0系统的机型

友盟统计是如何识别用户的? 友盟UMID 方案解析! 香布拉啦2014-12-16 11:40 1. 基本概念 根据能否追踪到单个独立的设备, 可以将一个统计系统分为可区分统计(Discriminative Statistics)和不可区分统计(Non-Discriminative Statistics)。友盟提供的是可区分统计,也就是会利用一个身份标识符(Unique ID,以后简称 ID)长期追踪单个设备的数据。作为对比,早期的网站统计都是不可区分统计,例如页面访问次数,独立 IP 数等;现代的网站统计都是基于 Cookie 或硬件指纹的可区分统计。由于智能设备提供了足够多的硬件指纹和计算能力,友盟从第一天开始就专注于可区分统计。大多数移动统计的 ID 都是通过系统 ID 生成的,包括但不限于 IMEI、MAC、Android ID。最著名的 ID 莫过于 UDID, 迫于隐私的压力,苹果最终废弃了 UDID 和 MAC 地址。大多数网站统计都是基于 Cookie的,因此是暂态ID(Temporal ID)。OpenUDID 就是一个典型的暂态ID。苹果的 IDFA 和 IDFV 都是系统ID,但是他们同时也是暂态ID。由于可区分统计涉及到用户隐私,因此友盟在计算中使用的都不是系统 ID ,而是自己的 UMID。友盟不会向第三方[1]提供包含原始 ID 或 UMID 的数据,而是提供聚合后的结果。UMID 既不是系统ID也不是暂态ID,它是一个在不断演化的ID解决方案。本文将会解释友盟为什么要设计 UMID,又为何要不断地改进这个方案。2. ID质量 进行可区分统计的基础是确立一个可靠的身份标识符,这看上去是一个很简单的事情,只需要选择一个ID,或者人为构造一个类Cookie ID,就可以完成独立用户量、留存等分析。但遗憾的是,除了苹果已经废除的UDID,几乎没有一个接近完美的ID。为了方便讨论,首先忽略假数据的存在,假设每个设备都有一个真实的身份标识X。可区分统计的目标是选择一个合适的身份标识I,使得基于I的统计结果尽可能地和 X 一致。首先,我们引入两个概念ID冲突(Collision)和ID漂移(Jitter)。ID冲突 对于某个设备集合(Device Cohort),在某个时间段内,总是可以测量 X 和 I 的数量,用 Count(X) 和 Count (I) 来表示。如果在足够短的时间内Count(X) Count(I) 我们称 I 是一个存在冲突的 ID。ID漂移对于某个设备集合(Device Cohort),在某个时间段内,总是可以测量 X 和 I 的数量,用 Count(X) 和 Count (I) 来表示。如果在足够长的时间内Count(X) Count(I) 则我们称 I 是一个存在漂移的 ID。Android 设备的IMEI 就是一个存在严重冲突的 ID,根据我们的估算,其冲突率大于 3%。这是因为很多山寨机的IMEI 是相同的。Android 设备的 MAC 也是一个存在冲突的ID,因为很多山寨机的MAC也是相同的。此外,MAC还是一个典型的存在严重漂移的 ID,这是因为 Android 的源代码中有一段随机生成MAC 地址后24位的代码被滥用了(参考阅读: MAC地址漂移的问题)。定性分析接下来,我们可以定性分析一下ID冲突和漂移对统计数据的影响:当一个ID仅存在冲突的时候,利用这个ID统计的DAU和安装都会被低估,但是有可能会高估留存。但是这些影响都是温和的,例如5% 的ID冲突仅仅会导致DAU至多被低估 5%,而对留存的影响几乎可以忽略。当一个ID仅存在漂移的时候,利用这个ID统计的DAU和安装都会被高估,同时会影响留存。当漂移较大的时候,对统计指标的影响是剧烈的。例如,一个每日漂移为5%的ID,可能会造成DAU被高估2%,但是会每天造成5%的虚假安装(这是因为漂移会影响所有用户,包括不活跃用户),同时这些虚假安装的留存在短期内偏高,但是长期留存则偏低(短期内没有漂移的时候就会偏高,时间长了,漂移了就会偏低)。任何类Cookie的ID都会有类似的性质,因此传统的网站统计正在全面转向更为可靠的设备指纹。当一个ID既存在冲突又存在漂移的时候,利用这个ID统计出来的DAU和安装是完全不可靠的。以MAC地址为例,存在漂移的这部分设备的MAC地址会频繁变化,因此会制造大量的虚假安装,同时留存率非常低。对于用户量不大的应用而言,选择存在这类ID的后果是灾难性的。综上所述,当ID的漂移和冲突足够小的时候,他们对可区分统计的影响都是可以忽略的。当这些误差不可忽略的时候,ID的冲突造成的影响是温和的,而ID的漂移则会严重

苹果的手机和安卓比有什么区别?

1、首先苹果手机的价格要比安卓手机要贵的,所以一般人在消费的时候宁愿选择买安卓手机。

2、另外一点就是苹果手机的系统跟安卓手机的系统是不一样的,苹果自己的ios系统比安卓要好的多。

3、在性能上来看,安卓手机跟苹果手机是无法比的,安卓手机的性能很一般,用久了之后就会出现卡顿的现象,但是苹果手机就不会出现这类的状况。      

4、不过在设计上来看,安卓手机是无法跟苹果手机比的,苹果手机都是不断的更新前一代遗留下来的问题,而安卓大部分都在模仿。

5、触感不同,反应速度不同。安卓手机的触感不及苹果手机的好,并且安卓手机的反映总是会比苹果手机的慢上零点几秒。                

   

6、运行一个软件时,安卓手机反映更快一些,当运行软件达到三个以上时就会变卡,而苹果手机不会出现这样的问题。

5条大神的评论

  • avatar
    访客 2023-03-04 下午 12:06:26

    losin][irrationalfab] \ [#2050]() Successfully installed cocoapods-0.32.1 Installing ri documentation for cocoapods-0.32.1

  • avatar
    访客 2023-03-04 上午 09:20:13

    数据。作为对比,早期的网站统计都是不可区分统计,例如页面访问次数,独立 IP 数等;现代的网站统计都是基于 Cookie 或硬件指纹的可区分统计。由于智能设备提供了足够多的硬件指纹和计算能力,友盟从第一天开始就专注于可区分统计。大多数移动统计的 ID 都是通过系统 ID 生成的,

  • avatar
    访客 2023-03-04 下午 01:10:25

    说明:在新应用信息填写中,请尽量填 *** 实的信息。您可以通过友盟统计分析平台的特性节省重复建立App的时间。 如果您要对App不同的发布渠道进行统计,不需要创建新App,请

  • avatar
    访客 2023-03-04 下午 03:46:23

    3.0,因此该版本的SDK支持从iOS 3.0 ~ 4.2的设备使用,在工程中引入友盟统计SDK时,推荐设置Base SDK为最新的iOS SDK最新版(当前最新版为iOS 4.2) 导入插件 请在你的工程目录结构中,右键点击Classes文

  • avatar
    访客 2023-03-04 上午 11:56:47

    :287: warning: conflicting chdir during another chdir block Done installing documentation for cocoapods after 10 seconds 1 gem installed 这样就下载安装

发表评论