क्या हमेशा अनंतिम बनाता है हमेशा प्राधिकरण अनंतिम?

Aug 16 2020

Apple के अनुसार, यदि आप अपने कोर लोकेशन ऐप को हमेशा ऑथोराइज़ेशन प्राप्त करने के लिए कहते हैं जब प्राधिकरण "निर्धारित नहीं" होता है, तो उपयोगकर्ता व्हेन इन यूज़ ऑथराइज़ेशन के लिए डायलॉग देखता है लेकिन वास्तव में आपके ऐप को ऑलवेज ऑथराइज़ेशन - प्रोविजनल रूप से मिल जाता है।

इसका मतलब यह माना जाता है कि यदि आप वास्तव में अपनी हमेशा की शक्तियों का उपयोग नहीं करते हैं , तो आप उन्हें खो देंगे, जब आप उपयोग में होंगे।

ठीक है, लेकिन वह उलटा कब होगा? मैं ऐसा करने के लिए प्रतीत नहीं कर सकते। मेरा ऐप हमेशा ऑथोराइजेशन पर रहता है, भले ही यूजर को लगे कि यह केवल ऑथर इन यूज़ ऑथराइजेशन है।

यहाँ मेरे परीक्षण एप्लिकेशन (iOS 14) का पूरा कोड है:

class ViewController: UIViewController, CLLocationManagerDelegate {
    @IBOutlet weak var label: UILabel!
    
    let locman = CLLocationManager()
    override func viewDidLoad() {
        super.viewDidLoad()
        locman.delegate = self
    }

    @IBAction func doAskForAlways(_ sender: Any) {
        self.checkForLocationAccess(always:true)
    }
    
    func checkForLocationAccess(always:Bool = false, andThen f: (()->())? = nil) {
        let status = self.locman.authorizationStatus()
        switch status {
        case .authorizedWhenInUse:
            if always { // try to step up
                self.locman.requestAlwaysAuthorization()
            } else {
                f?()
            }
        case .authorizedAlways:
            f?()
        case .notDetermined:
            if always {
                self.locman.requestAlwaysAuthorization()
            } else {
                self.locman.requestWhenInUseAuthorization()
            }
        case .restricted:
            break
        case .denied:
            break
        default: fatalError()
        }
    }
    
    fileprivate func updateStatus(_ status: CLAuthorizationStatus) {
        self.label.text = {
            switch status {
            case .authorizedAlways: return "Always"
            case .authorizedWhenInUse: return "When In Use"
            default: return ""
            }
        }()
    }
    
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        let status = manager.authorizationStatus()
        print("authorization is", status.rawValue)
        updateStatus(status)
    }
    
    @IBAction func doStatus(_ sender: Any) {
        self.updateStatus(self.locman.authorizationStatus())
    }
}

आपको दो बटन और एक लेबल चाहिए। ऑलवेज ऑथराइज़ेशन के लिए पूछने के लिए पहला बटन टैप करें जब आपके पास ("निर्धारित नहीं") के साथ शुरू करने के लिए कोई प्राधिकरण नहीं है। जब आप उपयोग प्राधिकरण संवाद में देखते हैं। अनुदान प्राधिकरण। अब ऐप के साथ खेलें और लेबल में स्टेटस डिस्प्ले को देखते रहें। जरूरत पड़ने पर स्टेटस अपडेट करने के लिए आप दूसरे बटन पर टैप कर सकते हैं।

समस्या यह है कि यह हमेशा रहता है। मेरा "प्रावधान" कब समाप्त होगा ताकि प्राधिकरण कब उपयोग में हो? मैं इसे होने के लिए कैसे प्रोत्साहित कर सकता हूं?

जवाब

5 Rob Aug 16 2020 at 04:12

WWDC 2019 के मुख्य स्थान में नया क्या है , वे iOS 13.0 में मूल प्रक्रिया को रेखांकित करते हैं:

  1. आपका एप्लिकेशन "हमेशा" अनुमति का अनुरोध करता है।

  2. उपयोगकर्ता देखता है "जब उपयोग में" अनुमति अलर्ट, नहीं "हमेशा" अनुमति चेतावनी:

  3. यदि उपयोगकर्ता "उपयोग में होने पर" अनुदान देता है, तो एप्लिकेशन "अनंतिम हमेशा" स्थिति में है।

    इस मामले में, और कुछ हद तक भ्रम की स्थिति में, जब आप इस "अनंतिम हमेशा" स्थिति में authorizationStatusवापस आ जाएंगे .authorizedAlwaysऔर फोन पर सेटिंग्स ऐप यह सुझाव देगा कि यह "उपयोग में" स्थिति में है। लेकिन वास्तव में, यह इस "अनंतिम हमेशा" स्थिति में है, न कि authorizationStatusजो सेटिंग ऐप में आप देख रहे हैं और न ही इससे कोई अनुमान लगा सकता है ।

    कहने की जरूरत नहीं है, अगर उपयोगकर्ता "उपयोग में" होने पर भी अनुदान नहीं देता है (जैसे वे "केवल एक बार" इनकार करते हैं या चुनते हैं), तो जाहिर है कि आप "अनंतिम हमेशा" स्थिति में नहीं होंगे।

  4. यह इस अनंतिम स्थिति तक बना रहता है, जब तक कि वीडियो नहीं कहता है, आप "हमेशा 'शक्तियों का उपयोग करना शुरू करते हैं। उदाहरण के लिए, यदि आप महत्वपूर्ण परिवर्तन सेवा शुरू करते हैं और महत्वपूर्ण परिवर्तन को ट्रिगर करने के लिए पर्याप्त दूरी तय करते हैं।

    जब एप्लिकेशन "हमेशा 'शक्तियों का उपयोग करना शुरू करता है, तो ओएस उपयोगकर्ता से पूछेगा कि क्या वे" हमेशा "के" उपयोग में "होने पर अपग्रेड करने के लिए तैयार हैं। (यह हमेशा तुरंत नहीं होगा, लेकिन जब तक उपयोगकर्ता अन्य चीजों को करने में व्यस्त नहीं होगा, तब तक इंतजार करना होगा कि वे जो कर रहे थे उसे वापस पाने के लिए वे अलर्ट को खारिज कर देंगे।)

इसलिए, यह किसी अन्य राज्य के लिए "श्रद्धेय" होने का सवाल नहीं है। अंतिम "समझौता" होने तक एप्लिकेशन इस "अनंतिम हमेशा" स्थिति में रहेगा (जहां उपयोगकर्ता दूसरा अलर्ट देखता है और या तो अपग्रेड करने .authorizedAlwaysया इनकार करने के लिए सहमत होता है और इसे सेट किया जाता है .authorizedWhenInUse)।


मुझे पता है कि आप यह जानते हैं, लेकिन भविष्य के पाठकों के लिए:

WWDC 2020 वीडियो में स्थान में नया क्या है , वे iOS 13.4 में पेश किए गए परिवर्तन का वर्णन करते हैं। ऊपर प्रवाह के बजाय (जहां आप "हमेशा" पूछते हैं, उपयोगकर्ता "जब उपयोग में है" अनुमतियाँ देखता है, और वे "हमेशा" अपग्रेड नहीं करते हैं जब तक कि "हमेशा" सेवाएं वास्तव में चालू नहीं होती हैं), iOS 13.4 ने एक परिचय दिया नया प्रवाह, जहां आप "हमेशा उपयोग में" ("हमेशा" के बजाय) पूछ सकते हैं और उपयोगकर्ता को यह मानकर कि आप बाद में "हमेशा" के लिए पूछ सकते हैं, जहां एप्लिकेशन में उपयुक्त है, और उपयोगकर्ता को दूसरा अलर्ट मिलता है ( इस बार पूछ रहा है कि क्या उपयोगकर्ता "हमेशा" या नहीं अपग्रेड करना चाहेगा)। आपको बस उपयुक्त अनुमति स्ट्रिंग्स की आवश्यकता है।