Just a Computer Graphics Studio & My Life

由於我所設計的計步器需要在背景狀態持續更新地理坐標,所以必須特別去設定些屬性。Apple在APP品質的控管上表現得相當嚴謹,因為它期望手機不能太耗電,以加長手機電池的使用時間,於是審核APP時會特別去檢查是否有無謂耗電的現象,當然耗電的因素很多。而在此記錄一下要如何去開啟背景狀態持續更新地理坐標這個機制,要說一下蘋果的審委也是有不通人情的一面⋯⋯因為我明明有用到啊!其它APP能通過審核,我的怎不能?

gps background

如何設定更新地理坐標背景執行?簡單兩個步驟:

  1. 在 App 的 Info.plist 檔案的 Required device capabilities 項目底下加入 location-services 及 gps(這條可能是多餘)
  2. 同樣在該檔案的 Required background modes 底下加入 App registers for location updates

如此一來,APP進入背景狀態下,一旦收到更新訊號,就會執行這個方法:

  • -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

如何測試設定背景狀態持續更新地理坐標有無作用?我想到:

  • 可以呼叫server的API來記錄(外部)
  • 可以使用Notification來通知(內部)
  • 開啟Nike+ Running(或其它有用到背景更新GPS的APP)當作對照組
  • 開啟我們設計的APP,分別測試前景模式/背景模式(裝置待機時或程式背景時)更新地理坐標的狀況

有些APP可能會被reject,原因是沒必要在背景狀態持續更新地理坐標,但卻有上述的設定,因為APP背景執行最長只給到10分鐘,有開發者就會想利用在背景狀態持續更新地理坐標這個機制來延長背景執行時間。

細心的開發者也發現,有些APP真的使用在背景狀態持續更新地理坐標這個機制,來延長背景執行時間,可是在自己的專案中加入後送審,卻得到被reject的結果,看來審核人員有自己的喜好⋯⋯

網路上有人貼被reject的說明:

2.16

We found that your app uses a background mode but does not include functionality that requires that mode to run persistently. This behavior is not in compliance with the App Store Review Guidelines.

We noticed your app declares support for location in the UIBackgroundModes key in your Info.plist but does not include features that require persistent location.

It would be appropriate to add features that require location updates while the app is in the background or remove the “location" setting from the UIBackgroundModes key.

If you choose to add features that use the Location Background Mode, please include the following battery use disclaimer in your Application Description:

“Continued use of GPS running in the background can dramatically decrease battery life."

1、實現背景定位有兩種方式:

  1. standard location service(呼叫 CLLocationManager的startUpdatingLocation 
  2. significant-change location service(呼叫 CLLocationManager的startMonitoringSignifica ntLocationChanges 

2、兩者區別:

standard location service

  • 是標準定位的方法,想要在背景使用必須在info.plist文件中增加Required background modes屬性,並選擇App registers for location updates這個值。
  • 在背景運行時可能會因為資源的問題被系統暫停(suspend)終止(terminate),但一旦有更新會被喚起,然而當更新時系統仍然處於資源緊張狀態,則委託會延遲呼叫。如果對於即時性要求高的功能可能不適合,因為很難控制用戶設備性能狀況。
  • 如果被使用者手動關閉此功能,就不會再被喚醒。
  • 定位是基於GPS/基地台/WiFi這三種方式,實際使用哪一種端視CoreLocation框架它自有的規則。

significant-change location service

  • 是使用基地台定位,所以設備一定要有電話模塊,在plist中可以設置屬性來限制可被下載安裝的設備。
  • 不管是在背景還是使用者手動關閉都會被喚醒呼叫委託,只有三種方法可以阻止它的更新:
    1. 使用者關閉定位服務、
    2. 使用者關閉對該App的定位服務、
    3. 設備處於飛行模式或者無法開啟必要的硬體(猜測是定位模塊的硬體)。
  • 什麼時候更新呢?是在更換基地台的時候更新。所以更新頻率與基地台密度有關。市區更新頻率較郊區高。所以說沒有更新是因為還在同一組基地台範圍內。

前者較後者耗電且精度高。

3、兩者共性:

  • 兩者都更新位置信息時都回調相同的委託方法:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

4、總結:

兩種方式各有利弊,根據使用場景而決定,前景運行的App通常要求準確即時的定位,並且運行時間有限,考慮用第一種標準定位,比如導航應用。如果移動速度快(距離變化明顯),長時間定位(監控記錄),可以考慮後者,比如叫車應用。

參考:

廣告

Comments on: "[iOS] 背景狀態持續更新地理坐標" (1)

  1. 不好意思 謝謝您的教學讓我受益良多 我想在這邊請教您幾個問題
    1.startmonitoringsignificantlocationchanges 和 startupdatinglocation是否能同時呼叫, 或者一次只能用一個?
    2.您文章有提到似乎如果user在背景(多功列)把app移除, startupdatinglocation不會被執行,而startmonitoringsignificantlocationchanges會被執行,所以說是不是建議說如果user在前景就用startupdatinglocation如果進入背景就使用startmonitoringsignificantlocationchanges?

    謝謝

    按讚數

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: