2012-08-08 9 views
10

Có thể thực hiện yêu cầu HTTP không đồng bộ với máy chủ PHP trong khi ứng dụng đang ở chế độ nền? Ứng dụng là vị trí dựa trên một vị trí và phải thu thập vị trí hiện tại và gửi tọa độ tới máy chủ sau mỗi 5 phút (hoặc giá trị khác). Tôi có thể tạo các bài đăng http lên máy chủ ngay cả khi ứng dụng ở chế độ nền không? Tôi đọc rất nhiều suy nghĩ về điều này, nhưng một số người trong số họ nói rằng có thể được thực hiện, những người khác mà không thể được thực hiện.Yêu cầu HTTP iOS trong khi ở chế độ nền

Xin cảm ơn,

Alex.

+0

Trước hết, không bao giờ cố gắng và thu thập các vị trí trên một thời điểm cố định . Điều này sẽ tiêu hao pin. Chỉ cần bắt đầu danh sách các thay đổi vị trí chính và nếu những thay đổi này xảy ra thì hãy gửi vị trí mới đến máy chủ. Nếu bạn cần một vị trí chính xác hơn, hãy bắt đầu GPS khi thay đổi vị trí chính xảy ra và dừng GPS khi bạn có vị trí chính xác đủ cho các yêu cầu của mình. Sau đó gửi dữ liệu đến máy chủ. – rckoenes

+2

Đây là cách tôi đã thực hiện, tôi bắt đầu cập nhật vị trí, nhận vị trí, dừng cập nhật vị trí, gửi yêu cầu tới máy chủ, bắt đầu lại cập nhật vị trí sau 5 phút, nhận vị trí, dừng, v.v. để gửi yêu cầu nếu ứng dụng ở chế độ nền? Cảm ơn bạn. –

Trả lời

16

Nó có thể được thực hiện nhưng nó không đáng tin cậy vì bạn yêu cầu hệ điều hành để có thời gian gửi một cái gì đó và nó có thể chấp nhận hoặc từ chối yêu cầu của bạn. Đây là những gì tôi đã (bị đánh cắp từ một nơi nào trên SO):

[...] //we get the new location from CLLocationManager somewhere here  
BOOL isInBackground = NO; 
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    isInBackground = YES; 
} 
if (isInBackground) 
{ 
    [self sendBackgroundLocationToServer:newLocation]; 
} 


- (void) sendBackgroundLocationToServer: (CLLocation *) lc 
{ 
    UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid; 
    bgTask = [[UIApplication sharedApplication] 
     beginBackgroundTaskWithExpirationHandler:^{ 
      [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    }]; 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:2]; 
    [dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.latitude] forKey:@"floLatitude"]; 
    [dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.longitude] forKey:@"floLongitude"]; 
    // send to server with a synchronous request 


    // AFTER ALL THE UPDATES, close the task 
    if (bgTask != UIBackgroundTaskInvalid) 
    { 
     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    } 
} 
+0

Cảm ơn bạn rất nhiều, tôi tuyên bố bạn là nhà phát triển của năm :). Vì vậy, về cơ bản, nó có thể làm việc một số lần và những người khác thì không, phụ thuộc vào hệ điều hành. –

+0

tôi có thể kiểm tra nó trong trình mô phỏng không. – Dilip

+3

Đó là 'isInBackground' là hoàn toàn không cần thiết. – 2rs2ts

3

Các liên kết này sẽ giúp bạn ra ngoài ...

iphone - Connecting to server in background

+0

Cảm ơn, là những gì vakio gợi ý, nhưng không có mã: d. Tôi nghĩ rằng phương pháp beginBackgroundTaskWithExpirationHandler sẽ giải quyết vấn đề của tôi. –