![](/img/trans.png)
[英]UILocalNotification from previous install in ios9 (with CLLocationManager)
[英]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];
好吧,我還在使用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.