আমি কীভাবে আমার আইওএস অ্যাপ্লিকেশনটিতে প্রতি n মিনিটে পটভূমি অবস্থান আপডেট পেতে পারি?


206

আমি আমার আইওএস অ্যাপ্লিকেশনটিতে প্রতি n মিনিটে পটভূমি অবস্থান আপডেটের জন্য একটি উপায় খুঁজছি। আমি আইওএস ৪.৩ ব্যবহার করছি এবং সমাধানটি নন-জেলব্রোকড আইফোনের জন্য কাজ করা উচিত।

আমি নিম্নলিখিত বিকল্পগুলি বিবেচনা করেছি / বিবেচনা করেছি:

  • CLLocationManager startUpdatingLocation/startMonitoringSignificantLocationChanges: এটি কনফিগার করা বৈশিষ্ট্যের উপর ভিত্তি করে, প্রত্যাশার মতো ব্যাকগ্রাউন্ডে কাজ করে, তবে প্রতি n মিনিটের মধ্যে অবস্থানটি আপডেট করতে বাধ্য করা সম্ভব হয় না বলে মনে হয়
  • NSTimer: অগ্রভাগে অ্যাপটি চলমান থাকলে কাজ করে তবে পটভূমির কাজগুলির জন্য নকশাকৃত বলে মনে হয় না
  • স্থানীয় বিজ্ঞপ্তিগুলি: স্থানীয় বিজ্ঞপ্তিগুলি প্রতি n মিনিটে নির্ধারিত হতে পারে তবে বর্তমান অবস্থানটি পেতে (কোনও বিজ্ঞপ্তির মাধ্যমে ব্যবহারকারী অ্যাপটি চালু না করে) কিছু কোড কার্যকর করা সম্ভব নয়। এই পদ্ধতির একটি পরিষ্কার পদ্ধতির বলে মনে হয় না কারণ এটি কী নোটিফিকেশন ব্যবহার করা উচিত।
  • UIApplication:beginBackgroundTaskWithExpirationHandler: আমি যতদূর বুঝতে পারি, কোনও অ্যাপ্লিকেশন "দীর্ঘ-চলমান" ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি প্রয়োগ করার পরিবর্তে ব্যাকগ্রাউন্ডে স্থানান্তরিত হওয়ার সময় পটভূমিতে কিছু কাজ শেষ করতে (সময় সীমিতও সীমাবদ্ধ) ব্যবহার করা উচিত।

আমি কীভাবে এই নিয়মিত পটভূমির অবস্থান আপডেটগুলি প্রয়োগ করতে পারি?



দরকারী ফলোআপ: স্ট্যাকওভারফ্লো
লোলো

1
আপনি এটা আইওএস 7 এ কাজ করে করতে চেষ্টা হয়, আপনি এই সমাধান এখানে চেষ্টা করতে পারেন: stackoverflow.com/questions/18946881/... যদি আপনার কোন প্রশ্ন থাকে, তাহলে আপনি একটি আলোচনা এখানে আমাদের সঙ্গে যোগদান করতে স্বাগত জানানো হয়: mobileoop.com/background -লোকেশন-আপডেট-প্রোগ্রামিং-এর-আইওএস -7
রিকি

1
আপনার সমস্ত অনুসন্ধান সঠিক (চারটি বুলেট পয়েন্ট)। তখন মূল্যবান তথ্য যা আপনার কেসের সাথে মেলে না তা জেনেও? এবং হ্যাঁ, যখন সাসপেন্ডেড মোডে বা না চালানো হয়, তখন প্রতিটি এন-মিনিট আপডেট করার কোনও চূড়ান্ত পদ্ধতি নেই।
লেনআর্ট

উত্তর:


113

আমি অ্যাপল বিকাশকারী ফোরামগুলির সাহায্যে এটি বাস্তবায়নের একটি সমাধান পেয়েছি:

  • নির্দিষ্ট করুন location background mode
  • এর NSTimerসাথে ব্যাকগ্রাউন্ডে একটি তৈরি করুনUIApplication:beginBackgroundTaskWithExpirationHandler:
  • যখন nহয় ছোট চেয়েUIApplication:backgroundTimeRemaining এটা ঠিক সূক্ষ্ম কাজ করবে। যখন nহয় বৃহত্তর , location managerসক্রিয় করা উচিত (এবং অক্ষম) আবার সামনে কোন সময় পটভূমি টাস্ক এড়াতে অবশিষ্ট নিহত হচ্ছে।

এই কাজ করে কারণ অবস্থান পটভূমি সঞ্চালনের তিনটি এমন ধরনের এক

দ্রষ্টব্য: আমি সিমুলেটর যেখানে এটি কাজ করে না সেখানে এটি পরীক্ষা করে কিছু সময় হারিয়েছি। তবে এটি আমার ফোনে কাজ করে।


24
আপনি কি ফোরামে লিঙ্ক আছে ঘটেছে? আমি একই ধরণের লোকেশন ম্যাপিং কার্যকর করতে চাইছি এবং এটি কাজ করতে সক্ষম হয়ে উঠিনি। অথবা কিছু নমুনা কোড প্রশংসিত হবে।
utahwithak

4
আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে আপনি যদি কেবলমাত্র অবস্থান পরিচালকটি বন্ধ করে শুরু করেন তবে ব্যাকগ্রাউন্ড টাস্কটি 10 ​​মিনিটের পরে (সর্বাধিক অনুমোদিত সময়) না কেন হত্যা করা হয়? এটা কি উদ্দেশ্যমূলক কার্যকারিতা এক প্রকার? এটি অ্যাপল এসডিকে কোনও বাগের মতো মনে হয় যদি এটির মতো ঘটে। আপনি কোন আইওএস সংস্করণটির চেষ্টা করছেন?
সৌরভ

5
@ সমস্ত: হ্যাঁ, আমাদের অ্যাপটি অ্যাপস্টোরে উপলব্ধ is আমি সমস্ত কোড পোস্ট করব না, উল্লিখিত সমস্ত বুলেটপয়েন্টগুলি স্পষ্টভাবে নথিভুক্ত বৈশিষ্ট্য are আপনার যদি নির্দিষ্ট সমস্যা হয় তবে আপনি কী চেষ্টা করেছেন এবং কী ভুল হয়েছে তা ব্যাখ্যা করে আপনার নিজের প্রশ্ন পোস্ট করুন।
wjans

3
@ ইউজার ৩6060০2626: হ্যাঁ, আমি ব্যাকগ্রাউন্ড মোড নির্দিষ্ট করে বলতে চাইছি। অবস্থান আপডেটটি থামানোর পরে, অ্যাপটি শেষ হতে না দেওয়া এটিকে 10 মিনিটের মধ্যে আবার শুরু করা উচিত।
wjans

12
এখানে যা আলোচনা করা হচ্ছে তার কিছু প্রতিবিম্বিত কিছু আসল কোড দেখতে আগ্রহী সকলের জন্য, স্ট্যাকওভারফ্লো.com
ললো

55

উপর আইওএস 8/9/10 পটভূমি অবস্থান আপডেট প্রতি 5 মিনিটে নিচের কাজগুলো করতে:

  1. প্রকল্প -> সক্ষমতা -> পটভূমি মোড -> অবস্থান আপডেট নির্বাচন করুন

  2. প্রকল্পে যান -> তথ্য -> একটি কী এনএসলোকেশনআলওস ইউজেজ বিবরণ খালি মান (বা বিকল্পভাবে কোনও পাঠ্য) যুক্ত করুন

  3. আপনার অ্যাপটি পটভূমিতে থাকাকালীন লোকেশনকে কাজ করতে এবং ওয়েব পরিষেবাতে স্থানাঙ্ক প্রেরণ করতে বা প্রতি 5 মিনিটে তাদের সাথে কিছু করার জন্য নীচের কোডের মতো এটি প্রয়োগ করে।

আমি কোনও ব্যাকগ্রাউন্ড টাস্ক বা টাইমার ব্যবহার করছি না। আমি এই আইওএসটি আইওএস 8.1 এর সাহায্যে এই কোডটি পরীক্ষা করেছি যা আমার ডেস্কে কয়েক ঘন্টা ধরে আমার অ্যাপ্লিকেশনটির ব্যাকগ্রাউন্ডে চলছিল। ডিভাইসটি লক করা ছিল এবং কোডটি সর্বদা সঠিকভাবে চলছিল।

@interface LocationManager () <CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) NSDate *lastTimestamp;

@end

@implementation LocationManager

+ (instancetype)sharedInstance
{
    static id sharedInstance = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
        LocationManager *instance = sharedInstance;
        instance.locationManager = [CLLocationManager new];
        instance.locationManager.delegate = instance;
        instance.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // you can use kCLLocationAccuracyHundredMeters to get better battery life
        instance.locationManager.pausesLocationUpdatesAutomatically = NO; // this is important
    });

    return sharedInstance;
}

- (void)startUpdatingLocation
{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    if (status == kCLAuthorizationStatusDenied)
    {
        NSLog(@"Location services are disabled in settings.");
    }
    else
    {
        // for iOS 8
        if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        {
            [self.locationManager requestAlwaysAuthorization];
        }
        // for iOS 9
        if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])
        {
            [self.locationManager setAllowsBackgroundLocationUpdates:YES];
        }

        [self.locationManager startUpdatingLocation];
    }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *mostRecentLocation = locations.lastObject;
    NSLog(@"Current location: %@ %@", @(mostRecentLocation.coordinate.latitude), @(mostRecentLocation.coordinate.longitude));

    NSDate *now = [NSDate date];
    NSTimeInterval interval = self.lastTimestamp ? [now timeIntervalSinceDate:self.lastTimestamp] : 0;

    if (!self.lastTimestamp || interval >= 5 * 60)
    {
        self.lastTimestamp = now;
        NSLog(@"Sending current location to web service.");
    }
}

@end

3
এটি কয়েক ঘন্টারও বেশি সময় ধরে কাজ করে? দেখে মনে হচ্ছে অ্যাপটি বন্ধ না করা সত্ত্বেও, অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে যাওয়ার এক ঘন্টা বা তার পরে ডিভাইসটি অবস্থান আপডেটগুলি থামিয়ে দেওয়া বন্ধ করে দেয়।
মাইসটিক

2
আমার প্রকল্পে পটভূমি আনতে অক্ষম করা হয়েছে (এটি চালু বা চালু আছে তা বিবেচনা করা উচিত নয়)। তবে বিরতিহীন অবস্থান আপডেটস স্বয়ংক্রিয়ভাবে যথাযথভাবে কাজ করার জন্য উপরের উদাহরণের জন্য কোনটি সেট করা আবশ্যক। পূর্বে সিস্টেমের দ্বারা বিরতি দেওয়া থাকলে আপনি আবার চলতে শুরু করলে এটি স্বয়ংক্রিয়ভাবে পুনরায় শুরু হবে না। এই কারণেই উপরের উদাহরণে আমি এই সম্পত্তিটি কোনও হিসাবে সেট করেছিলাম।
লেসেক জাজারি

1
আমি মনে করি আপনি একেবারে ঠিক বলেছেন। সমস্যা সম্পর্কে আরো কিছু তথ্য পাওয়া এখানে: stackoverflow.com/q/17484352/1048331
Myxtic

2
@ লেজিজকে আপনার পটভূমির জন্য আইওএস 9 সমর্থনটির জন্য নীচে কোড যুক্ত করতে হবে - if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { [self.locationManager setAllowsBackgroundLocationUpdates:YES]; }
ফেনিল

2
এটি করার সুবিধা কী? আপনি এখনও ধ্রুবক উচ্চ নির্ভুলতা রেখে ব্যাটারিটি ড্রেন করছেন। কেবলমাত্র আপনি যা করবেন না তা হ'ল 5 মিনিটের ব্যবধানে পৌঁছানো অবধি আপনি ইতিমধ্যে প্রাপ্ত স্থানটি ব্যবহার করবেন না ...
হানি

34

আমি বিকাশ করছি এমন একটি অ্যাপ্লিকেশনটিতে এটি করেছি। অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় টাইমারগুলি কাজ করে না তবে অ্যাপটি ক্রমাগত লোকেশন আপডেটগুলি গ্রহণ করে। আমি ডকুমেন্টেশনে কোথাও পড়েছি (আমি এখন এটি সন্ধান করতে পারি না, আমি যখন করব তখন একটি আপডেট পোস্ট করব) অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় কোনও পদ্ধতিটি কেবল একটি সক্রিয় রান লুপে কল করা যেতে পারে। অ্যাপের প্রতিনিধিটির বিগিতেও একটি সক্রিয় রান লুপ রয়েছে তাই আপনাকে এই কাজটি করার জন্য নিজের তৈরি করার দরকার নেই। [আমি নিশ্চিত নই যে এটি সঠিক ব্যাখ্যা কিনা তবে আমি যা পড়েছি তা কীভাবে বুঝতে পেরেছি]

প্রথম সব, যোগ locationকীয়ের জন্য বস্তু UIBackgroundModesআপনার অ্যাপ্লিকেশনের info.plist হবে। এখন, আপনাকে যা করতে হবে তা হ'ল আপনার অ্যাপের যেকোন স্থানের আপডেট আপডেট শুরু করুন:

    CLLocationManager locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;//or whatever class you have for managing location
    [locationManager startUpdatingLocation];

এরপরে, -(void)didUpdateToLocation:(CLLocation*)locationঅ্যাপের প্রতিনিধিতে লোকেশন আপডেটগুলি পরিচালনা করতে একটি পদ্ধতি লিখুন । তারপর পদ্ধতি বাস্তবায়ন locationManager:didUpdateLocation:fromLocationএর CLLocationManagerDelegateবর্গ যার মাধ্যমে আপনি অবস্থান ম্যানেজার শুরু (যেহেতু আমরা 'স্ব' থেকে অবস্থান ব্যবস্থাপক প্রতিনিধি সেট)। এই পদ্ধতির অভ্যন্তরে আপনাকে পরীক্ষা করে নেওয়া দরকার যে সময় ব্যবধানের পরে আপনাকে লোকেশন আপডেটগুলি হ্যান্ডেল করতে হবে কিনা। আপনি বর্তমান সময় প্রতিবার সঞ্চয় করে এটি করতে পারেন। যদি সেই সময়টি অতিবাহিত হয়ে থাকে, তবে আপনার অ্যাপের প্রতিনিধিটির কাছ থেকে পদ্ধতিটি আপডেটডোকেট কল করুন:

NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;

int locationUpdateInterval = 300;//5 mins

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {

        lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];

        if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
            //NSLog(@"New Location: %@", newLocation);
            [(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
            [userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
        }
    }
}

আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায়ও প্রতি 5 মিনিটে এটি আপনার পদ্ধতিটিকে কল করবে। ইমপ: এই প্রয়োগটি ব্যাটারিটি ড্রেন করে, যদি আপনার অবস্থানের ডেটার নির্ভুলতা আপনার ব্যবহার করা উচিত নয়[locationManager startMonitoringSignificantLocationChanges]

আপনার অ্যাপে এটি যুক্ত করার আগে, দয়া করে অবস্থান সচেতনতা প্রোগ্রামিং গাইডটি পড়ুন


3
এইভাবে লোকেশন পরিষেবাদি অবিচ্ছিন্নভাবে সক্ষম হয়ে থাকে (প্রকৃতপক্ষে ব্যাটারি নিকাশী), আমি এটি চাই না। আমি প্রতি n মিনিট পরে অবস্থান পরিষেবাটি সক্ষম করতে চাই এবং যখন আমার একটি ভাল ফিক্স হয় (তাত্ক্ষণিকভাবে লক্ষ্য করা যায় যে আমি আমার প্রশ্নে এটি পরিষ্কারভাবে ব্যাখ্যা করি নি)। আমি বর্ণিত সমাধানে এই আচরণটি অর্জন করতে পারি।
wjans

3
আপনি লোকেশন ম্যানেজারের নির্ভুলতা 1 কেমি স্থির করতে পারেন - এটি আপনার ব্যাটারিটি প্রায় অক্ষত রাখবে। 5 মিনিটের পরে আপনি নির্ভুলতা 1 মি তে সেট করেছেন। আপনি যখন সন্তোষজনক অবস্থান পান (সাধারণত 5s এর পরে) ঠিক 1 কেমি ফিরে আসেন।
49

নাগোড, আমি ব্যাটারি নিকাশী সমস্যার জন্য আপনার প্রস্তাবিত সমাধানটি চেষ্টা করেছি, তবে এন মিনিটের পরে যথাযথতা বাড়ানোর পরেও লোকেশন ম্যানেজার: ডু ইউপেটলটেশন পদ্ধতিটি আবার কল করা হয় না। আমি স্টার্টআপডেটিং এবং স্টপআপডেটিংয়ের চেষ্টা করেছি, যথাযথতা বৃদ্ধি এবং হ্রাসের পরিবর্তে এটিকে সফলভাবে ডেলিগেট লোকেশন ম্যানেজার বলা হয়: didUpdateLocations পদ্ধতি, এন মিনিট পরে, তবে ব্যাকগ্রাউন্ড MODE তে কাজ করছে না ...
হার্ডিক দারজি

ডকুমেন্টেশন লিঙ্ক হিসাবে। এখানে দেখুন : "আপনার প্রতিনিধি অবজেক্টের পদ্ধতিগুলি সেই থ্রেড থেকে কল করা হয়েছে যেখানে আপনি সংশ্লিষ্ট অবস্থান পরিষেবাগুলি শুরু করেছিলেন That সেই থ্রেডটিতে অবশ্যই আপনার অ্যাপ্লিকেশনটির মূল থ্রেডের মতো একটি সক্রিয় রান লুপ থাকা উচিত found"
মধু

24

চিরকাল চলমান লোকেশন পরিষেবাদি চালানোর জন্য এখন iOS6 সবচেয়ে ভাল উপায় ...

- (void)applicationWillResignActive:(UIApplication *)application
{
/*
 Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
 Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
 */

NSLog(@"to background");

app.isInBackground = TRUE;

UIApplication *app = [UIApplication sharedApplication];

// Request permission to run in the background. Provide an
// expiration handler in case the task runs long.
NSAssert(bgTask == UIBackgroundTaskInvalid, nil);

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    // Synchronize the cleanup call on the main thread in case
    // the task actually finishes at around the same time.
    dispatch_async(dispatch_get_main_queue(), ^{

        if (bgTask != UIBackgroundTaskInvalid)
        {
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }
    });
}];

// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // Do the work associated with the task.

    locationManager.distanceFilter = 100;
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    [locationManager startMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];

    NSLog(@"App staus: applicationDidEnterBackground");
    // Synchronize the cleanup call on the main thread in case
    // the expiration handler is fired at the same time.
    dispatch_async(dispatch_get_main_queue(), ^{
        if (bgTask != UIBackgroundTaskInvalid)
        {
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }
    });
});

NSLog(@"backgroundTimeRemaining: %.0f", [[UIApplication sharedApplication] backgroundTimeRemaining]);

}

ঠিক এটির মতো পরীক্ষিত:

আমি অ্যাপ্লিকেশনটি শুরু করেছি, ব্যাকগ্রাউন্ডে গিয়ে কিছুক্ষণের মধ্যে গাড়ীতে চলে যাই move তারপরে আমি 1 ঘন্টা বাড়ীতে গিয়ে আবার চলতে শুরু করি (অ্যাপটি আবার না খোলায়)। অবস্থানগুলি আবার শুরু হয়েছিল। তারপরে দুই ঘন্টা থেমে আবার শুরু হয়েছিল started সবকিছু ঠিক আছে আবার ...

IOS6 এ নতুন অবস্থানের পরিষেবাগুলি ব্যবহার করতে ভুলে যাবেন না

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{   
    CLLocation *loc = [locations lastObject];

    // Lat/Lon
    float latitudeMe = loc.coordinate.latitude;
    float longitudeMe = loc.coordinate.longitude;
}

1
যদি অ্যাপটি ক্র্যাশ হয়ে যায় বা মারা যায় তবে সিস্টেমটি পুনরায় চালু হচ্ছে না, তাই না?
কেন

1
আরও পঠনযোগ্য কোডের জন্য, আপনি একটি [লোকেশন লাস্টবজেক্ট] করতে পারেন; [লোকেশন অবজেক্টআটিআইডেক্সের পরিবর্তে: [অবস্থানগুলি গণনা] - 1]
ਅਕলেলো

আপনার পদ্ধতিটি কি কেবল আইওএস 6 এ রয়েছে?
পেংগাং

আমাদের কি এটি ব্যবহার করতে হবে? আমি ভেবেছিলাম একটি ক্লাসের ভিডডিলোডে লোকেশন ম্যানেজারের কোডটি আছে এবং প্লাস্ট ফাইলটিতে একটি ব্যাকগ্রাউন্ড কী সেট করে রেখেছি যে অ্যাপ্লিকেশন লোকেশন আপডেটের জন্য নিবন্ধগুলি যথেষ্ট ভাল হওয়া উচিত? আপনি কি আমাকে এই সাহায্য করতে পারেন!
nithinreddy

হ্যাঁ, এটি মনোমুগ্ধকর নিতিনরেডির মতো কাজ করবে তবে এটি 10 ​​মিনিটের পরে কাজ করা বন্ধ করবে যেহেতু আইওএস সেই সময়ের পরে দীর্ঘ থ্রেড হত্যা করে। আপনি যদি এই পরিষেবাগুলি চিরকালের জন্য শুরু করতে চান তবে আমার সমাধানটি নিখুঁত। আমি দু'দিন আগে কিছু পরীক্ষা করেছি এবং এটি প্রতি ঘন্টা 6% ব্যাটারি ড্রেন করে। পরিবর্তে [লোকেশন ম্যানেজার স্টার্টআপডেটিং লোকেশন] ব্যবহার করে 17% ড্রেন হবে
আলেজান্দ্রো লুয়েঙ্গো

13

দুঃস্বপ্নের মতো অন্য কারও কাছে এটি খুঁজে বের করুন। আমার একটি সহজ সমাধান আছে।

  1. রায়ওয়েন্ডারলিচ.কম থেকে এই উদাহরণটি দেখুন -> স্যাম্পল কোড রয়েছে, এটি নিখুঁতভাবে কাজ করে তবে দুর্ভাগ্যক্রমে পটভূমির অবস্থানের সময় টাইমার নেই। এটি অনির্দিষ্টকালের জন্য চলবে।
  2. ব্যবহার করে টাইমার যুক্ত করুন:

    -(void)applicationDidEnterBackground {
    [self.locationManager stopUpdatingLocation];
    
    UIApplication*    app = [UIApplication sharedApplication];
    
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    
     self.timer = [NSTimer scheduledTimerWithTimeInterval:intervalBackgroundUpdate
                                                  target:self.locationManager
                                                selector:@selector(startUpdatingLocation)
                                                userInfo:nil
                                                 repeats:YES];
    
    }
  3. শুধু তথ্য.পিস্টে "অবস্থানের আপডেটের জন্য অ্যাপ রেজিস্টারগুলি" যুক্ত করতে ভুলবেন না।


এটি কি 3 মিনিটেরও বেশি সময় ধরে লোকেশন পাবে?
স্লিপনট

যোগ্যতা -> পটভূমি মোডে অবশ্যই অবস্থান নির্ধারণ করতে হবে।
সেরজিও আন্দ্রেওত্তি

এটা কাজ করছে না!! ? আমি iOS 8 উত্তর আইওএস 10
কির্তি

আমি ভুল হলে শুধরে. আমি যা পড়েছি তার ভিত্তিতে, আপনি একবারে লোকেশন ম্যানেজার শুরু করুন। তারপরে সমস্ত বিরতিগুলি অপ্রয়োজনীয়। যেহেতু এটি ইতিমধ্যে শুরু হয়েছে
মধু

এটি কাজ করছে তবে এটি 170 সেকেন্ড পরে থামছে। আমি সীমাহীন সময়ের জন্য আমার কাজটি পটভূমিতে চালাতে চাই
আনশুমান বর্মম্যান

8

আমি যা ব্যবহার করি তা এখানে:

import Foundation
import CoreLocation
import UIKit

class BackgroundLocationManager :NSObject, CLLocationManagerDelegate {

    static let instance = BackgroundLocationManager()
    static let BACKGROUND_TIMER = 150.0 // restart location manager every 150 seconds
    static let UPDATE_SERVER_INTERVAL = 60 * 60 // 1 hour - once every 1 hour send location to server

    let locationManager = CLLocationManager()
    var timer:NSTimer?
    var currentBgTaskId : UIBackgroundTaskIdentifier?
    var lastLocationDate : NSDate = NSDate()

    private override init(){
        super.init()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
        locationManager.activityType = .Other;
        locationManager.distanceFilter = kCLDistanceFilterNone;
        if #available(iOS 9, *){
            locationManager.allowsBackgroundLocationUpdates = true
        }

        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.applicationEnterBackground), name: UIApplicationDidEnterBackgroundNotification, object: nil)
    }

    func applicationEnterBackground(){
        FileLogger.log("applicationEnterBackground")
        start()
    }

    func start(){
        if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedAlways){
            if #available(iOS 9, *){
                locationManager.requestLocation()
            } else {
                locationManager.startUpdatingLocation()
            }
        } else {
                locationManager.requestAlwaysAuthorization()
        }
    }
    func restart (){
        timer?.invalidate()
        timer = nil
        start()
    }

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        switch status {
        case CLAuthorizationStatus.Restricted:
            //log("Restricted Access to location")
        case CLAuthorizationStatus.Denied:
            //log("User denied access to location")
        case CLAuthorizationStatus.NotDetermined:
            //log("Status not determined")
        default:
            //log("startUpdatintLocation")
            if #available(iOS 9, *){
                locationManager.requestLocation()
            } else {
                locationManager.startUpdatingLocation()
            }
        }
    }
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        if(timer==nil){
            // The locations array is sorted in chronologically ascending order, so the
            // last element is the most recent
            guard let location = locations.last else {return}

            beginNewBackgroundTask()
            locationManager.stopUpdatingLocation()
            let now = NSDate()
            if(isItTime(now)){
                //TODO: Every n minutes do whatever you want with the new location. Like for example sendLocationToServer(location, now:now)
            }
        }
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        CrashReporter.recordError(error)

        beginNewBackgroundTask()
        locationManager.stopUpdatingLocation()
    }

    func isItTime(now:NSDate) -> Bool {
        let timePast = now.timeIntervalSinceDate(lastLocationDate)
        let intervalExceeded = Int(timePast) > BackgroundLocationManager.UPDATE_SERVER_INTERVAL
        return intervalExceeded;
    }

    func sendLocationToServer(location:CLLocation, now:NSDate){
        //TODO
    }

    func beginNewBackgroundTask(){
        var previousTaskId = currentBgTaskId;
        currentBgTaskId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
            FileLogger.log("task expired: ")
        })
        if let taskId = previousTaskId{
            UIApplication.sharedApplication().endBackgroundTask(taskId)
            previousTaskId = UIBackgroundTaskInvalid
        }

        timer = NSTimer.scheduledTimerWithTimeInterval(BackgroundLocationManager.BACKGROUND_TIMER, target: self, selector: #selector(self.restart),userInfo: nil, repeats: false)
    }
}

আমি অ্যাপডেলিগেটের মতো ট্র্যাকিং শুরু করি:

BackgroundLocationManager.instance.start()

ধন্যবাদ। আমাদের প্রকল্পে ব্যবহারকারীর অবস্থান ট্র্যাক করা দরকার + পটভূমিতে PubNub ইভেন্টগুলি প্রেরণ করা উচিত এবং আপনার সমাধানটি সত্যই ভাল কাজ করছে।
ব্যবহারকারী 921509

হাই হিমিতকোভ, যেখানে আমি সার্ভারে ব্যবহারকারীর অবস্থান প্রেরণের জন্য
সেন্ডলোকশন টো

@ আমানগুফট007 আপনি ফান লোকেশন ম্যানেজারে ম্যানেজারে সেন্ডলোকেশনটস সার্ভারকে কল করতে পারেন (পরিচালক: didUpdateLocations :)। কোডটিতে // টোডো মন্তব্যটি লক্ষ্য করুন।
hmitkov

@hmitkov অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে থাকাকালীন কী এটি দিয়ে পরিষেবা পরিষেবা শুরু করা এবং বন্ধ করা সম্ভব? উদাহরণস্বরূপ, কোনও পুশ নোটিফিকেশন থেকে অবস্থান পরিষেবাটি শুরু করুন কিছুটা লম্বা / লম্বা দখল করুন, ওয়েবসার্ভিসে প্রেরণ করুন, তারপরে অবস্থান আপডেট করা বন্ধ করুন। প্রতিবার 'সামগ্রী-উপলভ্য' = 1 টি পুশ বডিতে অন্তর্ভুক্ত করার জন্য এটি করুন।
ডুকিমন

1
আমি এই কোডটি চেষ্টা করেছি তবে মনে হচ্ছে এটি আইওএস 11 এ কাজ করছে না? (আমি এটি অন্য কোনও সংস্করণে পরীক্ষা করি নি))
টম

6

দুর্ভাগ্যক্রমে, আপনার সমস্ত অনুমানগুলি সঠিক বলে মনে হচ্ছে এবং এটি করার কোনও উপায় আছে বলে আমি মনে করি না। ব্যাটারির জীবন বাঁচানোর জন্য, আইফোনের লোকেশন পরিষেবাদি চলাচলের উপর ভিত্তি করে। যদি ফোনটি একটি স্পটে বসে থাকে তবে এটি অবস্থানের পরিষেবাগুলিতে অদৃশ্য।

ফোনটি যখন কোনও লোকেশন আপডেট গ্রহণ করে কেবল CLLocationManagerতখনই কল করবে locationManager:didUpdateToLocation:fromLocation:, যা কেবল তখনই ঘটে যখন তিনটি অবস্থানের পরিষেবাগুলির (সেল টাওয়ার, জিপিএস, ওয়াইফাই) কোনও পরিবর্তন বুঝতে পারে।

আরও কয়েকটি বিষয় যা আরও সমাধানগুলি জানাতে সহায়তা করতে পারে:

  • পরিষেবাগুলি শুরু করা এবং বন্ধ করা didUpdateToLocationডেলিগেট পদ্ধতিটি কল করার কারণ হয়, তবেnewLocation এটির একটি পুরানো টাইমস্ট্যাম্প থাকতে পারে।

  • অঞ্চল পর্যবেক্ষণ সাহায্য করতে পারে

  • ব্যাকগ্রাউন্ডে চলার সময়, সচেতন থাকুন যে অ্যাপল দ্বারা অনুমোদিত "পূর্ণ" লোকেশন সার্ভিস সমর্থন পাওয়া কঠিন হতে পারে। আমি যা দেখেছি, সেগুলি থেকে তারা বিশেষভাবে নকশা করেছেstartMonitoringSignificantLocationChanges থেকে অ্যাপগুলিকে পটভূমির অবস্থান সমর্থনের প্রয়োজন হিসাবে স্বল্প শক্তি বিকল্প হিসাবে করেছে এবং অ্যাপ্লিকেশনটির একেবারে প্রয়োজন না হলে বিকাশকারীদের এটি ব্যবহার করার জন্য দৃ strongly়ভাবে উত্সাহিত করেছে।

শুভকামনা!

আপডেট: এই চিন্তাভাবনাগুলি এখনই অতিক্রান্ত হতে পারে। দেখে মনে হচ্ছে উপরে লোকেরা @wjans উত্তর দিয়ে সাফল্য অর্জন করছে।


1
অ্যাপস্টোরগুলিতে এমন অ্যাপ্লিকেশন রয়েছে (উদাহরণস্বরূপ "আমার লোকস") যা পটভূমিতে কোনও অবস্থান আপডেট পাওয়া সম্ভব করে। তারা অবস্থান পরিষেবাটি সক্রিয় রাখে না তবে সংজ্ঞা অনুযায়ী ব্যবধান অনুসারে এটি শীঘ্রই সক্ষম হয়ে যায়। তারা কিভাবে এই কাজ করে?
wjans

2
আপনি যে পরিস্থিতিতে বর্ণনা করেছেন তাতে অ্যাপটি সম্ভবত স্টার্টমনিটরিংসিগনিফ্যান্টলোকেশনচেনজ অ্যাপ্রোচ ব্যবহার করে। এখানে, ফোনটি কোনও আপডেট আপডেট পেলে অস্থায়ীভাবে 'জাগ্রত' হয়ে ওঠে, তবে ব্যাকগ্রাউন্ডে আপনি এই পরিষেবাটি 'পিং' সেট করতে পারবেন এমন কোনও বিরতি নেই। ফোনটি সরে গেলে (বা সেলুলার থেকে জিপিএস বা ওয়াইফাইতে স্যুইচ করে) এটি আপডেট শুরু করে। বিষয়ে স্ট্যানফোর্ড আই টিউনস ইউ বক্তৃতা আমার জন্য সত্যিই সহায়ক ছিল - আশা করছি এটা আপনি একটি কার্যসংক্রান্ত খুঁজে পেতে সাহায্য করতে পারেন: itunes.apple.com/us/itunes-u/iphone-application-development/...
Chazbot

2
পয়েন্টার জন্য Thx। তবে আমি এখনও বুঝতে পারি না অ্যাপটি কী করছে। এমনকি যদি আমার ফোনটি আমার ডেস্কে থাকে, একেবারে না চালায় তবে আমি দেখতে পাই যে প্রতি 10 মিনিটে লোকেশন পরিষেবাটি ট্রিগার করা হচ্ছে (ঠিক)) আমি যদি সঠিকভাবে বুঝতে পারি startMonitoringSignificantLocationChangesতবে সে ক্ষেত্রে কোনও আপডেট দেবে না।
wjans

1
@ উইজানস আপনার ফোনের ব্যাটারি কীভাবে ব্যবহার করছেন, আপনি কি মাইলোকাস অ্যাপের কারণে এটিকে নষ্ট করে ফেলতে লক্ষ্য করেছেন?
ব্যবহারকারীর 836026

6

আমি অবস্থান পরিষেবাগুলি ব্যবহার করে একটি অ্যাপ্লিকেশন লিখেছি, অ্যাপ্লিকেশনকে অবশ্যই প্রতি দশকে অবস্থান পাঠাতে হবে। এবং এটি খুব ভাল কাজ করেছে।

কেবলমাত্র " অনুমতিডেফার্ডলোকেশনআপডেটসঅন্টিল ট্র্যাভেলড: টাইমআউট ব্যবহার করুনঅ্যাপলের ডকটি অনুসরণ " পদ্ধতিটি ।

আমি যা করেছি তা হ'ল:

আবশ্যক: আপডেট অবস্থানের জন্য পটভূমি মোডটি নিবন্ধ করুন।

1. তৈরি করুন LocationMangerএবং startUpdatingLocationসঙ্গে accuracyএবং filteredDistanceযাই হোক না কেন হিসাবে আপনি চান:

-(void) initLocationManager    
{
    // Create the manager object
    self.locationManager = [[[CLLocationManager alloc] init] autorelease];
    _locationManager.delegate = self;
    // This is the most important property to set for the manager. It ultimately determines how the manager will
    // attempt to acquire location and thus, the amount of power that will be consumed.
    _locationManager.desiredAccuracy = 45;
    _locationManager.distanceFilter = 100;
    // Once configured, the location manager must be "started".
    [_locationManager startUpdatingLocation];
}

২.allowDeferredLocationUpdatesUntilTraveled:timeout পটভূমিতে পদ্ধতিটি ব্যবহার করে অ্যাপটিকে চিরতরে চালিয়ে যেতে, অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ডে updatingLocationস্থানান্তরিত করার সময় আপনাকে অবশ্যই নতুন প্যারামিটার দিয়ে পুনরায় চালু করতে হবে :

- (void)applicationWillResignActive:(UIApplication *)application {
     _isBackgroundMode = YES;

    [_locationManager stopUpdatingLocation];
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [_locationManager setDistanceFilter:kCLDistanceFilterNone];
    _locationManager.pausesLocationUpdatesAutomatically = NO;
    _locationManager.activityType = CLActivityTypeAutomotiveNavigation;
    [_locationManager startUpdatingLocation];
 }

৩. অ্যাপ্লিকেশন locationManager:didUpdateLocations:কলব্যাকের সাথে আপডেট হিসাবে আপডেট হয়ে গেছে :

-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
//  store data
    CLLocation *newLocation = [locations lastObject];
    self.userLocation = newLocation;

   //tell the centralManager that you want to deferred this updatedLocation
    if (_isBackgroundMode && !_deferringUpdates)
    {
        _deferringUpdates = YES;
        [self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10];
    }
}

৪. তবে locationManager:didFinishDeferredUpdatesWithError:আপনার নিজের উদ্দেশ্যে ডেটা হ'ল কলব্যাক করা উচিত

- (void) locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {

     _deferringUpdates = NO;

     //do something 
}

৫. দ্রষ্টব্য: আমি মনে করি আমাদের LocationManagerপ্রতিটি সময় অ্যাপ্লিকেশনটির প্যারামিটারগুলি পটভূমি / ভোলাউন্ড মোডের মধ্যে পুনরায় সেট করা উচিত ।


@ আমার বা ডিভাইসের ব্যাটারিটি সংরক্ষণ করতে পছন্দ করা উচিত বা উভয়ই একই প্রভাব ফেলতে পারে যাওয়ানের এর সমাধানিত সমাধানের উপরের সমস্ত সমাধানটি?
যশ

2
আপনার উল্লিখিত দুটি সমাধানই আমি ব্যবহার করে দেখেছি এবং দেখেছি যে @ wjans এর ব্যাটারিটি কিছুটা বেশি সাশ্রয়ী। তবে, আইওএস 8 আসার পরে, মনে হয় যে সমাধানটি এখন আর সঠিকভাবে কাজ করে না। আরও বিশদের জন্য: বেশিরভাগ সময় অ্যাপ্লিকেশনটির পটভূমি মোডে বেশি দিন থাকতে পারে না।
samthui7

@ সামথুই 7 আপনি বিরতি কেন সেট করবেন লোকেশন আপডেটস অটোমেটিক = মিথ্যা?
সিড্রিকসৌব্রি

আমার অ্যাপ্লিকেশনটির প্রয়োজনীয়তা হ'ল প্রতি দশকে ইউজারলোকেশন প্রেরণ করা চালিয়ে যাওয়া, অন্যদিকে pausesLocationUpdatesAutomatically = trueলোকেশন ম্যানেজারকে কোনও অবস্থান পরিবর্তন ( অ্যাপলের ডক ) না থাকলে আপডেটগুলিতে বিরতি দিতে বলে । যাইহোক, আমি location manager pauses updatesএখনও স্পষ্টভাবে এখনও এর ক্ষেত্রে পরীক্ষা করিনি: ডি।
samthui7

@ সিড্রিকসৌব্রি: সেট করার pausesLocationUpdatesAutomatically = trueফলে আমার অ্যাপ্লিকেশনটি আপডেট হওয়া অবস্থান বন্ধ করে দেয়।
samthui7

5
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [self.locationManager setAllowsBackgroundLocationUpdates:YES];
}

আইওএস 9 এর পরে থেকে পটভূমির অবস্থান ট্র্যাকিংয়ের জন্য এটি প্রয়োজন।


1
এটা আমার দিন বাঁচায়! iOS8 স্থাপনার লক্ষ্য ব্যবহার করে, iOS9 ডিভাইসের সাথে
Yaro

4

আমি ইন্টারভাল পাওয়ার জন্য xs2bush এর পদ্ধতি ব্যবহার করেছি (ব্যবহার করে) timeIntervalSinceDate ) এবং এর উপরে কিছুটা প্রসারিত করেছি। আমি এটি নিশ্চিত করতে চেয়েছিলাম যে আমার প্রয়োজনীয় নির্ভুলতা পাচ্ছি যা আমি প্রয়োজন এবং জিপিএস রেডিওটি প্রয়োজনীয়তার চেয়ে বেশি রেখে আমি ব্যাটারিটি চালাচ্ছিলাম না।

আমি নিম্নলিখিত সেটিংস সহ স্থিরভাবে চলমান রাখি:

locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
locationManager.distanceFilter = 5;

এটি ব্যাটারির তুলনামূলকভাবে কম ড্রেন। আমি যখন আমার পরবর্তী পর্যায়ক্রমের লোকেশন পঠন করতে প্রস্তুত হই, আমি প্রথমে অবস্থানটি আমার পছন্দসই নির্ভুলতার মধ্যে রয়েছে কিনা তা পরীক্ষা করে দেখি, যদি হয় তবে আমি পরে অবস্থানটি ব্যবহার করি। যদি তা না হয় তবে আমি এর সাথে যথাযথতা বাড়িয়ে তুলব:

locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
locationManager.distanceFilter = 0;

আমার অবস্থানটি পান এবং তারপরে একবার আমার কাছে অবস্থান উপস্থিত হয়ে আমি ব্যাটারির ড্রেনটি ছোট করতে পুনরায় নির্ভুলতাটি আবার ফিরিয়ে ফেলি। আমি এর একটি সম্পূর্ণ কার্যকারী নমুনা লিখেছি এবং সার্ভার সাইড কোডের জন্য লোকেশন ডেটা সংগ্রহ করতে, এটি একটি ডাটাবেসে সঞ্চয় করতে এবং ব্যবহারকারীদের রিয়েল টাইমে জিপিএস ডেটা দেখতে বা পূর্ববর্তী সঞ্চিত রুটগুলি পুনরুদ্ধার করতে ও দেখার জন্য উত্সটি লিখেছি। আমার কাছে আইওএস, অ্যান্ড্রয়েড, উইন্ডোজ ফোন এবং জাভা এর ক্লায়েন্ট রয়েছে। সমস্ত ক্লায়েন্ট স্থানীয়ভাবে লিখিত এবং তারা সমস্ত পটভূমিতে সঠিকভাবে কাজ করে। প্রকল্পটি এমআইটি লাইসেন্সযুক্ত।

আইওএস প্রকল্পটি আইওএস 6 এর জন্য আইওএস 6 এর বেস এসডিকে ব্যবহার করে টার্গেট করা হয়েছে You আপনি কোডটি এখানে পেতে পারেন

আপনি যদি এতে কোনও সমস্যা দেখেন তবে দয়া করে গিথুবে একটি সমস্যা ফাইল করুন। ধন্যবাদ।


আমি আপনার সমাধানটি চেষ্টা করেছিলাম, কিন্তু কাজ করছি না ... যখন অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে যায় তখনও নির্ভুলতা বাড়ার পরেও অ্যাপটি আমার ক্ষেত্রে ডুডপেটটল লোকেশন পদ্ধতি নামে পরিচিত না
হার্ডিক দারজি

@ হার্দিকদারজি গুরুত্বপূর্ণ প্রশ্ন। আপনি চলছেন? যদি তা না হয় তবে অবস্থানের আপডেটগুলি বন্ধ হতে পারে। হাঁটতে বা ড্রাইভের জন্য আপনার ফোনটি বাইরে নিয়ে যাওয়ার চেষ্টা করুন এবং দেখুন এটি ঠিক করে দিয়েছে কিনা।
নিকফক্স

দ্রুত সাড়া দেওয়ার জন্য আপনাকে ধন্যবাদ। তবে আমি প্রতি 2 মিনিটের মধ্যে লোকেশন আপডেটগুলি চাই, আমার ফোন যত্ন না করেই চলমান বা না চলে। এই দৃশ্যে didUpdateToLocation পদ্ধতি বলা হয় না। আমি এখানে খুঁজছি: প্রতি এন মিনিটে আমি কীভাবে অবস্থান আপডেট করব !!!
হার্ডিক দার্জি

টাইমআইন্টারওয়ালআইসেকেন্ডসকে 120 এ সেট করার চেষ্টা করুন এবং এই লাইনটি আপত্তিহীন করুন: লোকেশন ম্যানেজার.পেজস লোকেশনউপডেটস অটোমেটিক = না;
নিকফক্স

1
উপরের মন্তব্যে আপনি যে সমাধান পোস্ট করেছেন তা কি ব্যাটারির জীবনকে মেরে ফেলেছে বা আপনি এখনও এর জন্য কিছু অপ্টিমাইজেশন করছেন?
samfr

2

দেখে মনে হয় যে স্টপআপডেটিং লোকেশন ব্যাকগ্রাউন্ড ওয়াচডগ টাইমারকে ট্রিগার করে, তাই আমি এটির সাথে ডুআপডেটলোকেশনটি প্রতিস্থাপন করেছি:

     [self.locationManager setDesiredAccuracy:kCLLocationAccuracyThreeKilometers];
     [self.locationManager setDistanceFilter:99999];

যা কার্যকরভাবে জিপিএসকে শক্তিশালী করে বলে মনে হচ্ছে। ব্যাকগ্রাউন্ডের জন্য নির্বাচক NSTimer হয়ে যায়:

- (void) changeAccuracy {
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[self.locationManager setDistanceFilter:kCLDistanceFilterNone];
}

আমি যা করছি তা প্রতি কয়েক মিনিটের মধ্যে উচ্চ-নির্ভুলতার সমন্বয় পেতে যথাযথভাবে টগল করছে এবং লোকেশন ম্যানেজারটি বন্ধ করা হয়নি বলে, ব্যাকগ্রাউন্ডটাইমরেমাইনিং তার সর্বোচ্চ মান ধরে। এটি আমার ডিভাইসে প্রতি ঘণ্টায় 10% থেকে constant 10% (পটভূমিতে ধ্রুবক কেসিএল লোকেশনঅ্যাকিউরসিস্টেস্ট সহ) hour 2% এ হ্রাস পেয়েছে


2

একটি কোকোপড APSched ્યૂ ডলোকেশনম্যানেজার রয়েছে যা পছন্দসই অবস্থানের যথাযথতার সাথে প্রতি এন সেকেন্ডে পটভূমির অবস্থান আপডেটগুলি পেতে দেয় ।

let manager = APScheduledLocationManager(delegate: self)
manager.startUpdatingLocation(interval: 170, acceptableLocationAccuracy: 100)

ভান্ডারটিতে সুইফট 3-এ লিখিত একটি উদাহরণ অ্যাপ রয়েছে।


আপনার উদ্দেশ্য গ মধ্যে এই জাতীয় কিছু আছে?
Moxarth

1

আইওএস 9 এবং ওয়াচওএস 2.0 তে CLLocationManager এ একটি নতুন পদ্ধতি রয়েছে যা আপনাকে বর্তমান অবস্থার জন্য অনুরোধ করতে দেয়: CLLocationManager: অনুরোধের অবস্থান ()। এটি অবিলম্বে সম্পূর্ণ হয় এবং তারপরে অবস্থানটি CLLocationManager প্রতিনিধিকে ফিরিয়ে দেয়।

আপনি এখন এই পদ্ধতিটি সহ প্রতি মিনিটে কোনও জায়গার জন্য অনুরোধ করতে একটি এনএসটিমার ব্যবহার করতে পারেন এবং স্টার্টআপডেটিং অবস্থান এবং স্টপআপডেটিং অবস্থানের পদ্ধতিতে কাজ করতে হবে না।

তবে আপনি যদি সর্বশেষ অবস্থান থেকে এক্স মিটার পরিবর্তনের ভিত্তিতে অবস্থানগুলি ক্যাপচার করতে চান তবে কেবলমাত্র CLLocationManger এর দূরত্ব ফিল্টার সম্পত্তি এবং এক্স কল স্টার্টআপডেটিং লোকেশন () সেট করুন।


-1

সংযুক্তি এটিতে ভিত্তিক একটি সুইফট সমাধান:

নির্ধারণ করা App registers for location updatesতথ্য.পুলিস্টে

লোকেশন ম্যানেজারটি সর্বদা চলমান রাখুন

(অবস্থানটি পেতে 5 সেকেন্ডের জন্য) এবং এর kCLLocationAccuracyমধ্যে স্যুইচ করুনBestForNavigationThreeKilometers এড়ানোর ব্যাটারি নিষ্কাশন প্রতীক্ষায় সময়ের বাকি জন্য

এই উদাহরণটি অগ্রভাগের প্রতি 1 মিনিটে এবং পটভূমিতে প্রতি 15 মিনিটে অবস্থান আপডেট করে।

উদাহরণটি এক্সওড 6 বিটা 6 এর সাথে দুর্দান্ত কাজ করে যা কোনও আইওএস 7 ডিভাইসে চলছে।

অ্যাপ ডেলিগেটে (ম্যাপভিউ মানচিত্র ভিউ কন্ট্রোলারের দিকে poinচ্ছিক নির্দেশক)

func applicationDidBecomeActive(application: UIApplication!) {
    if appLaunched! == false { // Reference to mapView used to limit one location update per timer cycle
        appLaunched = true
        var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        var window = appDelegate.window
        var tabBar = window?.rootViewController as UITabBarController
        var navCon = tabBar.viewControllers[0] as UINavigationController
        mapView = navCon.topViewController as? MapViewController
    }
    self.startInitialPeriodWithTimeInterval(60.0)
}

func applicationDidEnterBackground(application: UIApplication!) {
    self.startInitialPeriodWithTimeInterval(15 * 60.0)
}

func startInitialPeriodWithTimeInterval(timeInterval: NSTimeInterval) {
    timer?.invalidate() // reset timer
    locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("getFirstLocationUpdate:"), userInfo: timeInterval, repeats: false)
}

func getFirstLocationUpdate(sender: NSTimer) {
    let timeInterval = sender.userInfo as Double
    timer?.invalidate()
    mapView?.canReportLocation = true
    timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("waitForTimer:"), userInfo: timeInterval, repeats: true)
}

func waitForTimer(sender: NSTimer) {
    let time = sender.userInfo as Double
    locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    finalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("getLocationUpdate"), userInfo: nil, repeats: false)
}

func getLocationUpdate() {
    finalTimer?.invalidate()
    mapView?.canReportLocation = true
}

মানচিত্রের ভিউতে (লোকেশন ম্যানেজার অ্যাপডেলিগেটে বস্তুটির দিকে নির্দেশ করে)

override func viewDidLoad() {
    super.viewDidLoad()
    var appDelegate = UIApplication.sharedApplication().delegate! as AppDelegate
    locationManager = appDelegate.locationManager!
    locationManager.delegate = self
    canReportLocation = true
}

  func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        if canReportLocation! {
            canReportLocation = false
            locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
        } else {
            //println("Ignore location update")
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.