web-dev-qa-db-ja.com

iOS 8 requestWhenInUseAuthorization no Popup

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;
}

どうすれば修正できますか?

49
Marcus

ドキュメントから

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>の間にテキストを追加して、ユーザーに自分の場所を使用する理由を説明することができます。このテキストは、アラートのデフォルトテキストの下に表示されます。

101
Groot

Info.plistでNSLocationWhenInUseUsageDescriptionを書いてみてください

19
Masatsugu Hosoi

iOS 8.3、Xcode 6.3.1、ARC対応

質問は解決されましたが、CLLocationManagerに最近関与したことから追加する必要がある(2)メモがあります。

1)* .plistファイルに次のキーを入力する必要があります。

enter image description here

最も一般的に使用されるキーには、実際には「NSLocationUsageDescription」キーである「Privacy-Location Usage Description」などの一般的でわかりやすい名前が付いています。

「生の」キー名を確認するには、「*-Info.plist」に移動し、キーがリストされているナビゲーター領域を右クリックします。以下を参照してください。

enter image description here

そして、次の結果が得られます。

enter image description here

この記事に関連する3つのキーは次のとおりです。

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];
}

これが誰かの時間を節約することを願っています!ありがとう。

10
serge-k

ここにちょっとした落とし穴があります。 NSLocationAlwaysUsageDescriptionまたはNSLocationWhenInUseUsageDescriptionキーをメインバンドルplistに追加していることを確認してください。テストターゲットplistの1つではありません。

3
smileBot

メソッド内のローカル変数でCLLocationManagerをインスタンス化していたために同じ問題が発生した場合、CLLocationManagerをクラスプロパティにして解決しました。
しばらくしてここで解決策を見つけましたが、これはGoogleでの最初の結果であるため、ここに残しています。

requestWhenInUseAuthorization()は、Info.plistのNSLocationWhenInUseUsageDescriptionキーを使用するiOS 8では機能しません

1
Mark E

Apple Watch:

WatchKitアプリではなく、iPhoneのInfo.plistrequestWhenInUseAuthorizationキーを配置する必要があります。

これは今二度私をかみました。

0
HenryRootTwo