- 最近開發了一個行車服務項目,iOS客戶端採用
Objective-C
編寫, 後端採用PHP
搭建,部署在阿里雲
,操做系統爲Linux CentOS 7.3
,數據庫MySQL
,服務器爲Apache
,是比較基礎的LAMP
組合。- iOS端代碼部分我會講述總體的開發思路,一些有意思的功能點也會詳細說說。
- 後端代碼比較簡單,想要本身嘗試開發
API
的iOS開發者能夠參考。- 發這篇文的主要目的是對最近的開發作一個總體回顧,同時但願對有須要的同窗提供到一些幫助,有不少不盡合理和完善的地方,也請求各位同窗不吝賜教,感謝你們!
首先上總體的效果圖:
ios
在POI檢索結果頁面,地圖控件顯示爲空白,是由於模擬器運行的緣由,真機效果良好git
Star
以示鼓勵,感謝~這裏是後端代碼簡析的文章後端代碼簡析github
「Tips」:對於發現代碼運行報錯的同窗,項目使用CocoaPods
進行第三方庫的集成。以前爲了方便我對Pods
文件夾作了ignore
操做。剛剛已經更新,你們能夠直接打開後綴爲xcworkspace
的項目文件運行。不過這樣Github
上面的項目體積會比較大。web
簡單介紹:項目UI總體儘可能保持了餓了麼
的藍色風格,其中某些頁面參考了高德地圖
、餓了麼
、Max+
的設計風格。sql
餓了麼
UI的定位、天氣模塊高德地圖API
開發的POI
檢索,同時界面也加入了一些和高德地圖
app相似的特性Max+
app的資訊模塊高德地圖API
和風天氣API
本身搭建的後端相關接口
AFNetworking 3.0
SDWebImage
MBProgressHUD
Icon
大量使用阿里巴巴的iconfont
圖標,極力推薦高德地圖API
的相關使用。包括地圖
、POI檢索
、導航
等功能。GCD
的使用示例。包括耗時操做的後臺執行、UI更新相關操做等。NSUserDefaults
維護帳戶信息。這裏是爲使用方便,僅供參考。Core Animation
的使用。因爲TableView
加載時採用HUD
的用戶體驗不是很友善,我本身封裝了Loading
頁面。Tabbar VC
做爲rootController
,若是此時沒有帳戶信息,則採用模態彈出方式彈出登陸頁面。 TextField
的點擊空白和Return
回收鍵盤以及呼出鍵盤時控件移位防止遮擋的代碼能夠注意一下。Tabbar VC
初始化時,第一個tab欄的VC會進行定位操做,若是此時爲已登陸狀態,則直接調用發送歷史足跡的接口。在未登陸狀態下,用戶點擊登陸按鈕,登陸成功時,會向第一個tab欄VC發送一個調用歷史足跡接口的通知
。View
,UI參考了餓了麼
。地理位置和通知列表按鈕的點擊事件採用代理
交由當前VC實現。北京市海淀區北京理工大學
。從新定位
按鈕的點擊事件使用代理交由主界面VC實現,避免在此界面再次實例化定位相關的對象。UICollectionView
展現。各個Cell
的Icon
使用阿里巴巴的iconfont
圖標,將以往的圖片素材轉爲字體來使用,對於素材整理、高清保真、代碼方便來講有極大的效率提高。在Web
、移動客戶端
開發領域已經很是普遍地在使用。高德地圖
的附近
界面UI以及部分特性。導航欄隱去,最上面是一個地圖控件,以及透明的返回按鈕。下面是POI
信息的tableview
。在tableview
向下滑動時,地圖隱去,tableview
的frame
上移,導航欄出現。向上滑動到頂部時,tableview
下移,地圖出現,導航欄隱去。tableview
滑動時特性的實現:經過scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
代理方法,判斷滑動的方向,從而對tableview
的frame
以及導航欄等元素進行操做。
代碼以下:數據庫
//判斷滑動手勢方向,決定tableview的frame改變
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];
if (translation.y>0) {
NSLog(@"ssssss");
{
NSIndexPath *dic = self.poiList.indexPathsForVisibleRows.firstObject;
if (self.poiList.frame.origin.y == 64 && dic.row == 0){
[UIView animateWithDuration:0.2 animations:^{
NSLog(@"visible:::%@",dic);
showMap = YES;
self.navigationController.navigationBar.hidden = YES;
self.poiList.frame = listFrame;
}];
}
}
}else if(translation.y<0){
NSLog(@"tttt");
if (self.poiList.frame.origin.y == 300){
[UIView animateWithDuration:0.2 animations:^{
showMap = NO;
self.navigationController.navigationBar.hidden = NO;
self.poiList.frame = listFullFrame;
}];
}
}
}複製代碼
在界面加載時,使用了本身封裝的loading
頁面:
後端
tableview
的reload
方法,然後將loading
頁移除。loading
頁使用basicAnimation
製做了簡單的呼吸動畫,keyPath
爲logo圖標的透明度。第一個cell的POI
地點默承認預定,顯示預定圖標,點擊進入預定界面。
api
http
協議進行通訊。因此個人實現方式是後端收到預定請求後,直接採用隨機數方式模擬店家的接受或拒絕。必定時間後,客戶端調用結果查詢的接口來獲取預定結果。預定中
,鐘錶icon開始轉動,而且按鈕變爲不可點擊狀態。與此同時,使用performSelector
方式延時調用獲取預定結果的接口。在此網絡請求的成功回調中,向主界面發送通知,然後主界面通知按鈕右側顯示通知數量的紅色圖標。如圖。UserDefaults
中的,不一樣設備之間沒法同步。其中涉及到一些userDefaults
中數據要求的知識,具體能夠參考代碼。這裏是由於需求是臨時想出,若是常規實現方式須要開發獲取通知數據
的接口。我爲了節省開發時間因此採用這種方式來模擬實現了。這個地方在之後能夠完善~Max+
iOS客戶端的資訊功能。第一個Cell以全圖爲背景,能夠用來突出顯示重點內容。webView
。一樣使用了本身封裝的Loading
圖。移除時機就簡單放在了webView
的finishLoad
回調方法中。其實對於Webview
真正加載完成時機的判斷還有不少能夠聊的東西,往後補充。section
的tableview
實現。在頁面的viewWillAppear
方法中,須要調用獲取緩存數據大小的方法,單獨更新清除緩存
cell的內容。由於在每次切換tab的過程當中,緩存數據都有可能發生變化。tableview
實現。在信息編輯頁面,仿照了微信
信息更改頁面的邏輯。頁面出現時,當即彈出鍵盤。關於使textField
在頁面加載完成時即成爲第一響應者的問題,須要重寫- (BOOL)becomeFirstResponder
方法。代碼以下:- (BOOL)becomeFirstResponder
{
[super becomeFirstResponder];
return [self.textInput becomeFirstResponder];
}複製代碼
loading
頁面。若是數據條目爲空,則不顯示tableview
,提示暫無相關信息
,如圖。SDImageCache
的相關方法。咱們還能夠清除本app的緩存數據所在目錄來達到真正清除緩存的目的,往後討論。B
,咱們須要除以1024
1次、2次來判斷當前數據是在KB
級別仍是MB
級別,並做正確顯示。userDefaults
中相關數據,而後模態彈出登陸頁面。selected index
進行設置。代碼以下:DELoginViewController *loginVC = [[DELoginViewController alloc] init];
[self presentViewController:loginVC animated:YES completion:^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗時的操做
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
AppDelegate * appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
appDelegate.tabbarVC.selectedIndex = 0;
});
});
}];複製代碼
代碼的主要開發思路基本講述完,具體的細節你們能夠和我繼續交流~項目中有許多不盡合理的實現方式,小部分是考慮到時間因素。歡迎你們進行討論、指教。
有相關的問題,歡迎你們進行留言。項目中使用的自有接口,部署在個人阿里雲服務器中,可外網訪問。請求你們合理使用。緩存
後端項目數據庫相關的sql
代碼,我已上傳至後端項目。bash
若是你們有興趣,之後我能夠再講述一下server
端的代碼,固然,後端我也是初學者的水平,僅供想要入門的同窗參考。
個人我的博客網站地址: Halo的我的博客 ,歡迎你們訪問。
代碼已開源,地址在文章首部。若是點一下star
,我真的會很是感謝~
halo