WWDC21) Location Button


個人情報の保護はアップル製品の核心機能の一つである.また,ユーザが個人情報を心配するのは驚くべきことではない.
開発者として,不適切なタイミングや不明確なコンテキストでユーザに機密データの提供を要求することはよくない.
iOS 15では、アップルがユーザーに位置決めを要求する新しい位置決めボタンを紹介した.
既存のサービスでは、アップルが新しいユーザーインタフェースを導入した問題は何ですか?

The Problems


location buttonはone-timeユーザーの場所をよりよく提供します.ユーザーの位置を尋ねるのはアプリケーションの核心機能ではありませんが、現在のユーザーの位置、近隣の店の表示、メールアプリを通じて友人に現在の位置を送信するなどの付加機能を提供するアプリケーションに適しています.
しかしながら、現在実施されている次の分野では、従来の方法で使い捨て位置を要求することは問題である.

One-Shot


一般に、位置情報を要求するライセンスは、どのような形式を採用しても、ユーザがそれを受け入れる/拒否する機会にすぎない.
ユーザーが「許可しない」をクリックすると、後でユーザーの場所を要求することはできません.再度許可できる方法は、設定に入り、個別に指定することです.

この場合、ユーザーは、上記の許可された場所のポップアップメッセージを1回表示するだけで、アプリケーションが削除されても変更しにくくなります.

Allow Once


位置を許可するオプションでは、AllowOnceは一時的で最小限の制約条件のように見えますが、実際には最悪のオプションです.このオプションを選択すると、次回ユーザーの場所を要求すると、[権限の要求]ダイアログボックスが再度表示されます.
画面表示後にユーザ位置を入力すると、単一の位置が必要になるたびに画像処理が必要となり、ユーザは最終的に不便を感じる.
iOS 13では、アップルが「1回許可」オプションを提供しています.「許可」という言葉が含まれていますが、実際には後で決定した選択肢と区別されず、使い捨てユーザーの場所を要求することはできません.

Location Button


これらの問題を解決するために、使い捨てユーザの位置を尋ねる新しい方法が必要である.

Key Difference


location buttonの設計方法は,サービスを利用する長期ユーザに位置を与えることである.そのため、使い捨てユーザーの位置を尋ねるのはカジュアルで、想像以上に制限が多い.

New Dialog



ユーザーはlocationボタンをクリックすると、上の新しい画面が表示されます.ユーザーの場所を許可する2つのオプションが用意されています.

No need to put privacy description


When you share your location with this app, a blue location indicator will appear in the status bar.
アップル社は、 Info.plistからNSLocationWhenInUseUsageDescriptionに設定する必要はありません.

You can ask it again and again


オプションでご覧のように、ユーザーに位置情報の使用を許可するかどうかを尋ねる必要はありません.このサービスを後で使用すると、同じポップアップウィンドウも表示されるので、再設定できます.

Conclusion


以下に整理できます.
Location Buttonは、アプリケーションの場所へのアクセス権を付与できるインタフェースです.
既存の方法では、位置情報を取得するには完全な位置権限が必要ですが、Location Buttonを使用すると、位置権限が必要なときに簡単に位置権限を要求できます.
SWIFTUIはLocationButtonを提供し、UIKEtはCoreLocationButtonを提供し、CoreLocationUIフレームワークに含まれる.

Example Code



従来の方法では、上記のコードに示すように、位置情報を呼び出すためにrequestWhenInUseAuthorization()を記述すべきである.
ただし、このコードをCLLocationButtonを使用するように変更した場合は、次のように変更できます.

位置情報、フレームワークの指定、アイコン、ラベルなどの属性を使用して、UIを別途要求する必要はありません.
ロケーション情報が重要なサービスである場合、ロケーション権限が拒否されると大きなリスクに直面する可能性があります.LocationButtonを使えば、開発者の立場からすれば、位置権限を拒否されることが少なくなるので良いのですが、ユーザーの立場からすれば、位置情報が必要な瞬間さえあれば、位置情報の提供を要求されることになります.

Tutorial


MapKitとともに使用し、Locationボタンをクリックしたときに位置情報を許可する場合は、地図を自分の位置に表示する例を作成します.
  • 地図を生成します.
  • locationボタンを生成します.
  • ボタンを押すと、ユーザの位置情報が受信され、地図に接続されて表示される.
  • この3つのステップで例を完了できます.

    MapKit


    まずimport MapKitをします.
    view.addSubview(mapView)
    mapView.frame = CGRect(x: 20, y: 50, width: view.frame.width.self-40, height: view.frame.height.self-220) 
    viewDidLoad()で作成し、ビューに上図します.

    Location Button


    ロケーション情報は、Location ButtonのUIを使用して受信する必要があります.
    import CoreLocationUI
    import CoreLocation
    作成します.
    override func viewDidLoad() {
            super.viewDidLoad()
            
            ...
            
            manager.delegate = self
            
            createButton()
        }
        
    private func createButton() {
            let button = CLLocationButton(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
            button.label = .currentLocation
            button.icon = .arrowOutline
            button.cornerRadius = 12
            button.center = CGPoint(x: view.center.x, y: view.frame.height-70)
            button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)
            view.addSubview(button)
        }
        
    @objc
    func didTapButton() {
            manager.startUpdatingLocation()
        }

    Location Button -> MapKit


    delegateを宣言して位置情報管理部を担当し、locationボタンの構成を指定してボタンを作成し、ボタンがマークされたときにユーザーの位置を受信するコードを記述します.
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            guard let location = locations.first else { return }
            self.manager.stopUpdatingLocation()
            
            mapView.setRegion(MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
    }
    また、位置情報の更新が完了した場合、この情報を以前にビューにアップロードした地図に関連付けて、地図に表示することができます.
    参考資料
    A better way to ask for a one-time user's location with the Location Button