2014-07-20 59 views
49

我試圖讓我的AppProject iOS 8準備就緒。我讀了很多關於iOS 8 requestWhenInUseAuthorization no Popup

[_locationManager requestWhenInUseAuthorization]; 

和plist中

NSLocationWhenInUseUsageDescription 

所以我改變了所有必要的代碼行的條目。

它工作正常,但現在我已經從我的iOS 7基地再次複製我的項目,以包括新功能。但是,當我對iOS8位置隱私進行更改時,Popup不再顯示。

我的代碼工作,直到我複製。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
     <key>NSLocationWhenInUseUsageDescription</key> 
     <string>tolle sache </string> 
     <key>CFBundleDevelopmentRegion</key> 
     <string>en</string> 
     <key>CFBundleExecutable</key> 
     <string>${EXECUTABLE_NAME}</string> 
     <key>CFBundleIdentifier</key> 
     <string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string> 
     <key>CFBundleInfoDictionaryVersion</key> 
     <string>6.0</string> 
     <key>CFBundlePackageType</key> 
     <string>BNDL</string> 
     <key>CFBundleShortVersionString</key> 
     <string>1.0</string> 
     <key>CFBundleSignature</key> 
     <string>????</string> 
     <key>CFBundleVersion</key> 
     <string>1</string> 
    </dict> 
</plist> 

,這裏是我的電話

- (instancetype)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 

     _UserLocation = [[CLLocation alloc]init]; 
     _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager 
     _locationManager.delegate = self; 
     _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy 
     [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST 
     [_locationManager startUpdatingLocation]; //requesting location updates 

     NSLog(@"passed initwithcode"); 

    } 
    return self; 
} 

我該如何解決這個問題?

回答

18

嘗試在Info.plist中

+32

這是我的主要問題。添加說明後,對話框彈出並立即消失。修復需要兩個更改:確保在viewWillAppear:或更高版本中請求授權,並確保存儲對CLLocationManager的引用。如果你不這樣做,它會被釋放,對話框消失。 – robotspacer

+1

甚至可以將其添加到viewDidLoad中,但它對於保持對CLLocationManager的引用很重要。 – OutOnAWeekend

+0

所以(只是爲了完整性),爲了保持引用,我使用了一個強修飾符的屬性:'@property(強,非原子)CLLocationManager * locationManager;'神聖的貓,@robotspacer'' –

101

寫NSLocationWhenInUseUsageDescription從文檔

NSLocationWhenInUseUsageDescription(字符串 - iOS設備)描述了 之所以應用正常運行的同時在前臺 訪問用戶的位置。當您的應用使用位置 服務直接跟蹤用戶的當前位置時,請添加此密鑰。 不支持使用位置服務監控區域,或使用重要的位置更改服務監控用戶的位置 。 系統在請求使用位置服務的權限時,在警報面板中包含此密鑰的值,該值顯示爲 。

當您使用CLLocationManager類的requestWhenInUseAuthorization 方法請求授權 位置服務時,此項是必需的。 如果在調用 requestWhenInUseAuthorization方法而不包含此密鑰時,密鑰不存在,則 系統會忽略您的請求。

此密鑰在iOS 8.0及更高版本中受支持。如果Info.plist文件 包含此密鑰和NSLocationUsageDescription密鑰,則系統將使用此密鑰並忽略NSLocationUsageDescription密鑰。

閱讀全文here

我發現將此密鑰添加到您的info.plist最簡單的方法是右鍵單擊您的信息。plist中,選擇

開放AS->源代碼

,然後前</dict></plist>

<key>NSLocationWhenInUseUsageDescription</key> 
<string></string> 

添加到底以下。如果你願意,你可以添加之間的文本<string></string>,它描述了用戶爲什麼要使用他/她的位置。此文本將顯示在警報的默認文本下。

+0

適用於iOS 8的完美解決方案! – coolcool1994

+0

將關鍵字添加到Info.plist中,訣竅,謝謝! – Kennysmoothx

+1

@Groot先生,我仍然無法打開啓用位置的警報 –

10

的iOS 8.3時,Xcode 6.3.1,ARC啓用

的問題已經解決了,但我(2)指出,從我最近參與與CLLocationManager補充。

1)必須具有下列鍵進入你*的.plist文件:

enter image description here

最常用的按鍵具有通用更具描述性的名稱,如「隱私權 - 位置用途說明」,其中真的是「NSLocationUsageDescription」鍵。

看到「原始」鍵的名稱去在導航區「* -Info.plist」,右鍵點擊其中的鍵列,見下圖:

enter image description here

,你會得到結果如下:

enter image description here

那些與本文相關的三個按鍵分別是:

enter image description here

2)確保在嘗試請求授權或更新位置之前分配並初始化您的CLLocationManager實現。

的* .h文件:

@interface SomeController : UIViewController <CLLocationManagerDelegate> 

@property (strong, nonatomic) CLLocationManager *locationManager; 

* .m文件:

- (IBAction)locationButton:(UIButton *)sender 
{ 
    if (self.locationManager == nil) 
    { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     self.locationManager.delegate = self; 
    } 
    else 
    { 
     nil; 
    } 

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
    { 
     [self.locationManager requestWhenInUseAuthorization]; 
    } 
    else 
    { 
     nil; 
    } 

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.locationManager startUpdatingLocation]; 
} 

希望這樣可以節省時間的人!謝謝。

+0

請留下空白... else語句,這是我的編程風格,無論是對還是錯,都有助於我將事情組織在腦海中。謝謝。 –

0

修飾蘋果手錶:

您需要將requestWhenInUseAuthorization鑰匙放入iPhone的Info.plist,而不是WatchKit應用程序的鑰匙。

這已經咬了我兩次了。

3

這是一個小問題。確保您將NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription鍵添加到主包plist,而不是您的測試目標plists之一!