使用CoreLocation定位
CoreLocation框架(CoreLocation.framework)可用于定位設備當前的經緯度,通過該框架,應用程序可通過附近的蜂窩基站、WIFI信號或者GPS等信息計算用戶位置。
iOS?SDK提供了CLLocationManager、CLLocationManagerDelegate來處理設備的定位信息,包括獲取設備的方向以及進行方向檢測等。其中CLLocationManager是整個CoreLocation框架的核心,定位、方向檢測、區域檢測等都由該API完成;而CLLocationManagerDelegate是一個協議,實現該協議的對象可作為CLLocationManager的delegate對象,負責處理CLLocationManager的定位、方向檢測、區域檢測等相關事件。除此之外,iOS還提供了CLLocation(代表位置信息)、CLLHeading(代表設備方向)、CIRegion(代表區域)等API,這些API與CLLocationManager、CLLocationManagerDelegate共同組成了iOS的CoreLocation框架。
一、iOS的定位支持
1、GPS衛星定位
GPS是英文:Global Positioning System(全球定位系統)的簡稱;該定位系統由3部分組成,即由GPS衛星組成的空間部分、若干地面站的控制部分和普通用戶手中的接收機這3部分。
與基站、WIFI定位相比,GPS定位耗電量最大,速度最慢,但是精度最高。
2、基站定位
每個手機基站都有一個標識符,iOS設備可以搜集周圍所有收到信號的基站和它們的標識符,通過聯網發送到蘋果云端服務器,再由服務器根據這些基站的位置信息查詢并計算出當前位置,然后把該定位信息返回到手機。
3、WIFI定位
iOS設備通過無線卡搜集周圍所有的WIFI熱點,獲得它們的MAC地址,然后通過Apple的云端服務器查詢該WiFi熱點是否已經登記,如果已經登記,即可獲取該WiFi熱點的位置,最后通過對多個WiFi熱點折中計算得到當前位置并返給iOS設備。
二、獲取定位信息
iOS開發者使用CoreLocation.framework框架進行定位非常簡單,CoreLocation框架的常用API主要有如下幾個:
- (1)、CLLocationManager:定位管理器類;
- (2)、CLLocationManagerDelegate:該協議代表定位管理器的delegate協議。實現該協議的對象可負責處理CLLocationManager的定位事件;
- (3)、CLLocation:該對象代表位置。該對象包含了當前設備的經度、緯度、高度、速度、路線等信息,還包含了該定位信息的水平精確度、垂直精確度以及時間戳信息;
- (4)、CLHeading:該對象代表設備的移動方向;
- (5)、CLRegion:該對象代表一個區域。一般程序不會直接使用該類,而是使用它的兩個子類,即CLCircularRegion(圓形區域)和CLBeaconRegion(藍牙信號區);
除此之外,CoreLocation框架還涉及一個CLLocationCoordinate2D結構體變量,該幾誒夠提變量包含經度、緯度兩個值,其中CLLocation對象的coordinate屬性就是一個CLLocationCoordinate2D結構體變量。
1、獲取位置信息
使用CoreLocation.framework進行定位如下步驟:- ①、創建CLLocationManager對象,該對象負責獲取定位相關信息。并為該對象設置一些必要的屬性;
- ②、為CLLocationManager指定delegate屬性,該屬性必須是一個實現CLLocationManagerDelegate協議的對象。實現CLLocationManagerDelegate協議時刻根據需要實現協議中特定的方法;
- ③、調用CLLocationManager的startUpdatingLocation方法獲取定位信息。定位結束時,可調用stopUpdatingLocation方法結束獲取定位信息。
提示:為了在iOS應用中使用CoreLocation.framework,需要完成兩件事情:?
①、為應用添加CoreLocation.framework框架;?
②、在需要使用定位服務及相關類的源文件重使用#import < CoreLocation/CoreLocation.h >導入CoreLocation.framework的頭文件。
CoreLocationManager提供了如下類方法判斷當前設備的定位相關服務狀態:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)、 + (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)locationServicesEnabled __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回當前定位服務是否可用;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)、 + (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)deferredLocationUpdatesAvailable __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回延遲定位更新是否可用;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)、 + (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)significantLocationChangeMonitoringAvailable __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回重大位置監聽是否可用;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>)、 + (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)headingAvailable __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回該設備是否支持磁力計計算方向;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>)、 + (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)isRangingAvailable __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回藍牙信號范圍是否可用。</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>除此之外,在使用CLLocationManager開始定位之前,還可為該對象設備如下屬性:
- (1)、 @property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);設置iOS設備是否可暫停定位來節省電池的電量;如果該屬性設為『YES』,則當iOS設備不再需要定位數據時,iOS設備可以自動暫停定位;
- (2)、 @property(assign, nonatomic) CLLocationDistance distanceFilter;設置CLLocationManager的自動過濾距離。也就是說,只有當設備在水平方向的位置改變超過該數值(以米為單位)指定的距離時才會生成一次位置變化的信號;
- (3)、 @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;設置定位服務的靜度。該屬性值支持
等常量值。當然,也可直接指定一個浮點數作為定位服務允許的誤差;
- (4)、 @property(assign, nonatomic) CLActivityType activityType __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);設置定位數據的用途。該屬性支持
注意:iOS8中使用CoreLocation定位
- (1)、在使用CoreLocation需要調用如下函數?
iOS8對定位進行了一些修改,其中包括定位授權的方法,CLLocationManager增加了如下兩個方法:
①、始終允許訪問位置信息
<code class="hljs erlang has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-pp" style="box-sizing: border-box;">- <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(void)</span>requestAlwaysAuthorization __OSX_AVAILABLE_STARTING<span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">_</span>_<span class="hljs-variable" style="box-sizing: border-box;">MAC_NA</span>, <span class="hljs-variable" style="box-sizing: border-box;">_</span>_<span class="hljs-variable" style="box-sizing: border-box;">IPHONE_8_0</span>)</span>;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>②、使用應用程序期間允許方位位置數據
<code class="hljs erlang has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-pp" style="box-sizing: border-box;">- <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(void)</span>requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING<span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">_</span>_<span class="hljs-variable" style="box-sizing: border-box;">MAC_NA</span>, <span class="hljs-variable" style="box-sizing: border-box;">_</span>_<span class="hljs-variable" style="box-sizing: border-box;">IPHONE_8_0</span>)</span>; </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>- (2)、在Info.plist文件中添加如下配置:
①、NSLocationAlwaysUsageDescription
②、NSLocationWhenInUseUsageDescription
這兩個鍵的值就是授權alert的描述,實例配置如下:?
Demo如下:
CLLocation對象包含如下屬性,這些屬性包含了定位相關信息:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationDistance altitude;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性表示當前設備的海拔高度,單位是米;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationCoordinate2D coordinate;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性返回一個CLLocationCoordinate2D結構體變量,該結構體變量中包含經度、緯度信息;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationDirection course __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_2_2);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性表示當前設備前進的方向。該值為0°表示向北,90°表示向東,180°表示向南,270°表示向西;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationAccuracy horizontalAccuracy;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性表明定位信息的水平精確度。將返回的坐標作為圓心,并將水平精確度視為半徑。真正的設備位置落在此圓內的某處。此圓越小,位置就越精確;此圓越大,則位置越不精確。如果精確度為負值,則表明測量精確度失敗;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationAccuracy verticalAccuracy;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性標明定位信息的垂直精確度。也就是說,iOS設備的實際高度在該定位信息的高度加或減該屬性值的范圍內;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>, copy) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *timestamp;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性返回定位信息的返回時間;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationSpeed speed __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_2_2);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性表示返回設備的移動速度,單位是米/秒。實際上,該屬性適用于行車減速,而不太適用于步行速度。</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>2、使用iOS模擬器模擬位置
- ①、自定位置:開發者可以自行輸入位置的經度值、緯度值;
- ②、City Bicycle Ride:模擬設備攜帶者在城市中騎車移動;
- ③、City Run:模擬設備攜帶者在城市中跑步;
- ④、Freeway Drive:模擬設備攜帶者再告訴公路中駕車;
3、監控行車速度和行車距離
如果開發者希望計算平均移動速度,則只要不斷的累計設備的移動距離和移動時間,再用距離除以時間即可得到設備的平均移動速度。
例如:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pragma mark -- CLLocationManagerDelegate</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//成功獲取定位數據后將會激發該方法</span> - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)locationManager:(CLLocationManager *)manager didUpdateLocations:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSArray</span> *)locations{<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取最后一個定位數據</span>CLLocation* newLocation = [locations lastObject];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (newLocation<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.horizontalAccuracy</span> < kCLLocationAccuracyHundredMeters) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.prevLocation</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//計算本次定位數據與上次定位數據之間的時間差</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSTimeInterval</span> dTime = [newLocation<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.timestamp</span> timeIntervalSinceDate:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.prevLocation</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.timestamp</span>];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//累計行車時間</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.sumTime</span> += dTime;<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGFloat</span> distance = [newLocation distanceFromLocation:<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.prevLocation</span>];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果距離小于1米。則忽略本次數據,直接返回該方法</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (distance < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.</span>f) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.sumDistance</span> += distance;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//計算移動速度,將米/秒換算成千米/小時,需要乘以3.6</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGFloat</span> speed = distance/dTime*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.6</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//計算平均速度</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGFloat</span> avgSpeed = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.sumDistance</span>/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.sumTime</span>*<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.6</span>;<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span>* speedFeedback = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> stringWithFormat:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"當前速度為:%g千米/小時,平均速度為:%g千米/小時。合計移動:%g前面"</span>,speed,avgSpeed,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.sumDistance</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>];<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>,speedFeedback);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.prevLocation</span> = newLocation;} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>三、方向監測
擁有GPS硬件的設備可以生成設備的當前方向(couse屬性)和速度信息。iPhone設備攜帶的定位管理器可以返回一個已經計算好的course值,通過這個值我們可以獲得當前前進的方向,course值是0~360之間的浮點數,0°值表示正北方向,90°值表示正東方向,180°值表示正南方向,270°值表示正西方向,程序可以通過course值來檢測用戶位置的移動方向。
使用CLLocationManager獲取設備方向的步驟如下:
- ①、創建CLLocationManager對象,該對象負責獲取定位相關信息。并為該對象設備一些必要的屬性;
- ②、為CLLocationManager指定delegate屬性,該屬性必須是一個實現CLLocationManagerDelegate協議的對象。實現CLLocationManagerDelegate協議時刻根據需要實現協議中特定的方法。
- ③、調用CLLocationManager的starUpdatingHeading方法獲取方向信息。獲取方向結束時,可調用stopUpdatingHeading方法結束獲取方向信息。
當設備的方向改變時,iOS系統將會自動激發CLLocationManager的delegate對象的
<code class="hljs erlang has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-pp" style="box-sizing: border-box;">- <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(void)</span>locationManager:<span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">CLLocationManager</span> *)</span>managerdidUpdateHeading:<span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">CLHeading</span> *)</span>newHeading __OSX_AVAILABLE_STARTING<span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-variable" style="box-sizing: border-box;">_</span>_<span class="hljs-variable" style="box-sizing: border-box;">MAC_NA</span>,<span class="hljs-variable" style="box-sizing: border-box;">_</span>_<span class="hljs-variable" style="box-sizing: border-box;">IPHONE_3_0</span>)</span>;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>方法,而程序可通過重寫該方法來獲取設備方向;
iOS允許為檢測方向改變設置如下屬性:
- ①、CLLocationDegrees headingFilter:設置只有當設置方向的改變值超過該屬性值時才激發delegate方法;
- ②、CLDeviceOrientation headingOrientation:設置設備當前方向;
監聽方向時返回的是一個CLHeading對象,該對象包含如下屬性:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationDirection magneticHeading;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性返回設備與磁北的相對方向;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationDirection trueHeading;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性返回設備與真北的相對方向;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLLocationDirection headingAccuracy;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性返回方向值的錯誤范圍;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>, copy) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSDate</span> *timestamp;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//該屬性返回方向值的生成時間;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLHeadingComponentValue x;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取該設備在X方向上監聽得到的原始磁力值,該磁力值的強度單位是微特斯拉;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLHeadingComponentValue y;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取該設備在Y方向上監聽得到的原始磁力值,該磁力值的強度單位是微特斯拉;</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>)、 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">readonly</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>) CLHeadingComponentValue z;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取該設備在Z方向上監聽得到的原始磁力值,該磁力值的強度單位是微特斯拉;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>實例:指南針
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import <span class="hljs-title" style="box-sizing: border-box;"><CoreLocation/CoreLocation.h></span></span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ViewController</span> ()<<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">CLLocationManagerDelegate</span>></span> {CALayer* znzLayer; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span> ,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">strong</span>) CLLocationManager* locationManager; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ViewController</span></span> - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)viewDidLoad {[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span> viewDidLoad];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果磁力計可用,則開始監聽方向改變;</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ([CLLocationManager headingAvailable]) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//創建顯示方向的指南針Layer</span>znzLayer = [[CALayer alloc]init];<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSInteger</span> screenHeight = [UIScreen mainScreen]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.bounds</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.size</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.height</span>;<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSInteger</span> screenWidth = [UIScreen mainScreen]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.bounds</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.size</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.width</span>;<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSInteger</span> y = (screenHeight - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">320</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSInteger</span> x = (screenWidth - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">320</span>)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;znzLayer<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.frame</span> = CGRectMake(x, y, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">320</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">320</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//設置znzLayer顯示的照片</span>znzLayer<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.contents</span> = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span>)[[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">UIImage</span> imageNamed:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"znz.png"</span>]CGImage];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//將znzLayer添加刀系統的UIView中</span>[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.view</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.layer</span> addSublayer:znzLayer];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//創建CLLocationManager對象</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.locationManager</span> = [[CLLocationManager alloc]init];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.locationManager</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.delegate</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span>;[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.locationManager</span> startUpdatingHeading];}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果磁力計不可用告知</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"設備不支持磁力計"</span>);} } <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pragma mark -- CLLocationManagerDelegate --</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//當成功獲取設備的方向值激發該方法</span> - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)locationManager:(CLLocationManager *)managerdidUpdateHeading:(CLHeading *)newHeading{<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//以北為0°順時針增加</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%g"</span>,newHeading<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.magneticHeading</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//將設備的方向角度換算成弧度</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGFloat</span> headings = -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span>f*M_PI*newHeading<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.magneticHeading</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">180.0</span>f;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//創建不斷改變CALayer的transform屬性的屬性動畫</span>CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"transform"</span>];CATransform3D formValue = znzLayer<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.transform</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//設置動畫開始的屬性值</span>anim<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.fromValue</span> = [NSValue valueWithCATransform3D:formValue];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//繞z軸旋轉heading弧度的變換矩陣</span>CATransform3D toValue = CATransform3DMakeRotation(headings, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);anim<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.toValue</span> = [NSValue valueWithCATransform3D:toValue];anim<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.duration</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.1</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//動畫完成后是否移除</span>anim<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.removedOnCompletion</span> = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">YES</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//設置動畫結束后znzLayer的變換矩陣</span>znzLayer<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.transform</span> = toValue;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//為znzLayer添加動畫</span>[znzLayer addAnimation:anim forKey:<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>]; } - (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">BOOL</span>)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">YES</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li></ul>四、區域監測
如果希望iOS設備進入某個區域發出通知,那么這種區域監測的功被稱為臨近警告;用戶設備不斷地臨近固定點,當與該固定點的距離小于指定范圍時,系統可以觸發相應的處理。用戶設備離開指定固定點,當與該固定點的距離大于指定范圍時,系統也可以出發相應的處理。
iOS的區域監測同樣可以使用CLLocationManager來實現,監聽設備是否進入/離開某個區域的步驟如下:
- ①、創建CLLocationManager對象,該對象負責獲取定位相關信息,并為該對象設置一些必要的屬性。對于區域監測而言,CLLocationManager對象需要設置monitoredRegions屬性,該屬性值用于設置該設備監聽的多個區域;
- ②、為CLLocationManager指定delegate屬性,該屬性值必須是一個實現CLLocationManagerDelegate協議的對象。實現?
CLLocationManagerDelegate協議時刻根據需要實現協議中特定的方法; - ③、調用CLLocationManager的startMonitoringForRegion:方法進行區域監測,區域監測結束時,可調用stopMonitoringForRegion:方法結束區域監測。
區域檢測
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import <span class="hljs-title" style="box-sizing: border-box;"><CoreLocation/CoreLocation.h></span></span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ViewController</span> ()<<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">CLLocationManagerDelegate</span>></span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span> ,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">strong</span>) CLLocationManager* locationManager; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@end</span><span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@implementation</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ViewController</span></span>- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)viewDidLoad {[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span> viewDidLoad];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ([CLLocationManager locationServicesEnabled]) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.locationManager</span> = [[CLLocationManager alloc]init];<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.locationManager</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.delegate</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//定義一個CLLocationCoordinate2D作為區域的圓心</span>CLLocationCoordinate2D companyCenter;companyCenter<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.latitude</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">23.126272</span>;companyCenter<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.longitude</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">113.395568</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//使用CLCircularRegion創建一個圓形區域,半徑為500米</span>CLRegion* fkit = [[CLCircularRegion alloc]initWithCenter:companyCenter radius:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10000000000</span> identifier:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"fkit"</span>];<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//開始監聽fkit區域</span>[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.locationManager</span> startMonitoringForRegion:fkit];}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"該設備不支持定位"</span>);} } <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pragma mark -- CLLocationManagerDelegate --</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//進入指定區域以后將彈出提示框提示用戶</span> - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{[[[UIAlertView alloc]initWithTitle:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"區域監測提示"</span> message:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"您已經【進入】區域"</span> delegate:<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span> cancelButtonTitle:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"OK"</span> otherButtonTitles:<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>]show]; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//離開指定區域以后將彈出提示框提示用戶</span> - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{[[[UIAlertView alloc]initWithTitle:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"區域監測提示"</span> message:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"您已經【離開】區域"</span> delegate:<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span> cancelButtonTitle:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"OK"</span> otherButtonTitles:<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">nil</span>]show]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul> 頂總結
以上是生活随笔為你收集整理的使用CoreLocation定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Sdoi2008] Sue的小球
- 下一篇: 洛谷友链Link