文档章节

谷歌分析iOS开发包实战

浪子艾菲儿
 浪子艾菲儿
发布于 2014/05/15 16:22
字数 6736
阅读 344
收藏 8

本篇教程将会带你浏览谷歌分析开发包(Google Analytics)的所有主要内容。与此同时,你能够体验将Google Analytics添加到一款适用跑步爱好者的计时器应用中,通过添加SDK记录用户使用各种功能和控件的频率。

 

当你完成本篇教程,你将掌握应用事件追踪,你将能够追踪应用不同版本的使用情况,并且能够允许用户关闭“匿名使用情况追踪”功能:

 

让我们开始吧!

 

入门准备: 什么是谷歌分析服务?

 

谷歌分析服务是由谷歌提供的服务,能够生成详细的网站或者手机应用使用情况统计信息。最初,这个产品主要是面向市场人员而非开发人员。然而,现代的开发方式要求开发者能够以一种迭代和低成本的方式去定义,衡量及测试他们所开发的软件功能。谷歌分析服务是一款非常强大的工具能够衡量你的应用使用情况从而了解新的功能上线后功能稳定与否。

 

谷歌分析服务为您提供了概览和控制台类型的数据,应用性能评估,以及许多深入细致的报告工具。它的分析可以识别诸如:低性能的屏幕界面,用户自定义的重要事件和用户群的地理分布…..所有这一切对于提升您的应用程序品质非常关键!

 

简单来说,通过谷歌分析服务的控制台,你可以看到你的应用上个月有多少用户,有多大比例用户会经常使用它,你的用户每次使用多长时间,你的用户来自哪个国家:

通过在应用内设定追踪事件(比如:用户点按各种按钮或者其他各种不同的动作)你就可以了解到各种功能的具体使用情况,你可以据此制订下一步的开发计划。 下图就是一个例子,你可以清楚地看到用户更偏爱“保存照片到手机相册”,因为数据显示上个月有2223次“saveToPhotogallery”,相比之下“直接分享到Facebook”(saveToFacebook)只有113次 而 “发布到Twitter”上(saveToTwitter)只有少的可怜的33次:

 

 

第一步: 为你的应用设置Google Analytics账号

好了, 让我们开始吧. 打开这个网址 www.google.com/analytics. 主页面就像下图展示的那样:

注意: 如果你没有注册过Google账号,那么你需要点右上角的“Create an Account”创建一个账号。下面的教程需要你有一个Google账号,你需要创建一个自己的谷歌分析账号。

 

当你用google账号登录进来之后,只要点右上角的“Access Google Analytics”链接访问Google Analytics。

点击进来之后,你会看到你所有的账户列表。如果你已经绑定了很多客户端(网站website或者移动应用Moible app),那么你会看到每一个客户端都有一个单独对应的账户(通常账户和客户端都是一一对应的)。然而如果你是新用户,那么你只会看到设置过的账户。

 

选择右上角的“管理视图”( Admin view )可以看到主控制台,里面可以管理你的账号,属性,和视图。

 

在主控制台,你会看到一个工作区域,包含:账号(Account),属性表(Property),最右边是视图(View)。让我们先看一下每个区域都具体是做什么用的:

1.账号(Account) - 在你自己的谷歌分析账号内,你可以拥有其他多个合作伙伴和客户的分析账号的成员角色(这看上会有点混淆)。在最左边账号的下拉列表 中,你会看到所有的账户角色。

2.属性表(Property) – 一个属性表是指一个归属于账号下的特定的网站或者应用程序的属性集合。在本教程中,你会创建一个新的“Clock”属性表来容纳所有和你的应用相关的数据。

3.视图(View)- 最右边一列就是视图。它能够让你在你的数据之上创建不同的视图 。在本教程之后的应用例子中,你将可以通过创建不同的视图,能够看到不同应用版本的数据信息。

 

好了,继续!如果你不想添加新的属性表(Property)到你的客户的账号,请跳过这一步,但跳过前请确认已经有一个正确的账号用来完成下面的教程。

 

选择属性表(Property)的下拉列表框,点击“Create new property” 项,如下图所示:

谷歌会要求你提交应用的具体信息。请在一开始确认选择“Mobile app”并填写必须的信息。在属性表页面“App name”输入“Clock”。

 

然后点击确认接受“服务条款”,网站会提供你一个你的应用的跟踪 ID(Tracking ID) 以及 SDK 的下载链接。

 

下载谷歌分析iOS SDK

在你开始下面的步骤之前,先拿笔记下你的应用的跟踪ID(Tracking ID),格式类似  UA-XXXXXXXX-Y. 把这个ID记下来,放到手边备用,后边马上会用到。

 

现在点击链接下载谷歌分析iOS SDK开发包。下载不带 Admob 功能的版本保存到桌面。

第二步:设置谷歌分析开发包

 

开始这一步之前,请下载样板工程 starter project.

 

在Xcode中打开这个样板工程,编译并在模拟器中运行,保证它是可以工作的。不出意外的话,你会在模拟器中看到一个带有时钟和秒表的简单标签栏应用。

解压你刚才下载的谷歌分析开发包,你会看到下面几个文件夹和文件:

GoogleAnalytics

GoogleTagManager

libGoogleAnalyticsServices.a

Readme.txt

 

在 GoogleAnalytics 文件夹, 打开 Library 文件夹, 选中下面几个文件将它们拖拽到  Clock 样板工程中。

GAI.h

GAITracker.h

GAITrackedViewController.h

GAIDictionaryBuilder.h

GAIFields.h

GAILogger.h

 

 

请选中: “Copy items into destination group’s folder” 和 “Add the files to the Clock target” ,确保这些文件被加入到工程中。

 

现在你需要将 谷歌分析 iOS SDK 库文件(libGoogleAnalyticsServices.a)加入到工程中,Google Analytics SDK还会用到 CoreData 和 SystemConfiguration 这两个系统框架 (这时候你需要手动的添加这些框架,在下一个版本中希望谷歌会用 automatic importing 功能,这样就方便了!),所以你需要添加下面所有的库和框架到你的应用中:

libGoogleAnalyticsServices.a

CoreData.framework

SystemConfiguration.framework

libz.dylib

 

先加 libGoogleAnalyticsServices.a,选中并拖拽到 Frameworks 文件夹。你可以把它放到任何地方,但是建议还是将工程所用到的框架都放到一个地方管理。

 

下一步添加 CoreData 系统框架,在Xcode Project Navigator 选中  Clock 工程,再选择 Build Phases。点开 Link Binary With Libraries 并点击 添加(+) 按钮.

再弹出的窗口中,输入 CoreData 从提示列表中找到 CoreData.framework 并选中添加到工程。

重复之前的步骤添加 SystemConfiguration.framework  和 libz.dylib 动态库。

 

最后,修改 Clock-Prefix.pch 导入 GAI.h 头文件,方法如下:

#import "GAI.h" #import "GAIFields.h"

你已经将SDK导入到Clock App中了,下一步开始追踪分析吧。


第三步:追踪

你已经跑到第一弯道了,超越了其他所有选手,加油!

 

谷歌分析iOS SDK – GAI (Google Analytics for iOS) 是一流的工具类能够是提供设施,以创建跟踪器和设置行为标志。 这个类能够非常方便地提供一个默认的跟踪器实例。 默认的跟踪器被初始化成空(nil)并会被 共享的GAI 实例通过调用 trackerWithTrackingId 函数赋值。必要时你可以通过可以重载这个方法来改变跟踪器,后面会讲到这一点。

 

谷歌分析跟踪器可以用来跟踪屏幕界面,事件,转换,时长,以及异常。这些接口的实现都是线程安全的,并且没有一个调用会阻塞或者花费很长事件。所有的网络交互和磁盘存储都会再后台进行,不会影响程序运行。

 

那么让我们看看跟踪器在实际中如何运行。

 

初始化跟踪器

你将需要前面记录下来的跟踪ID(Tracking ID)。第一步先获得谷歌分析iOS 共享实例,并且设置一组行为标识,这个具体的行为标示如下:

 

1.trackUncaughtExceptions – 跟踪未捕获的异常会标识任何导致程序崩溃的未处理异常事件。

2.logLevel – 谷歌分析iOS SDK开发包有4种日志级别:kGAILogLevelError, kGAILogLevelWarning, kGAILogLevelInfo, 和 kGAILogLevelVerbose. Verbose 日志级别能够将所有的日志输出并打印到Xcode的控制台窗口。这个对于第一次使用谷歌分析iOS SDK的开发者是非常有用的 ,能看到很多内部的信息。

3.dispatchInterval – 默认设置成120 ,表示跟踪信息每隔120秒,会被发送到谷歌分析的服务器。在本教程中,这个值将设置成一个更短的时间间隔,这样你可以在谷歌分析控制台更快地看到数据,而不用长时间地等待。但在产品阶段,设置120秒的间隔就足够了。

 

初始化你的 GAI 共享实例 跟踪器,打开  app delegate 插入以下代码到application:didFinishLaunchingWithOptions:函数,并第 4段代码中,填写你自己的跟踪ID(tracking ID ):

 // 1
 [GAI sharedInstance].trackUncaughtExceptions = YES; 
 // 2
  [[GAI sharedInstance].logger setLogLevel:kGAILogLevelVerbose]; 
 // 3 
 [GAI sharedInstance].dispatchInterval = 20; //跟踪信息间隔时间
 // 4 
 id tracker = [[GAI sharedInstance] trackerWithTrackingId:@"UA-XXXXXXX-Y"];

 这段代码会配置和获得一个跟踪器类对象,这样你的app就开始记录应用的使用情况和应用事件了。

 

注意: 请更改tracking ID为你自己申请的值。

 

自动屏幕跟踪

谷歌分析的最初设计是为了跟踪网站,主要是为了衡量页面的浏览量 – 意思是 在一定时间内的用户浏览某一页面的次数。 在谷歌分析移动版本上,页面的概念被屏幕所取代了。一个屏幕通常代表你的应用的一部分内容,但是这个屏幕跟踪也等同于有多少用户访问你的应用内某一内容的次数,例如在一个屏幕上的某个元素。

 

简单来说,这种模拟转换将屏幕视图对应替换成pageview的概念,表明了实际上有多少用户查看了你的应用的某一界面。很容易将 “视图”(view) 和iOS 开发中的 view 搞混,在iOS开发中,view代表可视化的界面组件,和用户看到的view不同。所以具体区别请仔细查看谷歌分析文档 Google Analytics documentation.

 

综上所述,自动屏幕跟踪能够测量用户在应用不同界面上停留的时长。当用户在不同界面之间切换时,你可以记录这些跳转事件和页面停留的时长。在iOS系统中, 每一个屏幕都是被一个视图控制器所管理,所以你是在更新视图控制器的时候记录这些关于屏幕的信息。

 

你可以通过扩展 GAITrackedViewController 类的方式自动记录屏幕跟踪。只需要手动设置 GAITrackedViewController 的内部属性 screenName,这个名称会被谷歌分析的日志记录并使用。

 

让我们先来用自动的方式添加分析日志 追踪 闹钟屏幕视图控制器 ClockViewController 的信息。首先,更新 ClockViewController.h 导入 GAITrackedViewController 类派生关系 如下文所示:

#import "GAITrackedViewController.h" 
@interface ClockViewController : GAITrackedViewController
@end

 其次,更新ClockViewController.m设置screenName属性,最好在viewDidLoad中进行:

- (void)viewDidLoad 
{    
     [super viewDidLoad];     self.screenName = @"Clock";
}

就这样就OK了!这短短的两处改动就能够让谷歌分析开始追踪工作了。 现在视图控制器有了于之关联的屏幕界面名称,当上一级视图控制器的GAITrackedViewController viewWillAppear 方法的被调用时候就去用这个名称去注册屏幕界面。 在这个方法里面有许多上一级的视图控制器会做许多事情:

1.获得共享实例的默认跟踪器并设置你的跟踪ID。

2.告诉跟踪器,目前正在跟踪的屏幕是时钟(“Clock”)屏幕。

3.生成一条日志记录报行当前的时间及其他有用信息。

4.调用默认的跟踪器对象和谷歌分析服务器交互上传信息。因为之前我们配置了日志的等级为“详细日志”,所以你可以通过控制台输出窗口看到这些信息。

 

这么多事情只要几行代码就搞定了,很爽吧?你的应用已经开始发送数据到谷歌分析服务器端了。 但是别着急去谷歌分析服务器后台控制台去看数据。让我们在应用端多加一些功能,然后再去后台控制面板看统计数据。


手动屏幕跟踪

虽然自动记录屏幕查看数据非常的方便,但是并不是所有人都喜欢或者想要将视图类从GAITrackedViewController做派生。

 

这种情况下,需要一个手动的解决方案。和自动的方法类似,你可以主动发送屏幕信息给谷歌来达到屏幕跟踪的目的。你需要获得跟踪对象,设置它的一个属性值,然后手动地创建并且发送这个屏幕查看事件。

 

让我们尝试在 StopWatchViewController 里使用这种方法实验一下。 打开 StopWatchViewController.m 源文件,在文件最开始导入 GAIDictionaryBuilder 类:

#import GAIDictionaryBuilder.h

和之前不一样,你必须要获得一个默认跟踪器的句柄并给它赋上你正在跟踪的屏幕ID值 。你之后需要构造一个应用屏幕记录,这样跟踪器能够记录正在被浏览的屏幕并且将屏幕属性信息发回到谷歌分析服务器。在该文件的 add viewDidAppear 方法中加入以下代码:

- (void)viewDidAppear:(BOOL)animated 
{     
    [super viewDidAppear:animated];    
    id tracker = [[GAI sharedInstance] defaultTracker];     
    [tracker set:kGAIScreenName value:@"Stopwatch"];     
    [tracker send:[[GAIDictionaryBuilder createAppView] build]]; 
}

 

编译并运行你的应用吧!花点时间在两个标签页中切换几次,每次切换你会看到不同的屏幕界面,每当你切换时候,屏幕视图就会产生一个“点击”事件,在应用调试窗口可以看到带有时间戳的日志+一组当前视图的描述信息。你会看到如下图所示的界面,里面记录了我们的 Stopwatch 屏幕的 appview 事件。

 

 

调试窗口会不停的输出 GAIBatchingDispatcher 实例的调用情况。这是由谷歌分析SDK库自动发送给谷歌分析网路服务器端的日志信息。在看到命令行输出后,你应该能够在谷歌分析服务后台看到你的这些活动对应的数据记录。如果在你的属性表报告控制台点击“实时”(Real-time)区域 ,你就能够看到当前有多少用户在访问哪些屏幕界面,以及实时的变更状态。

注意: 请确保你查看数据的时间段设置是正确的,默认情况下谷歌分析数据后台报告是不会包含当天的数据的,你需要将数据浏览日期段重新设置以包含当天数据,这样你才能看到你刚才的点击记录。

 

谷歌分析服务提供各种针对你的数据的视图。最棒的一点是打开“ Standard Reports->Real-Time->Screens”, 你将会看到几分钟前的事件数据。

 

第四步:高级设置

现在,你到了在最后的冲刺阶段,让我们来看看如何记录更详细的交互事件(如按下按钮)及如何使用多个跟踪器。

 

设置和发送信息

如果你想要记录具体的用户交互数据,你可以发送制定后的数据给谷歌分析服务器。 谷歌可以检测到用户按下按钮,甚至到网络呼叫等用户无察觉的事件。你能够发送这些数据:第一步是在跟踪器中通过 set: 方法设置键值对的映射关系,然后将调用 send: 方法发送到谷歌分析服务器端。你已经在前面的例程中看到过这样的例子了。

 

回顾一下: 在 viewDidAppear 函数中,你设置了屏幕名称 screenName 并要求跟踪器发送这些信息到谷歌分析服务器端。

id tracker = [[GAI sharedInstance] defaultTracker];

[tracker set:kGAIScreenName value:@"Stopwatch"];

[tracker send:[[GAIDictionaryBuilder createAppView] build]];

 

对多重测量数据设置值

为了捕获点按事件,你可以制定事件参数 kGAIHitType。让我们在秒表屏幕中添加一个方法去跟踪按钮被按下的事件。你将在所有的按钮踪调用这个方法。

首先,在 StopWatchViewController.m 中加入这个方法:

 

-(void)logButtonPress:(UIButton *)button
{        
    id tracker = [[GAI sharedInstance] defaultTracker];       
    [tracker set:kGAIScreenName value:@"Stopwatch"];     
    [tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"UX"                                                           action:@"touch"                                                            label:[button.titleLabel text]                                                            value:nil] build]];     
    [tracker set:kGAIScreenName value:nil]; 
}

先获得默认跟踪事件句柄。和以前一样,你需要设置跟踪器的当前得屏幕名称以确保后面的按钮事件被记录到正确的屏幕中。

 

然而,你还没有记录用户查看屏幕的行为。所以在发送数据前,你需要创建一个触摸事件,(谷歌的框架将这个触摸事件分类为用户体验UX事件)。你将按钮的标题作为事件名称发送给服务器。最后,你需要清除屏幕的名称,防止后面的事件被错误地记录到这个屏幕。

 

换句话说,跟踪对象不只是记录你输入的信息。它还记录自己的状态会影响到你发送的记录消息。你只需要告诉跟踪器你想要记录的事件数据,其他的内部状态都是由跟踪器自己记录并维护的。

 

告诉跟踪器当前的一个屏幕名称是非常有意义的,因为你能够将这个值应用到候机的屏幕浏览和点击事件中。然而我不建议你给跟踪器一个点击类型之类的字段,因为每个点击的类型都有可能不同。

在 startToggle 和 reset 方法中调用调用logButtonPress方法来记录用户的点击按钮事件:

-(IBAction)startToggle:(id)sender
{    
    [self logButtonPress:(UIButton *)sender];    ... 
} 
-(IBAction)reset:(id)sender
{    
    [self logButtonPress:(UIButton *)sender];    ... 
}

编译并运行你的程序吧! 切换到 Stopwatch 界面,触发秒表的开关,并在一段事件后停止秒表,并点击重置按钮,这些事件将被跟踪器记录。

 

登录谷歌分析后台,打开你的应用统计信息可以查看这些信息。在左边的页面点击“Behavior->Events->Overview”  and 你会看到你刚才所做的事件记录。

使用多个跟踪器

可以在你的应用中使用多个跟踪器,可以将数据发送到于此应用关联的多个谷歌分析属性表中。举个例子说: 可能你有一个属性表是给你的市场团队,他们需要知道这个应用如何被人们使用,而另外一个跟踪器设置的目的是为了你的开发团队,他们需要知道程序中哪一个部分有功能异常。

 

注意: 在本篇教程中,你不需要加入多个跟踪器。本段落只是提供你实现多个跟踪器的一些思路。

 

设置多个跟踪器只需要简单地用多个属性ID去初始化各个跟踪器:

id tracker1 = [[GAI sharedInstance] trackerWithTrackingId:@"UA-XXXX-1"];

id tracker2 = [[GAI sharedInstance] trackerWithName:@"Tracker2"

                                                     trackingId:@"UA-XXXX-2"];

默认情况下,第一个被初始化的跟踪器就是默认的跟踪器。之前你已经见过如何访问默认跟踪器:

 

id tracker = [[GAI sharedInstance] defaultTracker];

你是否意识到上面的两段代码,GAI能够获得的默认跟踪器就是 tracker1, 如果你想要修改默认跟踪器,你可以这么做:

 

[[GAI sharedInstance] setDefaultTracker:tracker2];

在这个例子里,这段代码执行之后,所有的默认跟踪器就指向了tracker2。

 

采样率:避免数据的不一致

采样在谷歌分析服务和其他任何分析软件中,都是指从你的数据中抽取一小部分进行分析,然后根据统计获得整体数据的趋势和统计结果。 采样被广泛的应用在统计分析中,因为分析一个子集数据可以得到结果和分析全部数据得到的结果基本一致。采样能够加速数据报告的处理,尤其是当数据量巨大无比的时候,这种速度优势会很明显。如果你的用户数量很多那么采样将非常重要。

 

之前你考虑了三个重要的关键词汇:账号,属性,视图。当你在某一个属性表上创建一个视图 (想象一下,查看你的应用程序的某一个窗口在给定条件下的使用情况)你必须保证这个数据发送给谷歌分析服务器的采样率和统计时候的采样率是一致的。如果不一致,假设数据采样的频率过高的话,统计结果将会掩盖哪些采样率比较低端的情况 这样会扭曲你的统计分析结果。

 

为了保证你的跟踪器采样数据的一致性,你应该在任何版本任何时候保持一个固定的采样率。更新跟踪器+当前的版本号很容易:加下面的代码到 AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{     ...      
     NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];     
     [tracker set:kGAIAppVersion value:version];     
     [tracker set:kGAISampleRate value:@"50.0"]; 
}

这段代码将会自动从Info.plist文件中获取当前应用的版本号,把版本号设置到跟踪器 对象中。它然后有设置了50%的采样率。

 

现在到XCode中的“Project Settings”中修改你的应用版本号到1.2。

当你运行应用的时候,跟踪器会响应这个改动,并且开始在所有数据中记录版本号 。最后一步是创建一个谷歌分析服务的查询视图的将数据根据版本号过滤出来。

 

返回到你的谷歌分析服务控制台,在右边视图下拉框中选择“创建新视图”。

 

 

确保你选择了移动应用,给视图命名,我输入的是“Clock – v1.2”。

 

这样会成功地创建一个新视图,下一个不你需要设置一个过滤器,能够过滤出你指定的数据。

 

选择过滤器选项在下拉列表中选择新过滤器 (如红色按钮所示)。

 

如下图,应用过滤器 。你会查找到指定应用版本号的数据,这样你可以只看版本1.2的相关数据了。

 

现在编译并运行你的iOS应用在你新创建的视图中(Reporting->Real-Time->Screens)查看你的数据流。

 

关闭统计

最后但同样重要的是: 你可以允许你的用户选择关闭匿名数据统计。你可以开启一个应用级别的关闭选项--允许关闭谷歌分析服务:

[[GAI sharedInstance] setOptOut:YES];

你的时钟应用中,你可以在第一次启动的时候询问用户是否关闭数据跟踪功能。首先,我们需要在AppDelegate添加里面创建一个提醒框,当应用启动完成之后显示给用户。为了正确的处理提醒框,你必须保证你的AppDelegate 实现时派生自 UIAlertViewDelegate. 在你的应用的 SSAppDelegate.h中加入以下代码:

#import <UIKit/UIKit.h>
@interface SSAppDelegate : UIResponder <UIApplicationDelegate,UIAlertViewDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

之后你的AppDelegates 实现代码 SSAppDelegate.m 文件中添加:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Google Analytics" message:@"With your permission usage information will be collected to improve the application." delegate:self cancelButtonTitle:@"Opt Out" otherButtonTitles:@"Opt In", nil];
    [av show];
    return YES;
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    switch (buttonIndex) {
        case 0:
            [[GAI sharedInstance] setOptOut:YES];
            break;
        case 1:
            [[GAI sharedInstance] setOptOut:NO];
            break;
            
        default:
            break;
    } 
}

 

完成之后,应用启动时会显示一个提示框要求用户做如下选择:

1.开启日志功能 -允许你在谷歌分析服务后台看到所有数据。

2.关闭日志功能 -没有任何数据会被发送到谷歌服务器上。

 

最后一次编译并运行。这此应用会给显示一个选择框。你还要调试的,别点错了啊,哈哈 :]

 

接下来做什么呢?

恭喜你,你已经完成了本篇的教程!我希望本篇所学能给帮你在你的移动应用中更好的使用谷歌分析功能。你在可以下载完整的时钟项目download the complete clock project

 

你可以在当前的谷歌分析账户中做的更多好玩的尝试:

1.尝试为你自己定制报告 -你可以定制复杂一点的数据查询条件。

2.查看报告中行为和行为流 -它可以展示点击发生的顺序。典型的使用场合:如果你开始对一个给定页面进行一轮A/B测试,你就可以通过“行为流”来查看那一个测试用例带来更好的转化率(也就是点击跳转的用户更多)。

3.试着拓展一下想像空间—不要仅仅将谷歌分析服务当作一个商业工具,挖掘一下如何深度使用。比如,你正在开发一个寻宝游戏-那么用谷歌分析来记录和统计用户在游戏中发现宝藏的次数。这样的话你能够发现地图中哪些宝藏太容易或者太难被找到! 


本文转载自:http://www.cocoachina.com/applenews/devnews/2014/0108/7674.html

浪子艾菲儿
粉丝 45
博文 49
码字总数 13001
作品 0
海淀
程序员
私信 提问
加载中

评论(2)

浪子艾菲儿
浪子艾菲儿 博主

引用来自“googoodalls”的评论

转载文章请注明出处!别人的翻译成果被你无私的窃取。不令人汗颜吗?55
告诉你这片文章是我为 raywenderlich 翻译的。原文在这里。 http://www.raywenderlich.com/zh-hans/62378/%E8%B0%B7%E6%AD%8C%E5%88%86%E6%9E%90ios%E5%BC%80%E5%8F%91%E5%8C%85%E5%AE%9E%E6%88%98
看清楚再说,我有说原创么,明明写着转载好吧!我这这里看到的http://www.cocoachina.com/applenews/devnews/2014/0108/7674.html;别动不动就说窃取你要是不想别人看就别翻译啊;艹 ,我有什么好汗颜的;相反汗颜的是你,有什么好显摆的吧。
googoodalls
googoodalls
转载文章请注明出处!别人的翻译成果被你无私的窃取。不令人汗颜吗?55
告诉你这片文章是我为 raywenderlich 翻译的。原文在这里。 http://www.raywenderlich.com/zh-hans/62378/%E8%B0%B7%E6%AD%8C%E5%88%86%E6%9E%90ios%E5%BC%80%E5%8F%91%E5%8C%85%E5%AE%9E%E6%88%98
革命性移动端开发框架-Flutter时间简史

说到Flutter,可能很多同学都会将它和这几个词关联起来:新兴的、移动端、动态化、跨平台、开发框架。 从去年开始Flutter的热度在不断地上升,那么它对很多同学造成了一个误区:认为Flutter...

JiaPengHui
03/09
0
0
AeroGear iOS Push-SDK for Swift v1.0 发布

AeroGear iOS Push-SDK for Swift v1.0 发布,这是为 Swift 语言提供的一个消息推送开发包,下载地址: https://github.com/aerogear/aerogear-ios-push/archive/1.0.0-swift.zip 系统要求:...

红薯
2015/01/24
726
0
【书坊赠书福利——第二期】《iOS 8开发指南》

本周是人邮IT书坊赠书的第二期,第一期参与度极高,微信君在此感谢你们的支持,第一期获奖赠书已全部寄出。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《...

生气的散人
2014/09/23
382
0
OSChina 技术专题之 Swift 苹果全新开发语言

Swift 是苹果新推出的编程语言,专门针对 OS X 和 iOS 的应用开发。Swift 在各个方面优于 Objective-C,也不会有那么多复杂的符号和表达式。同时,Swift 更加快速、便利、高效、安全。除此之...

OSC编辑部
2014/11/10
4.2K
4
Countly v16.02 发布,开源移动分析应用

Countly v16.02 发布,主要新功能包含: 1。网络分析 2。TVOS (Apple TV分析) 3。采用升级版的MongoDB5和Nodejs3以提高系统速度 4。用户配置升级 5。关掉谷歌服务如地图以提高系统速度 请查...

oschina
2016/02/24
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

实现线程类的两种方式

一、让目标类继承Thread类 package com.atzhongruan.springboot_boostrap.Test;/** * @Author jose * date 2019 */public class Task1 extends Thread{ @Override pub......

zhengzhixiang
24分钟前
2
0
OSChina 周日乱弹 —— 然而并不能,他是公的。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小小编辑推荐:《兔子姑娘》- 陈老实 《兔子姑娘》- 陈老实 手机党少年们想听歌,请使劲儿戳(这里) @曼尼22 :我倒要看看我头发啥时候掉完...

小小编辑
29分钟前
21
4
QML学习之浅谈Window

转载地址:http://blog.csdn.net/kanchuan1905/article/details/53762788 在Qt Quick的世界里,Window对象用于创建一个与操作系统相关的顶层窗口,包含了如Text, Rectangle, Image等元素。W...

shzwork
53分钟前
6
0
centos 查看删除旧内核

1、查看系统中安装的内核 $ yum list installed | grep kernel 2、删除系统中旧内核 $ yum install yum-utils$ package-cleanup --oldkernels --count=2...

编程老陆
今天
10
0
ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部