簡體   English   中英

iOS9中的CLLocationManager中的allowsBackgroundLocationUpdates

[英]allowsBackgroundLocationUpdates in CLLocationManager in iOS9

我在我的應用程序中使用CoreLocation框架在Xcode7(預發布)中,我注意到在CLLocationManager類中有一個名為allowsBackgroundLocationUpdates的新添加屬性。

此屬性與“功能”選項卡的“背景模式”中的位置更新之間的關系是什么。 它的默認值是什么,它是否會影響在iOS9中運行的應用程序?

這個新屬性在WWDC會話“核心位置有什么新內容”中進行了解釋

如果您鏈接到iOS 9,則默認值為NO

如果您的應用在后台使用位置(不顯示藍色狀態欄),則除了在Info.plist中設置背景模式功能外,還必須將allowsBackgroundLocationUpdates設置為YES 否則,位置更新僅在前台傳遞。 優點是您現在可以讓位置管理器具有后台位置更新,而其他位置管理器只能在同一個應用程序中進行前景位置更新。 您還可以將值重置為NO以更改行為。

文檔很清楚:

默認情況下,對於鏈接到iOS 9.0或更高版本的應用程序,這是NO,無論最低部署目標如何。

將UIBackgroundModes設置為在Info.plist中包含“location”時,您還必須在運行時將此屬性設置為YES,以便在后台繼續調用-startUpdatingLocation。

當UIBackgroundModes不包含“location”時將此屬性設置為YES是致命錯誤。

將此屬性重置為NO等同於從UIBackgroundModes值中省略“location”。 只要應用程序正在運行(即未暫停),並且具有足夠的授權(即,它具有WhenInUse授權並且正在使用,或者它具有始終授權),仍然允許訪問位置。 但是,該應用程序仍將遵循通常的任務暫停規則。

有關可能的授權值的更多詳細信息,請參閱-requestWhenInUseAuthorization和-requestAlwaysAuthorization。

如果您在Xcode7(預發布)中的應用程序中使用CoreLocation框架,您可能會注意到在CLLocationManager類中有一個名為allowsBackgroundLocationUpdates的新添加屬性。

這個新屬性在WWDC會話“核心位置有什么新內容”中進行了解釋 在此輸入圖像描述

如果您鏈接到iOS 9,則默認值為NO

如果您的應用在后台使用位置(不顯示藍色狀態欄),則除了在Info.plist中設置背景模式功能外,還必須將allowsBackgroundLocationUpdates設置為YES 否則,位置更新僅在前台傳遞。 優點是您現在可以讓位置管理器具有后台位置更新,而其他位置管理器只能在同一個應用程序中進行前景位置更新。 您還可以將值重置為NO以更改行為。

文檔很清楚:

默認情況下,對於鏈接到iOS 9.0或更高版本的應用程序,這是NO,無論最低部署目標如何。

將UIBackgroundModes設置為在Info.plist中包含“location”時,您還必須在運行時將此屬性設置為YES,以便在后台繼續調用-startUpdatingLocation。

當UIBackgroundModes不包含“location”時將此屬性設置為YES是致命錯誤。

將此屬性重置為NO等同於從UIBackgroundModes值中省略“location”。 只要應用程序正在運行(即未暫停),並且具有足夠的授權(即,它具有WhenInUse授權並且正在使用,或者它具有始終授權),仍然允許訪問位置。 但是,該應用程序仍將遵循通常的任務暫停規則。

有關可能的授權值的更多詳細信息,請參閱-requestWhenInUseAuthorization和-requestAlwaysAuthorization。

設置Info.plist如: 在此輸入圖像描述

Info.plist配置的語法如下所示:

<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

或者拉出應用目標的“功能”標簽。

在此輸入圖像描述

使用如下:

_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
    [_locationManager requestAlwaysAuthorization];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];

在這里寫了一個演示(Demo2)

好吧,我還在使用xCode 6,因為7 beta總是與模擬器崩潰,我有這個問題,雖然我甚至沒有鏈接iOS9! 我無法設置此屬性,因為它在iOS8中不存在! 哦,蘋果,折磨什么時候結束?!

通過執行此后期綁定調用,我將其更改為此xCode6兼容版本:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {

            BOOL yes = YES;

            NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )];
            NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
            [invocation setTarget: locationManager];
            [invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ];
            [invocation setArgument: &yes atIndex: 2];
            [invocation invoke];
        }

確認在iOS8上工作(沒有做任何事情)和iOS9 beta 6(正確調用方法)。

我在iOS 9.0.x的后台模式上遇到了相同的位置服務,我通過添加以下代碼按照本文中的建議修復了它

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

但它在iOS 9.1中不起作用有沒有人有同樣的問題??? 如果是這樣,請幫助。 謝謝

{
NSArray* backgroundModes  = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"];

     if(backgroundModes && [backgroundModes containsObject:@"location"]) {
         if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
             // We now have iOS9 and the right capabilities to set this:
             [manager setAllowsBackgroundLocationUpdates:YES];
         }
     }
}

以下是從iOS 8更新到iOS 9的許多方法的摘要

應針對您使用的每個框架搜索許多API和代碼。 因此,在General中搜索框架,然后找到這些方法來更新折舊方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM