采纳Swift在HealthKit中张开睡眠解析

Today, Sleep Revolution is a fad and users are curious than ever to not
only know about the the time they’ve been asleep but also to analyze the
data gathered over a period to reveal their sleeping trends.
Advancements in technology including hardwares, and mobiles in
particular have brought this seemingly ever-growing subject into a whole
new light.

图片 1

此时此刻,睡眠革命成为一种狂潮,大家比往年特别爱戴,不独有要通晓他们睡觉的日子,还要剖析一段时间内募集的多寡以观测睡眠趋势。随着科技(science and technology)极其是硬件和手机的不仅仅向上,大家看来了新的晨光。

1468403616352271.jpg

Apple provides a cool way to communicate with user’s personal health
information in a secure manner and store the information securely
through the built-in Health app. Not only can you use HealthKit to build
a fitness app, the framework also allows you access sleep analysis data.

原文:Using Sleep Analysis in HealthKit with
Swift

,作者:Martin_Joy

苹果提供了一种很光彩夺目的法子来让顾客个人健康音信在平安的办法下传递,并且经过嵌入的Health应用安全的储存新闻。你不但可以采纳HealthKit成立一个常规应用,也利用框架访谈睡眠深入分析数据。

当今社会,睡眠革命慢慢变为一种时髦,与往年相比较,客商不只有想明白自个儿的睡觉时间,同期对用于剖析他们一段时间内就寝状态的数量也很感兴趣。科学技术的快捷发展,富含硬件本领,特别是手提式有线电话机技能的升高,为这些日益增加的供给拉动了新的曙光。

In this tutorial, I will give you a quick introduction to the HealthKit
framework, and demonstrate how you can build a simple app for sleep
analysis.

Apple提供了一种很酷的办法,可以安枕无忧地访谈顾客的个人健康新闻,并将那些新闻安全地囤积在其内置应用Health中。使用HealthKit框架,你不但能够支付一个健美应用,还足以访谈睡眠深入分析数据。

在那篇指南,笔者会令你对HealthKit框架举办叁个神速的入门,而且演示怎样创立多个睡眠剖析的简短利用。

在那篇教程中,小编将对HealthKit框架做个简易的牵线,并演示如何成立一款具有睡眠深入分析效能的简练利用。

The HealthKit framework provides a structure to save data in an
encrypted database called the HealthKit store. You can access this
database using the HKHealthStore class. Both iPhone and Apple Watch
have their own HealthKit store. Health data is synced between Apple
Watch and iPhone; however, old data is periodically purged from Apple
Watch to save space. HealthKit and the Health app are unavailable on
iPad.

简介

HealthKit框架提供一个叫HealthKitstore的加密数据库用以存储数据。你能够采取HKHealthStore类来访谈那个数据库。魅族和Apple
沃特ch都有谈得来的HealthKitstore,何况顾客健康情形的数量在三种道具之间是联合的。可是,须求小心的是,为了节约空间,旧数据会被周期性地从Apple
Watch 中消除。另外,三星GALAXY Tab不辅助HealthKit和Health。

HealthKit是多少个很强劲的工具,能够协助开荒者们依附健康数据去创建三个iOS
恐怕 watchOS
App。它能够管理多门路的数量,何况依据客户的偏疼自动合併区别来自的数目。这几个健康类App可以访谈各种来源的原生数据,同期统一数据。这一个多少不只能够申明身多福多寿康指标,强健体魄和硫胺素景况,还足以用来深入分析睡眠景况。

文章的后半某些剧情,作者将彰显什么在iOS系统上运用HealthKit框架去存款和储蓄和会见睡眠深入分析的多寡。这个情势在watchOS应用上亦然有效。

请留意:那篇教程的编制程序景况是 Swift 2.0 和 Xcode
7。所以读书那篇教程的时候,明确自个儿行使的是Xcode 7 或其履新的本子。

在起来在此以前,请下载运维工程并解压。小编一度为您创建了基本作用的顾客分界面。当你运行这几个工程的时候,你将看到二个定时器UI,当你按下开端按键之后就能够议及展览示计时。

HealthKit框架提供了一种结构来囤积数据到被叫作HealthKitstore的加密数据库。你能够使用HKHealthStore类来访谈那几个数据库。华为和Apple
Watch都有他们各自的HealthKit store。健康数据在Apple
Watch和Samsung之间张开联合;但是,旧的数目会被限制时间清理以节约空间。HealthKit和Health应用均不帮助苹果平板。

使用HealthKit框架

我们要开创的运用目标是保存计时之间的平息分析消息和寻找数据。要选取HealthKit,开采者要求得到使用HealthKit的授权。在你的工程中,实行target
-> capabilities -> 张开HealthKit按键操作。

图片 2

1468402277832544.jpg

接下去,你将急需在ViewController类中动用上边代码去成立二个HKHealthStore实例
<pre><code>let healthStore = HKHealthStore()
</code></pre>

稍后我们将选拔HKHealthStore实例去拜会HealthKit Store。

正如上文提到的那样,HealthKit给予客商调节本人健康数据的权限。所以你首先只好去乞求客户的准予,那样你才足以访问(读/写)客户的睡眠解析数据。想要访谈客户数量,前提是要导入内置的HealthKit框架,并革新在viewDidLoad中的代码如下:
<pre> override func viewDidLoad() {
super.viewDidLoad()
let typestoRead = Set([
HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)!
])
let typestoShare = Set([
HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)!
])
self.healthStore.requestAuthorizationToShareTypes(typestoShare,
readTypes: typestoRead) { (success, error) -> Void in
if success == false {
NSLog(” Display not allowed”)
}
}
} <code>
</code></pre>

上述代码将唤起客商去同意或拒绝你的权限央浼。在那些闭包中,你可以管理成功或停业状态的回调事件,并且能够收获央浼的结果。顾客也不自然会容许你app全体的权能央求,所以你必需在app中合理地管理错误。

而是出于测验的目标,你必需挑选“允许”选项来允许应用程序访谈你的器具上的常规数据。

图片 3

1468402431380425.jpg

HealthKit is a powerful tool if you want to create an iOS or watchOS app
based on health data. It is designed to manage data from a wide range of
sources, automatically merging the data from different sources based on
user’s preferences. Apps can also access the raw data for each source,
and merge the data themselves. Not only for body measurements, fitness
or nutrition, the data can also be used for sleep analysis.

写入眠眠深入分析数据

第一,我们怎样能够得到睡眠解析数据吧?通过Apple的文书档案,每种睡眠深入分析数据样本都唯有三个数值。为了分化卧床和睡觉状态,HealthKit命全权大使用了八个或更加多的重叠时间的样本加以分析。通过相比较这几个样本的上马和终结时间,应用软件就足以摄取有些一次总计数据:
<li>客商步向眠眠所开销的时间</li>
<li>客户在床的面上的日子和实际睡眠时间的百分比</li>
<li>客户在床面上醒来的次数</li>
<li>顾客卧床和睡觉的小时的总和</li>

图片 4

1468402656297161.jpg

大约,你需遵从下边包车型大巴点子将睡眠分析数据保存到Health基特 Store:
</br>
<li>定义三个NSData对象用于早先和终结时间</li>
<li>使用HKCategoryTypeIdentifierSleepAnalysis创造多少个HKObjectType实例</li>
<li>创造叁个新的HKCategory萨姆ple类型的实例,用于记录睡眠数据。单个的范本代表客商卧床或睡觉的时间长度。因而,大家将开创一个满含重叠时间的卧床状态和睡觉意况的范本。</li>
<li>最终,使用HKHealthStore的saveObject方法保存上述实例。</li>

小编注:对于项目样本的品种,能够参见HealthKit Constants
Reference

一旦您想用Swift实现上述全数,这里提供关于保存卧床和睡眠分析数据的代码片段。请在ViewController类中插入如下代码:
<pre>func saveSleepAnalysis() {
// alarmTime and endTime are NSDate objects
if let sleepType =
HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)
{
// we create our new object we want to push in Health app
let object = HKCategorySample(type:sleepType, value:
HKCategoryValueSleepAnalysis.InBed.rawValue, startDate: self.alarmTime,
endDate: self.endTime)
// at the end, we save it
healthStore.saveObject(object, withCompletion: { (success, error) ->
Void in
if error != nil {
// something happened
return
}
if success {
print(“My new data was saved in HealthKit”)
} else {
// something happened again
}
})
let object2 = HKCategorySample(type:sleepType, value:
HKCategoryValueSleepAnalysis.Asleep.rawValue, startDate: self.alarmTime,
endDate: self.endTime)
healthStore.saveObject(object2, withCompletion: { (success, error) ->
Void in
if error != nil {
// something happened
return
}
if success {
print(“My new data (2) was saved in HealthKit”)
} else {
// something happened again
}
})
}
}<code>
</code></pre>
当我们想去保存睡眠数据到HealthKit中去的时候,就能够调用那么些点子。

假如你想付出一款基于健康数据的iOS或watchOS应用,那么HealthKit无疑是叁个强有力的工具。HealthKit被规划用来管理大规模的数量出自,并基于客户设定自动合併管理。应用也能够访谈每贰个来自的raw数据,並且自身合併数据。这一个多少不止用于人体育项目检查评定量、健康或氨基酸,还可以被用来做睡眠深入分析。

读取睡眠深入分析数据

要读取睡眠解析数据,必要创建叁个询问办法。首先创造一个HKCategoryTypeIdentifierSleepAnalysis类型的HKObjectType实例。你也可能须要采纳叁个预见,通过startDate和endDate那三个NSData对象对应的年月限制来过滤取回的多少。同不常间还索要创制三个sortDescriptor对象,来对样本数量举行排序,进而获取你想要的结果。

询问睡眠数据的代码大概如下:
<pre>func retrieveSleepAnalysis() {
// first, we define the object type we want
if let sleepType =
HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)
{
// Use a sortDescriptor to get the recent data first
let sortDescriptor = NSSortDescriptor(key:
HKSampleSortIdentifierEndDate, ascending: false)
// we create our query with a block completion to execute
let query = HKSampleQuery(sampleType: sleepType, predicate: nil, limit:
30, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error)
-> Void in
if error != nil {
// something happened
return
}
if let result = tmpResult {
// do something with my data
for item in result {
if let sample = item as? HKCategorySample {
let value = (sample.value ==
HKCategoryValueSleepAnalysis.InBed.rawValue) ? “InBed” : “Asleep”
print(“Healthkit sleep: (sample.startDate) (sample.endDate) – value:
(value)”)
}
}
}
}
// finally, we execute our query
healthStore.executeQuery(query)
}
}<code>
</code></pre>
以上的代码先查询到全部的上床深入分析的数码,并依照降序排列。每种查询结果将被打字与印刷出来,打字与印刷结果满含早先时间、甘休时间、以及所对应的项目(卧床或睡眠)。笔者一度安装了限制,取回近来的三十条记下样本。你能够选择自身的断言方法自定义开首时间和完工作时间间来界定查询的间距。

For the rest of the article, I will show you how to make use of the
HealthKit framework for saving and accessing sleep analysis data on iOS.
The same methods are applicable for watchOS applications as well. Please
note that the tutorial is written using Swift 2.0 and Xcode 7. So make
sure you use Xcode 7 to follow the tutorial.

运用测验

对于 demo
程序,作者已经使用了一个NSTimer去突显点击先导开关后流逝的时光。NSDate对象被创制用来保存起来和终止之间的睡觉解析数据。在stop方法中,你能够调用saveSleepAnalysis()方法和retrieveSleepAnalysis()方法去保存和取得睡眠数据。
<pre>@IBAction func stop(sender: AnyObject) {
endTime = NSDate()
saveSleepAnalysis()
retrieveSleepAnalysis()
timer.invalidate()
}<code>
</code></pre>
而是在您个人的采纳中,你大概会通过改变对应的NSDate对象,进而选取相应的启幕时间和四个(差别的)截止时间来记录个人卧床和睡眠境况的多少。

当成功调度后,你能够运转那么些demo并开端计时,运营应用程式几分钟,然后点击stop开关。之后,张开那款健康应用,就足以找到您的睡眠数据啦。

图片 5

1468403233819895.jpg

小说的剩余部分,作者将向您来得怎么着行使HealthKit框架来保存和拜见iOS上的停息数据。在watchOS上得以用平等的法子。请留心那篇指南是根据Swift2.0和Xcode 7写作的。所以请您遵循指南使用Xcode7版本。

对于健康类App的一部分提出

HealthKit目的在于为开荒者们提供一个集体平台,能够非常的低价地分享和做客客户的多少,并制止其余大概的重复或不等同的数据。苹果检查核对指南对运用
HealthKit的应用软件有很扎眼的供给,若是对客户的读/写权限哀告没有通晓的陈诉就很恐怕引致应用程序被驳回。

倘使你的例行类应用软件存款和储蓄伪造只怕失实的数额,也将会会被拒绝。那表示,你无法运用类似于本学科中的睡眠深入分析数据,你须要经过正确的算法去计算与符合规律有关的数量。也许你应有尝试使用设备中存放传感器的总括数据,加以分析,得出分析数据,以免止出现错误或不标准数据。

有关全体的Xcode项目,你能够在这里下载。

Before moving on, download the starter project and unzip it. I have
already created the user interface with basic functionalities for you.
When you run the starter project, you will see a timer UI that shows the
time elapsed after you push the start button.

在开班此前,下载上手项目并解压。作者曾经为你成立了基本功效的顾客分界面。当您运行上手项目,你按下开关后将拜望到按下按键之后通过岁月的计数器分界面。

Our aim with the application is to save sleep analysis information and
retrieve the data using the Start & Stop buttons. To use HealthKit,
you must begin by granting the HealthKit capabilities to your app
bundle. In your app project, navigate to your current target ->
capabilities and turn on HealthKit.

大家采纳的指标是运用StartStop开关保存睡眠深入分析音信和获取数据。你必需在利用bundle中开拓允许获取HealthKit的权位方可使用HealthKit。在你的施用类型,选取当前的target
-> capabilities何况展开HealthKit。

图片 6

Next, you will need to create an instance of HKHealthStore in the
ViewController class using the following code:

接下去,你须求运用上边包车型大巴代码在ViewController中创建叁个HKHealthStore实例:

let healthStore = HKHealthStore()

Later we will use the HKHealthStore instance to access the HealthKit
store.

接下来大家应用HKHealthStore实例访谈HealthKit store。

As mentioned, HealthKit grants users control over their health data. So
you have to first request users’ permission before you can gain access
(write/read) to the Sleep Analysis data of the user. To do so, first
import the built-in HealthKit framework and update the viewDidLoad
method like this:

急需聊起一点的是HealthKit搜集健康数据是依赖顾客的装置。所以你必得在你首先次获得读写睡眠剖析数据的时候央求客商权限。要变成这一点,首初阶入内置的HealthKit框架,而且按如下更新viewDidLoad方法:

override func viewDidLoad() { super.viewDidLoad() let typestoRead = Set([ HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)! ]) let typestoShare = Set([ HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis)! ]) self.healthStore.requestAuthorizationToShareTypes(typestoShare, readTypes: typestoRead) { (success, error) -> Void in if success == false { NSLog(" Display not allowed") } }}

This code will prompt the user to allow or deny the requested
permissions. With the completion block, you can handle success or error
and get the final result. It is not necessary that the user grants your
app all the requested permissions. You must handle the errors gracefully
in your app.

这段代码能够提示顾客同意可能拒绝权限伏乞。通过completion
block,你能够管理success只怕error音信並且获得最后的结果。并没有供给顾客获得全体的乞请权限。你不能够不在利用优雅的管理错误新闻。

But for testing purpose, you must have to select the “Allow” option to
grant the app permission to access the health data on your device.

只是对于测验目标,你必须挑选“Allow”选项来授权行使获取你设备上符合规律数据的拜见权限。

图片 7

First, how can we retrieve the sleep analysis data? According to Apple’s
documentation, each sleep analysis sample can have only one value. To
represent the user being both in bed and asleep, HealthKit uses two or
more samples with overlapping times. By comparing the start and end
times of these samples, apps can calculate a number of secondary
statistics:

率先,我们什么赢得睡眠剖析数据?依照苹果的文书档案,每三个上床剖析样本唯有1个值。为了展现客户躺在床的上面和睡觉的时辰,HealthKit使用2个或越多的重合时间。通过比较起来和了结的样书,应用能够测算出多量的次级总结数据:

  • the amount of time it takes for the user to fall asleep
  • the percentage of time in bed that the user actually
    sleeps(客户在床的上面真正睡眠时间所占的比例)
  • the number of times the user wakes up while still in
    bed(客商躺在床的上面醒来的次数)
  • the total amount of time spent both in bed and
    asleep(躺在床面上和睡眠的总时间)

图片 8

In brief, you follow the below approach to save sleep analysis data to
the HealthKit store:

简单的说,你能够遵照下边方式来保存睡眠深入分析数据到HealthKit sotore

  1. We need to define two NSDate objects corresponding to the start
    time and the end
    time.(大家要求定义八个抢先起初时间和竣事时间的NSDate对象)
  2. We then create an instance of HKObjectType using
    HKCategoryTypeIdentifierSleepAnalysis.(下来大家采用HKCategoryTypeIdentifierSleepAnalysis来创建HKObjectType实例)
  3. We need to create a new object of the HKCategorySample type. You
    normally use category samples to record sleep data. Individual
    samples represent time periods when the user is in bed or asleep. So
    we will create both an in-bed sample and an asleep sample with
    overlapping times.(
    大家需求创建三个HKCategorySample种类。你平凡需求利用category
    samples记录睡眠数据。客户能够本性化的呈现躺在床的上面或然睡眠的岁月段。所以大家将要成立躺在床的面上和睡觉的重合时间。)
  4. Finally, we’ll save the object using saveObject of
    HKHealthStore.(最终大家要求利用HKHealthStoresaveObject来保存对象)

Editor’s note: For the type of the sample, you can look it up in
HealthKit Constants Reference.

编者注: 对于样本的项目, 你可以在HealthKit Constants Reference里面查询.

If you translate the above into Swift, here is the code snippet to save
sleep analysis data for both in bed and asleep values. Please insert the
method in the ViewController class:

假若您将方面所述转变为斯维夫特,这段代码能够保存在床面上和睡眠的深入分析数据。请增加该方法到ViewController类:

func saveSleepAnalysis() { // alarmTime and endTime are NSDate objects // alarmTime和endTime是NSDate对象 if let sleepType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis) { // we create our new object we want to push in Health app //我们创建新对象push到Health应用 let object = HKCategorySample(type:sleepType, value: HKCategoryValueSleepAnalysis.InBed.rawValue, startDate: self.alarmTime, endDate: self.endTime) // at the end, we save it //在最后,我们保存它 healthStore.saveObject(object, withCompletion: { (success, error) -> Void in if error != nil { // something happened return } if success { print("My new data was saved in HealthKit") } else { // something happened again } }) let object2 = HKCategorySample(type:sleepType, value: HKCategoryValueSleepAnalysis.Asleep.rawValue, startDate: self.alarmTime, endDate: self.endTime) healthStore.saveObject(object2, withCompletion: { (success, error) -> Void in if error != nil { // something happened return } if success { print("My new data  was saved in HealthKit") } else { // something happened again } }) } }

This function can be called at the time we want to save the Sleep
Analysis data to HealthKit.

每当大家想要保存睡眠深入分析数据到HealthKit的时候都得以调用。

To read the sleep analysis data, we will need to create a query. You
should begin by defining the HKObjectType category to
HKCategoryTypeIdentifierSleepAnalysis. You may also want to use a
predicate to filter the retrieved data using startDate and endDate
which are NSDate objects corresponding to the time range that you may
want to retrieve. You will also need to create a sortDescriptor for
sorting the retrieved queries to select the desired result.

为了赢得睡眠深入分析数据,大家须要创立八个查询。你应有通过定义HKCategoryTypeIdentifierSleepAnalysis的类目HKObjectType。你或者也急需采纳predicete来过滤获取的数码,使用startDateendDateNSDate对象检索你恐怕要求的小运限制。你大概也亟需创立一个sortDescriptos来对获得的查询举办排序以获得想要的结果。

Your code for retrieving sleep analysis data should look like this:

您得到睡眠合理数量的代码只怕如下:

func retrieveSleepAnalysis() { // first, we define the object type we want // 首先,我们定义我们想要的对象 if let sleepType = HKObjectType.categoryTypeForIdentifier(HKCategoryTypeIdentifierSleepAnalysis) { // Use a sortDescriptor to get the recent data first // 首先使用一个sortDescriptos获取最近的数据 let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) // we create our query with a block completion to execute //我们创建一个blcok来查询 let query = HKSampleQuery(sampleType: sleepType, predicate: nil, limit: 30, sortDescriptors: [sortDescriptor]) { (query, tmpResult, error) -> Void in if error != nil { // something happened // 某些情况 return } if let result = tmpResult { // do something with my data //对数据做一些处理 for item in result { if let sample = item as? HKCategorySample { let value = (sample.value == HKCategoryValueSleepAnalysis.InBed.rawValue) ? "InBed" : "Asleep" print("Healthkit sleep: \(sample.startDate) \(sample.endDate) - value: \ } } } } // finally, we execute our query healthStore.executeQuery }

This code queries the HealthKit to get all Sleep Analysis data and then
sorts it down to descending order. Then each query is printed with the
startDate and endDate along with the type of value i.e. In Bed or
Asleep. I have set the limit to 30 to retrieve the last 30 recorded
samples. You can also use the predicate method to choose your custom
start and end dates.

这段代码通过HealthKit获得全套睡觉分析数据,然后做降序。接下来对每一个查询遵照在床面上或许睡眠的始发和得了日期打印值。作者设置限制最多30条以获得近来的30条数据。你也得以使用predicate方法来自定义初阶和了结日期。

For the demo application, I have used an NSTimer to show the time
elapsed since you push the start button. The NSDate objects are
created on the start and end buttons to save sleep analysis data as the
elapsed time. In the stop action method, you can invoke the
saveSleepAnalysis() and retrieveSleepAnalysis() methods to save and
get the sleep data.

对于德姆o应用,笔者早就用二个NSTimer来体现自从你按下起来开关所通过的年月。NSDate目的在按下起来按键的创建,在按结束开关的时候保存睡眠解析数据。在stop方法中,你能够调用saveSleepAnalysis()retrieveSleepAnalysis()艺术来保存和获得睡眠数据。

@IBAction func stop(sender: AnyObject) { endTime = NSDate() saveSleepAnalysis() retrieveSleepAnalysis() timer.invalidate()}

In your apps, you may want to change the NSDate objects to choose
relevant start and end times (probably different) for saving the in bed
and asleep values.

在您的利用中,你大概想要想要NSDate对象来摘取有含义的开始和告竣的时间段来囤积躺在床的上面和睡觉的值。

Once you’ve made the changes, you can run the demo app and start the
timer. Let it run for a few minutes and then tap the Stop button. After
that, open the Health app. You’ll find the sleep data in there.

假设你做出更动,你能够运作demo应用并张开定时器。让它跑几分钟,然后按下stop按键。接下来张开Health应用,你将会在个中找到睡眠数据。

图片 9

HealthKit is designed to provide a common platform for app developers to
share and access user’s data easily and avoids any possible duplication
or inconsistency in data. Apple review guidelines are very specific for
apps using the HealthKit and requesting read/write permissions without a
clear demonstration of their use might result in the app being rejected.

Health基特被规划为公共平台让动用开采者更低价分享和做客制止可能的再一次和差别样的数量。苹果考察指南开中学对此利用HealthKit和伸手读写权限,不过未有三个醒目标宣示或然会被驳回。

Apps that save fake or incorrect data to the Health App would also be
rejected. This means, that you cannot be naïve with your algorithms for
calculating different health values like sleep analysis in this
tutorial. You should try using the inbuilt sensor data for reading and
manipulating any parameters to avoid calculating false data.

利用保存无效可能失实的数码到Health
App也恐怕会被驳回。那就表示,你不能够像指南开中学的睡眠数据一致用你的算法总计分裂的平常值。你应该尝试去读和操作内置的传感器数据,以制止不当的数量。

For the complete Xcode project, you can get it here.

对此完整的Xcode项目,你能够在此处得到。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图