23 9月

使用JSON和WatchKit构建简单的天气应用程序

文 / Gregory Tareyev:iOS开发者,http://iamchill.com联合创始人。

原文链接:http://www.appcoda.com/weather-watchkit-app/

编辑注:这是论坛游客Gregory Tareyev发的帖,他是iOS开发人员和Chill(iamchill.co)的联合创始人。开发的首个可穿戴通信工具让你和朋友们动动指尖就能互动。在本文中,Gregory将分享自己做Apple Watch开发的经验,向你展示如何使用第三方API和WatchKit构建简单的天气应用程序。我们已经写了两篇与WatchKit有关的文章,都是使用Swift语言完成的。一些读者提到是否能有一篇使用Objective-C的文章,这篇便是。

Gregory的文章从这里开始……

大家好,我是Gregory Tareyev(可以来tareyev.ru联系我),是iOS开发人员和Chill(iamchill.co)的联合创始人。第一款可穿戴的通信工具终于搞定了。最近我们在Product Hunt上展示的产品有着不俗的表现,使我们在社区内获得了广泛的影响力并吸引了主要的技术博客报道这次发布。我们也在讨论使用加速器的问题,并考虑使用最好的那种。为构建应用程序而着实努力着,我相信你们每个人都可以为此而努力。

55d1486e117dc_middle

在这里想要与你分享我的Apple Watch开发经验。很有趣,也不难。

为了调动你的兴趣,我要解释在可穿戴设备上进行开发为何如此重要。

  1. 市场仍然不太大,这等同于作为先行者,你可以获得更大的市场份额。
  2. 市场将会获得极大增长,这等同于相关产品规模会随着市场同步增长。

55d14acdba958_middle

来源:图表由Business Insider提供。

在本文中,构建一个简单的Apple Watch天气应用程序,要完成两件事:

  • 如何在使用WatchKit在应用程序中解析JSON数据
  • 如何使用OpenWeatherMap的API(一旦明白其中的道理,你应该能够选择任何基于JSON的API来使用)

我们开始吧!

应用程序示例

示例程序是一款非常简单的天气应用程序,会使用OpenWeatherMap的API得到特定城市(例如:伦敦)的天气信息。这是应用程序最终样例的截图。

55d14b794590b

创建Xcode工程

首先,创建一个Single View Application,并按照如下截图设置项目信息。没错儿,我们使用Objective-C来做,我觉得Objective-C仍然很重要,还是要继续使用的。

55d14bcd1445f_middle

创建一个Watch应用程序,到Xcode顶部菜单栏选取File > New > Target…,选择Apple Watch > WatchKit App。由于使用WatchKit App模版,所以会生成构建Watch应用程序所需要的一切。

55d14ccb2a8f8_middle

取消选择“Include Notification Scene”,其余项保留,点击Finish。

simple-weather-watch-app

你会得到一条警告信息问是否要激活,点击Activate就是了。然后就会看到两个新文件夹:WatchKit Extension和WatchKit App。

simple-weather-watch-scheme

设计应用程序的用户接口

接下来,我们要着手设计应用程序的用户接口。为此,点击“SimpleWeather WatchKit App”下的Interface.Storyboard文件。

首先,从对象库(Object Library)拖拽一个Lable控件,名称设置为“Weather in London”。控件上字体大小可能需要调整一下。然后拖拽一个Image控件。接着再来一个Button控件。你会发现图像和按钮都会自动布局,垂直堆放。把按钮的Title改为“Update”,颜色调为绿色并调整图像的尺寸。

simple-weather-watch-ui

标签用来显示气象类型,而图像显示气象类型的插图。Update按钮是与用户交互的唯一元素,用来更新天气信息。

Interface Builder可以让你看到Apple Watch不同版本的视图。默认情况下,Interface Controller被设置成Any Screen Size。可以点击Interface Builder下方的“Any Screen Size”按钮,在Apple Watch 38/42mm这两种尺寸间切换。如果切换到Apple Watch 42mm,就会发现图像不完全合适,要调整图像大小,把所有控件布局弄好为止。因为更改图像大小时,Xcode会自动添加对布局做特殊处理。这种情况只在选择Apple Watch 42mm的才出现。

simple-weather-watch-ui-42

理解JSON和OpenWeatherMap的API

已经说过了,我们使用OpenWeatherMap的API来得到天气数据。为了理解它是如何工作的,要打开这个链接:http://api.openweathermap.org/data/2.5/weather?q=London,uk。拷贝结果并粘贴到http://json.parser.online.fr。你会看到结构化的JSON数据。在这里,我们感兴趣的是天气类型,也就是dictionary类型数据“weather”下的“main”键。这就是我们要在屏幕上显示的信息。

openweather-api-json

作为参考,可以在http://openweathermap.org/api查看API文档。

现在,一起来看如何解析JSON数据,并把天气信息在应用程序中展现出来。

打开Assistant Editor,按住Control键拖拽Label控件到InterfaceController.h文件的代码中做关联,把outlet命名为“weatherType”。

add-label-outlet

重复上述过程,将Image控件也做好关联,把Outlet命名为“weatherImage”。在给Update按钮做关联时,不要选择Outlet,选择Action类型,并命名为“updateAction”。

add-update-action

在InterfaceController.m文件中为updateAction方法添加逻辑代码:

- (IBAction)updateAction
{
    NSURLRequest* requestForWeatherData = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"]];
    NSURLResponse* response = nil;
    NSError* error = nil; //do it always
 
    NSData* data = [NSURLConnection sendSynchronousRequest:requestForWeatherData returningResponse:&response error:&error]; //for saving all of received data in non-serialized view
    
    NSMutableDictionary *allData = [ NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; //data in serialized view
    NSString* currentWeather = nil;
    
    NSArray* weather = allData[@"weather"];
    
    for (NSDictionary* weatherDictionary in weather)
    {
        currentWeather = weatherDictionary[@"main"];
    }
}

该方法中,使用了NSURLConnection对OpenWeatherMap同步发出请求。可以使用NSJSONSerialization把JSON数据转换为Foundation基础库类型(例如:NSDictionary)。我们对数据进行解析以后将天气类型存入“currentWeather”变量中。

接下来,要更新标签和图像。

weather-image-if

这样代码看起来不是太美观,对吧?

为了避免对天气类型进行硬编码,可以创建如下方法。这样会使代码更灵活。

  1. -(void)setImageAndTextWithWeather:(NSString* ) weatherName
  2. {
  3.      // Use the weather type as the weather image name. For example, if the weather name is “Rainy”, the image name is set to “rainy.jpg”. 
  4.      // Set the weather type to the given weather name
  5. }

很不错!我们把方法放到真实的代码中:

  1. -(void)setImageAndTextWithWeather:(NSString* ) weatherName
  2. {
  3.         NSString* weatherNameWithoutSpaces = [weatherName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //delete potential spaces in JSON array
  4.         [_weatherImage setImageNamed:[weatherNameWithoutSpaces stringByAppendingString:@“.jpg”]];
  5.     NSMutableAttributedString *customString = [[NSMutableAttributedString alloc] initWithString:weatherNameWithoutSpaces];
  6.     [customString addAttribute:NSFontAttributeName
  7.                          value:[UIFont systemFontOfSize:18]
  8.                   range:NSMakeRange(0, [weatherNameWithoutSpaces length])]; //Making text more readable by creating a custom string
  9.     [_weatherType setAttributedText:customString];
  10. }

最后,在updateAction方法的结尾加上这行代码:

[self setImageAndTextWithWeather:currentWeather];

在Asset Catalog中添加图像

运行应用程序之前,下载这些图像。解压缩后把这些图像全部添加到SimpleWeather WatchKit App文件夹下的Images.xcassets里。

simple-weather-images

可以随便添加更多带有天气类型名称的图像。应用程序不用更改任何代码就可以运行。

测试应用程序

差不多了!现在可以在Apple Watch模拟器中构建并运行应用程序了。选择“WatchKitDemo WatchKit App”项目,并选择合适的设备,然后点击Run按钮,测试Apple Watch应用程序。另外,还可以修改模拟器显示的尺寸,选择Hardware > External Displays > Apple Watch – 38mm。

55d151607af6f_middle

很棒!你开发完成了一款Apple Watch天气应用程序。

作为参考,可以在这里下载最终的项目

http://www.csdn.net/article/2015-08-17/2825474/2

02 3月

可穿戴设备制造商们,这才是今年我们想要的产品

原文链接:http://venturebeat.com/2015/01/06/hey-wearables-makers-heres-what-we-expect-from-you-this-year/

文 / Elliott Chenger:移动平台开发人员,热衷于使用新兴技术构建连接彼此的产品。

2015年了,我对可穿戴设备有了更多的期许。虽然现在这些设备可以记录我走路,睡觉,消耗的卡路里还有心率,但是我仍然被那些在我看来没有意义的数据弄得不知所措,搞不懂这些可穿戴设备到底能给我带来什么好处?

就拿Jawbone Up24这款智能手环来说吧,我是很喜欢的。它能够记录我的行踪,睡眠,饮食,甚至是聪明程度(哈哈,我开玩笑的,这个不能滴)。但所有的这些功能只是告诉你正在干什么,却没有说你该如何进行调整及其原因。比如这手环自带的应用没说怎么样去获得更好的睡眠,也没能因地制宜地帮你从锻炼中进行调理。

在新的一年,可穿戴设备需要针对这样的局限进行改进,切实地告诉大家如何才能有效地提高生活质量。这需要有带情境、可操作且精准的数据作为前提来对我们的日程行为进行调整。

情境数据
情境数据会将时间定位到一天的某个时刻后呈现给你。这不仅可以帮助你从杂乱的数据中进行快速筛选,还能让你对自己在一段时间内的状况有更好的认识。

如果数据杂乱且没有正确的情境,接触太多这样的数据就不一定有用了。就拿记录睡眠来说,我们要从睡眠数据中得到更多的信息,就需要知道白天以及就寝前哪些时候需要调整,还需要从周围环境得到一些其他数据来协助验证影响睡眠的方式及原因。

比如说,我们睡觉的时候,有一个连接到可穿戴设备的温度调节器来显示室内温度的变化。这种变化要附带睡眠模式,这样才可以帮助我们定量了解室温对睡眠质量的影响。

由于这些设备变得更加个性化,关联更紧密,因此我们所得到的数据关联性也会更强。如果设备能够将数据情境化,这样就会让我们容易知道如何改善周围的环境,采取恰当的行动。最终手机或者可穿戴设备就能根据这些情境信息以我们的喜好来调节环境。

可操作的数据
没有接下来要说的可操作的数据,情境数据就孤掌难鸣。不要再看我们睡了几小时,失眠了几小时,可操作数据会告诉我们如何让睡眠质量更好。这样做的高明之处在于我们可以看到实时的调整建议。比如可以监视温度调节器,然后根据我们睡眠模式的变化和夜间时间来调节温度。

早期可操作数据的例子就是Jawbone的某款产品,该产品可以根据室内的温度和湿度来提高或降低风扇的转速。

在2015年,消费者需要更多这样的产品,能够通过科技将用户体验与真正的价值相结合给生活带来便捷的产品。企业应该以满足消费者的期待来求得生存。

Whistle是一款宠物狗行踪追踪器。它能帮助宠物医生了解宠物的活动量。这样就可以给宠物的主人提供有益于改善宠物健康的建议。就像HealthKit移动应用平台那样,开发人员可以开发类似的功能,把数据信息传送给医生,医生可以给出可操作的建议,提高我们的生活质量。然而,所有这些功能都需要在精准的设备上工作。

精准程度
可穿戴设备目前并没有那么精准。很多用户都有这样的经历,所测量的步数和心率的变化很诡异,心率的变化好像一会儿心脏停跳了,一会儿又像刚跑完马拉松似的。设备制造商也意识到了这样的问题,他们正努力改进硬件以提高设备的精准度。

美国苹果公司声称,其推出的Apple Watch会像医院里大多数医疗设备那样精准,忠实地去记录使用者的心率。如果这些可穿戴设备像制造商承诺的那样精准,那就真的会使我们的生活更美好。

随着家电设备互联业界和可穿戴设备市场都揣摩着如何融入我们生活的方方面面,我们将会看到两者更多的合作,也会有更多的开发者开放平台出现。这会使设备间可以互相对话,一起工作。奠定这样的基础是下一个情境数据为王计算时代的一部分,而以单纯的数量作为度量标准的做法则会成为过去式。随着企业为消费者提供的用户体验更加个性化,大数据技术也将退居二线。