AppProject iOS 8を準備しようとしました。私は多くのことを読みました
[_locationManager requestWhenInUseAuthorization];
およびplistのエントリ
NSLocationWhenInUseUsageDescription
そこで、必要なすべてのコード行を変更しました。
正常に機能しますが、新しい機能を含めるためにiOS 7ベースからプロジェクトを再度コピーしました。しかし、iOS8のロケーションプライバシーを変更すると、ポップアップは表示されなくなります。
コピーするまで私のコードは機能しました。
<?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;
}
どうすれば修正できますか?
ドキュメントから
NSLocationWhenInUseUsageDescription(文字列-iOS)は、フォアグラウンドで実行中にアプリが通常ユーザーの位置にアクセスする理由を説明します。アプリが位置情報サービスを使用してユーザーの現在位置を直接追跡する場合、このキーを含めます。このキーは、位置情報サービスを使用した地域の監視や、重要な位置変更サービスを使用したユーザーの位置の監視をサポートしていません。システムは、位置情報サービスを使用する許可を要求するときにユーザーに表示される警告パネルにこのキーの値を含めます。
このキーは、CLLocationManagerクラスのrequestWhenInUseAuthorizationメソッドを使用して位置情報サービスの承認を要求する場合に必要です。 このキーを含めずにrequestWhenInUseAuthorizationメソッドを呼び出すときにキーが存在しない場合、システムはリクエストを無視します。
このキーはiOS 8.0以降でサポートされています。 Info.plistファイルにこのキーとNSLocationUsageDescriptionキーの両方が含まれている場合、システムはこのキーを使用し、NSLocationUsageDescriptionキーを無視します。
それについて読む こちら 。
このキーをinfo.plistに追加する最も簡単な方法は、info.plistを右クリックして選択することです
Open As-> Source Code
そして、最後に以下を追加しますbefore</dict></plist>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
必要であれば、<string></string>
の間にテキストを追加して、ユーザーに自分の場所を使用する理由を説明することができます。このテキストは、アラートのデフォルトテキストの下に表示されます。
Info.plistでNSLocationWhenInUseUsageDescriptionを書いてみてください
iOS 8.3、Xcode 6.3.1、ARC対応
質問は解決されましたが、CLLocationManagerに最近関与したことから追加する必要がある(2)メモがあります。
1)* .plistファイルに次のキーを入力する必要があります。
最も一般的に使用されるキーには、実際には「NSLocationUsageDescription」キーである「Privacy-Location Usage Description」などの一般的でわかりやすい名前が付いています。
「生の」キー名を確認するには、「*-Info.plist」に移動し、キーがリストされているナビゲーター領域を右クリックします。以下を参照してください。
そして、次の結果が得られます。
この記事に関連する3つのキーは次のとおりです。
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];
}
これが誰かの時間を節約することを願っています!ありがとう。
ここにちょっとした落とし穴があります。 NSLocationAlwaysUsageDescriptionまたはNSLocationWhenInUseUsageDescriptionキーをメインバンドルplistに追加していることを確認してください。テストターゲットplistの1つではありません。
メソッド内のローカル変数でCLLocationManager
をインスタンス化していたために同じ問題が発生した場合、CLLocationManager
をクラスプロパティにして解決しました。
しばらくしてここで解決策を見つけましたが、これはGoogleでの最初の結果であるため、ここに残しています。
requestWhenInUseAuthorization()は、Info.plistのNSLocationWhenInUseUsageDescriptionキーを使用するiOS 8では機能しません
Apple Watch:
WatchKitアプリではなく、iPhoneのInfo.plist
にrequestWhenInUseAuthorization
キーを配置する必要があります。
これは今二度私をかみました。