पर स्थान अपडेट करने के लिए पृष्ठभूमि में हमेशा के लिए एक स्विफ्ट 2.0 ऐप चलाएं मैंने नीचे दिया गया कोड लिखा है जिसमें एक टाइमर है जो प्रत्येक मिनट कॉलबैक फ़ंक्शन को कॉल करता है। जब ऐप पृष्ठभूमि में जाता है तो मैंने एक और टाइमर शुरू किया है जो एक ही कॉलबैक विधि को कॉल करता है, लेकिन पृष्ठभूमि टाइमर केवल तीन मिनट के लिए काम करता है।सर्वर
मैं समझता हूं कि ऐप्पल पृष्ठभूमि कार्यों को केवल तीन मिनट के लिए अनुमति देता है। मेरा ऐप एक ट्रैकिंग ऐप की तरह है जो ऐप पृष्ठभूमि में होने पर भी हर मिनट उपयोगकर्ता के स्थान को ट्रैक करता है, इसलिए मुझे इस कार्यक्षमता को लागू करने की आवश्यकता है।
मैंने सीखा कि beginBackgroundTaskWithExpirationHandler
का उपयोग किया जाना है, लेकिन मुझे नहीं पता कि मेरा कार्यान्वयन सही है या नहीं।
नोट: मेरे पास स्थान अपडेट के लिए plist toApp रजिस्टरों में आवश्यक पृष्ठभूमि मोड आवश्यक हैं।
कोई भी कामकाजी कोड या लिंक की बहुत सराहना की जाती है।
override func viewDidLoad() {
super.viewDidLoad()
timeInMinutes = 1 * 60
self.locationManager.requestAlwaysAuthorization()
self.locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
var timer = NSTimer.scheduledTimerWithTimeInterval(timeInMinutes, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
self.latitude = locValue.latitude
self.longitude = locValue.longitude
if UIApplication.sharedApplication().applicationState == .Active {
} else {
backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({() -> Void in
self.backgroundTimer.invalidate()
self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
})
}
}
func updateLocation() {
txtlocationLabel.text = String(n)
self.n = self.n+1
var timeRemaining = UIApplication.sharedApplication().backgroundTimeRemaining
print(timeRemaining)
if timeRemaining > 60.0 {
self.GeoLogLocation(self.latitude,Longitude: self.longitude) {
results in
print("View Controller: \(results)")
self.CheckResult(String(results))
}
} else {
if timeRemaining == 0 {
UIApplication.sharedApplication().endBackgroundTask(backgroundTaskIdentifier)
}
backgroundTaskIdentifier2 = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({() -> Void in
self.backgroundTimer.invalidate()
self.backgroundTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: "updateLocation", userInfo: nil, repeats: true)
})
}
}
सहायता के लिए धन्यवाद ... मैं स्विफ्ट के लिए काफी नया हूं ... मैंने कहा कि मैंने हर 60 सेकंड में सटीकता मान को बदलने का प्रयास किया है ... मुझे अभी भी वही परिणाम मिल रहा है (यानी ऐप केवल रन और अपडेट करता है पृष्ठभूमि के तीन मिनट बाद) – Carey
हैलो, माफ करना, मैं उल्लेख करना भूल गया, और मेरा मानना है कि यह आपके कोड में गायब है, आपको अपने स्थान प्रबंधक में बैकग्राउंड स्थानों को भी सक्षम करना होगा, स्वयं। locationManager की तरह कुछ।अनुमति देता है बैकग्राउंडस्थान स्थान = सही –
बहुत बहुत धन्यवाद। यह काम किया! – Carey