iOS仿照Yahoo天氣:油條天氣

Where?

  項目地址:Github:YTWeathergit

Why do this?

  距離畢業也有3、四個月的時間了,除了工做上的內容,改一改舊的Bug,作一作新的內容,還一直想着要作一個本身獨立完成的應用。作即時通信吧沒有服務器,作音樂播放器吧沒有數據庫,因此就從最簡單的只須要一個接口就能搞定的天氣應用開始嘍。這不,一款亂七八糟、爲所欲爲的Weather Application就出來了。感謝小夥伴Chaylau的協做完成。程序員

What's this?

  「油條天氣」是一款基於iOS平臺的天氣應用。YT可以作到顯示基本的天氣信息,包括城市、當前時間、實時天氣狀況、七每天氣預報、當天24小時天氣預報,也可以自由添加國內城市,只須要輸入城市名便可。 github

油條天氣APP圖標

What're the features?

  油條天氣涵蓋了城市信息、當前時間、七每天氣預報、一天內24小時天氣預報、廣告位、當前詳細天氣信息、降水量信息、太陽和風速信息等基礎天氣諮詢。還具備自定義添加國內城市、多城市切換的功能。一些界面截圖以下: 數據庫

APP屏幕截圖

What're the techniques?

  • 接口

  獲取數據的接口選取的是 和風天氣 ,針對普通開發者能夠免費獲取7天/24小時的天氣預報,天天可以鏈接接口大約15000次。數組

  只須要登陸 和風天氣 官網註冊成爲開發者並稍做認證,便可得到Key在應用內使用,在官網控制檯內還能查看每日接口被獲取的詳細數量。緩存

  固然,免費的接口只能獲取一部分天氣信息,而且只能支持國內的城市。想要體驗更多的天氣信息,則必須購買相應功能的接口。 bash

和風天氣控制檯

  • UI設計

  程序員的工做是安安心心的寫代碼,總不能期望咱們SketchAxurePhotoShop樣樣精通吧......可是一款好看的App又很依賴於UI設計,因此咱們偷懶將 Yahoo天氣 進行了解包,調取了他們的UI切圖啥了的,界面設計也仿照了 Yahoo天氣 。因此UI方面的工做就比較輕鬆,直接拖入Assets包裏就行。(不做商業用途,此處如被認定有侵權,將會馬上刪除。)服務器

  解包操做:下載PP助手(以前能夠直接在iTunes中下載ipa包的,可是蘋果關閉了這項功能,因此用PP助手),在PP助手上將Yahoo天氣的ipa包下載到mac中,再用 Github:Cartool 進行獲取Assets操做,具體操做可參考 提取assets.car中的圖片 .car文件的解壓網絡

獲取的UI文件

  • 框架搭建

  開始動手碼代碼以前固然是對程序的框架進行搭建,參考公司其餘項目的結構,選用了傳統的MVC框架,思惟導圖以下: app

框架思惟腦圖.png

  APP複雜度並不高,也不依賴於NavigationControllerTabBarController,因此一個主控制器負責全部界面的展現、子控制器的跳轉。將視圖的展現集合到MainView裏,MainController只負責邏輯部分,減輕M-V-C中C的負擔。

  MainView從底往上依次是:LeftSlideView-MaskView-ScrollView-TableView-CustomNavigationBar。在處理ScrollView時花了很多功夫,既要保證當前城市所在View的滑動,還要保證其餘View跟隨滑動,在切換或搜索城市事後還要添加相應的索引。

  • 項目中遇到的其餘問題

  1. Q:Cell如何實現懸浮效果?
    A:將Cell背景設爲透明色,在每一個Cell的上先加入一層BackgroudView,到左右兩邊同時設置約束,加圓角,改變BackgroundView的顏色和透明度,實現懸浮效果。
  1. Q:WeatherCode和CityCode都是以.txt形式給出,如何轉爲.plist? A:在網上看了許多博客和教程,最後決定用笨辦法轉換,因爲不一樣txt中內容格式不固定,因此手動粘貼了txt文件中的項。從此準備將轉換方法實現自動化,自動去判別txt中的內容,並根據內容完成轉換,如下是轉換方法的代碼。
- (void)txtConvertToPlist
{
    // 將txt文件添加進項目文件中
    // 獲取txt文件的路徑
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"condition-code" ofType:@"txt"];
    // 將txt文件轉換爲String類型
    NSString *pathString = [[NSString alloc] initWithContentsOfFile:plistPath encoding:NSUTF8StringEncoding error:nil];

    // 將每行拆分,存入數組
    NSArray *bigArray = [pathString componentsSeparatedByString:@"\n"];

    NSMutableArray *resultArray = [NSMutableArray array];
    for (int i=1; i<ary.count-1; i++) {
        // 根據空格拆分每列,存入字典
        NSArray *smallAry = [bigArray[i] componentsSeparatedByString:@" "];
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic setObject:smallAry[0] forKey:@"cityCode"];
        [dic setObject:smallAry[1] forKey:@"cityEnglishName"];
        [dic setObject:smallAry[2] forKey:@"cityChineseName"];
        [resultArray addObject:dic];
    }
    
    // 存入.plist
    NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
    NSString *fileName = [plistPath stringByAppendingPathComponent:@"cityCode.plist"];
    NSFileManager *fm = [NSFileManager defaultManager];
    if ([fm createFileAtPath:fileName contents:nil attributes:nil] ==YES) {
        [resultAry writeToFile:fileName atomically:YES];
        NSLog(@"文件寫入完成");
    }
}
複製代碼
  1. Q:Cell如何實現懸浮效果?
    A:一個Controller中置入多個頁面的時候,一定要考慮清楚其之間的層級關係。LeftSlideView在最底層,可以讓用戶在點擊菜單欄按鈕時將ScrollView總體右移;MaskView是爲了處理交互,在菜單欄未彈出時透明度爲1,看上去ScrollView就像是最底層了,菜單欄彈出時,將透明度慢慢更改成0,使LeftSlideView浮現出來;ScrollView上的每一個View表現形式都相同(從此會考慮View的複用問題),下圖爲層級關係示意圖。
    層級關係.png
  1. Q:Cell如何實現懸浮效果?
    A:AFNetworking → 處理網絡請求,數據獲取;   SDWebImage → 緩存天氣圖標;   YYKit → 將JSON轉爲模型,比MJExtension更輕量級;   MJRefresh → 下拉刷新的首選,在此基礎上自定義了Gif方式的刷新。

What will we do next?

  「開發是小頭、維護是大頭」,來自一名弱雞開發的真實感覺,雖然在項目開始前已經搭建了大體的框架,想好了編碼的思路,可是越日後愈加現不少東西均可以用另外一種更好的方法實現,因此做爲一枚新手iOS,覆盤+優化+重構的總結之路還有好長要走,接下來總結一下項目裏可以優化、可以略去以及可以還存在Bug的地方吧~

未完待續

  • 2018.1.24 發現clone很慢,刪除了assets中不少無用的圖片,重整了一下項目結構。
  • 2018.3.10 適配iPhone X。
  • 2018.3.15 添加定位功能,優化太陽和風速cell的動畫效果。
相關文章
相關標籤/搜索