iOS 11 SDKを使用してアプリを再構築し、blue banner
現在常に表示されているアプリを削除しようとしました。「素晴らしい、うまくいった」と思ったのですが、位置情報サービスがまったく機能していないことに気づきました。
iOS 10で動作するために使用されるアプリケーション-誰かが何か聞いたことがありますか?
iOS 11 SDKを使用してアプリを再構築し、blue banner
現在常に表示されているアプリを削除しようとしました。「素晴らしい、うまくいった」と思ったのですが、位置情報サービスがまったく機能していないことに気づきました。
iOS 10で動作するために使用されるアプリケーション-誰かが何か聞いたことがありますか?
回答:
アップルがさらに別のプライバシー機能を追加したように見えます。ユーザーは私たちをオーバーライドしてrequestAlwaysAuthorization
ダウングレードできるようになりましたrequestWhenInUseAuthorization
-つまり、開発者として、両方の説明をで提供する必要がありますInfo.plist
彼らが新しいキーを追加したことがわかりました NSLocationAlwaysAndWhenInUseUsageDescription
/*
* Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the
* NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription
* keys must be specified in your Info.plist; otherwise, this method will do
* nothing, as your app will be assumed not to support Always authorization.
*/
ただし、この新しいキーを使用すると、位置情報サービスはまだ機能しませんでした。さらに検索すると、このgemがすべての追加のデバッグ情報と混在していることがわかりました。
このアプリは、使用法の説明なしでプライバシーに配慮したデータにアクセスしようとしました。アプリのInfo.plistには、NSLocationAlwaysAndWhenInUseUsageDescriptionキーとNSLocationWhenInUseUsageDescriptionキーの両方が含まれている必要があり、文字列値はアプリがこのデータをどのように使用するかをユーザーに説明します。
これは、更新されたCLLocationManager.h
ファイルで見つけたコメントと直接矛盾します。だから私はレーダーを作成しました。
デバッグコンソールIEのアドバイスに従えば、朗報です。新しいキーNSLocationAlwaysAndWhenInUseUsageDescription
と古いキーの1つを追加するとNSLocationWhenInUseUsageDescription
、ロケーションサービスが再び機能し始めます。
NSLocationAlwaysUsageDescription
て、必要な権限であるInfo.plistに追加しました。しかし、コンソールに上記のメッセージが表示され、NSLocationWhenInUseUsageDescription
同様に追加する必要があるというメッセージが表示されます。
startUpdatingLocation
かrequestLocation
?
startUpdatingLocation
これを修正する手順を追加するだけです。
それを行う2つの方法:
A)簡単な方法:Info.plistファイルを選択し、プロパティを追加します。プロパティはLOCATIONではなくPRIVCYで始まることに注意してください。したがって、これらの変数の正確な名前は「Privacy-Location ...」などで始まります。ここにそれぞれ、警告でユーザーがこれをどのように見るかを説明します。
B)難しい/面白い/プログラム的な方法(私はこの方法がもっと好きです):
アプリのInfo.plistを右クリックし、[ソースコードを表示]を選択すると、すべてがXMLで表示されます。
他の......形式に従い、次のようにこれらのプロパティを追加します。
<key>NSLocationAlwaysUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>
保存してからinfo.plistファイルを右クリックし、[プロパティリスト]を選択すると、ファイルがデフォルトのビューに戻ります。
編集:
別のメンバーがコードを要求しました、ここにあります:
1).Hファイルに以下を追加します。
@property (strong, nonatomic) CLLocationManager *LocationManager;
2).Mファイルで、ViewDidAppear()関数の下に追加します。
_LocationManager = [[CLLocationManager alloc] init];
[_LocationManager setDelegate:self];
_LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
_LocationManager.pausesLocationUpdatesAutomatically = NO;
[_LocationManager requestAlwaysAuthorization];
_LocationManager.headingFilter = 5;
_LocationManager.distanceFilter = 0;
[_LocationManager startUpdatingLocation];
[_LocationManager startUpdatingHeading];
これは私にとってはうまく機能しますが、コードがあなたにとってもうまくいくことを願っています。
よろしく
ハイダー
viewwillAppear
し、のデリゲートを削除していviewwilldisapper
ます。設定に移動して、すでに選択されているを選択した場合Allow Always
。アップデートを取得するのは1回だけで、それ以上は取得しません。これを修正する方法を考えてみてください。前もって感謝します!!
iOS11で動作していると、Info.plistには少なくともInfo.plistのNSLocationAlwaysAndWhenInUseUsageDescriptionが必要であることがわかりました。
あなたのアプリがある奇妙な十分な多言語のあなたの文字列のローカライズされたバージョンが必要なすべての3つのキーが他にこの記事で言及requestAlwaysAuthorization()
し、locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
静かに失敗します。
例としてドイツ語の翻訳を示すショット:
これにより、つまずいたときに時間を節約できることを願っています。
Swift4.0.3での作業
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
「AlwaysAuthorization」が必要なアプリで同じ問題が発生し、次の手順で解決しました。
1. キーを追加し NSLocationWhenInUseUsageDescription
ますInfo.plist
2. 追加 NSLocationAlwaysAndWhenInUseUsageDescription
しますInfo.plist
3. 追加 NSLocationAlwaysUsageDescription
するInfo.plist
(サポートへ<iOS版11)
4. 前に電話してください )requestWhenInUseAuthorization()
requestAlwaysAuthorization(
requestWhenInUseAuthorization()の前にrequestAlwaysAuthorization()を実行することはできません。その権限レベルにエスカレーションする必要があります。これらの変更を行うと、場所の更新が再び正しく機能し始めました。
詳細については、こちらをご覧ください。
申し訳ありませんよりも安全です..iOS11の場合 :以下を追加すれば問題ありません。
<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
上でテストされたiOSの12.2とスウィフト5
ステップ1.plistファイルに次のプライバシー権限を追加する必要があります
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>
ステップ2.現在の場所を取得するための次の迅速なコードがあることを確認してください
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
// MARK: Variables declearations
@IBOutlet weak var mapView: MKMapView!
var locationManager: CLLocationManager!
// MARK: View Controller life cycle methods
override func viewDidLoad() {
super.viewDidLoad()
//TODO: Make user you must add following three privacy permissions in plist
//NSLocationWhenInUseUsageDescription
//NSLocationAlwaysAndWhenInUseUsageDescription
//NSLocationAlwaysUsageDescription
getCurrentLocation()
}
func getCurrentLocation()
{
if (CLLocationManager.locationServicesEnabled())
{
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
}
// MARK: Location Manager Delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let locationsObj = locations.last! as CLLocation
print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
showOnMap(location: locationsObj)
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("Get Location failed")
}
func showOnMap(location: CLLocation )
{
let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
mapView.setRegion(region, animated: true)
}
}
Swift:3 同じ問題に直面しました。私は解決策を見つけるのに完全にめちゃくちゃでした。これが私が問題を修正した方法です。
ステップ-1:プロジェクトファイル>機能>バックグラウンドモード>ロケーションアップデートを選択
ステップ2: NSLocationWhenInUseUsageDescription、NSLocationAlwaysAndWhenInUseUsageDescriptionキーをInfo.plistに追加します
ステップ-3:
manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true