2016-11-08 23 views
5

Tôi có một ứng dụng gửi dữ liệu đến máy chủ trong khi ứng dụng ở chế độ nền. Đây là mã chịu trách nhiệm gửi dữ liệu:Dữ liệu không được gửi từ nền thông qua 3G

-(bool) sendStats: (MCStatsSender*) val{ 

    if(![self checkInternet]){ //Using Reachability here 

     return false; 
    } 

    NSDictionary *inputData = [NSDictionary dictionaryWithObjectsAndKeys: 
           self.propertyA.value, "key1", 
           val.data, "key2", 
           nil]; 


    [myNetworkManager doRequest:[myRequestManager createWithStringAndDictionary:MY_URL Data:inputData handler:myHandler user:val]]; 
    return true; 
} 

Vì vậy, inputData là từ điển đơn giản có chuỗi.

Một phương pháp doRequest được dựa trên một NSURLSession và về cơ bản trông như thế này:

-(void) doRequest: (MCRequest*) request{ 

    [tasks addObject:request]; 

    if(m_session == nil){ 
     NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"key-%lu",reqid]]; 
     m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
    } 

    NSURLSessionDataTask* task = [m_session dataTaskWithRequest:request.generatedRequest]; 
    request.reqId = task.taskIdentifier; 
    [task resume]; 
} 

Như tôi đã nói, mọi thứ hoạt động thông qua Wi-Fi, ứng dụng đi vào nền, và sau vài phút, một thiết bị bluetooth tùy chỉnh gửi một số dữ liệu và đánh thức ứng dụng từ chế độ bị tạm ngưng. Sau khi ứng dụng iOS nhận được dữ liệu, nó không gửi được đến máy chủ nếu thiết bị được kết nối qua 3G. Tôi tích cực rằng dữ liệu được gửi qua bluetooth được nhận vì nó được lưu trữ trong cơ sở dữ liệu cục bộ.

Ngoài ra còn có một thực tế quan trọng khác. Nếu một ứng dụng được chạy qua Xcode, ngay cả khi thiết bị được kết nối qua 3G, ứng dụng sẽ gửi dữ liệu từ nền. Để thực hiện việc này, tôi chạy một ứng dụng, sau đó nhấn vào nút Trang chủ để đưa vào nền.

Không biết sự khác biệt là gì và tại sao ứng dụng hoạt động khác khi được gắn cáp với máy Mac và tại sao dữ liệu không được gửi qua 3G (hoặc thậm chí 2G)?

Thông tin bổ sung:

Tôi không cố gắng tải tệp lên, mà chỉ gửi JSON tới máy chủ.

+0

sau bao nhiêu thời gian bạn có dữ liệu bluetooth trong thiết bị của mình ?? – CodeChanger

+0

@CodeChanger Ứng dụng đang nhận dữ liệu từ bluetooth sau mỗi năm phút hoặc ít hơn. Tôi chắc chắn rằng dữ liệu từ một bluetooth được nhận bởi vì tôi lưu trữ nó trong một cơ sở dữ liệu sqlite địa phương. – Whirlwind

+0

Ok như vậy theo kiến ​​thức của tôi sau khi ứng dụng 3.0 Min bị tạm ngưng và bạn phải xử lý chế độ đó và gọi dịch vụ của bạn bằng 'bgTask'. – CodeChanger

Trả lời

4

Dường như đây là cách sử dụng năng lượng. Việc tải lên nền được cung cấp bởi phiên URL là một tiện lợi, và nó được cung cấp cho bạn tại sự đàn áp của hệ điều hành - nó cung cấp để gửi dữ liệu nhưng nó được chọn khi nào.

Những điều ảnh hưởng đến thời điểm dữ liệu được gửi bao gồm kết nối thiết bị với nguồn điện, chất lượng kết nối dữ liệu (mất bao lâu để gửi dữ liệu), thiết bị khác đang làm gì (có thể kết hợp nhiều video tải lên) ...

Vì vậy, bạn không thể đoán hoặc dựa vào bất kỳ tác vụ nào đang được thực hiện tại bất kỳ thời điểm cụ thể nào trong khi ở chế độ nền.

Loại thử nghiệm này chỉ nên được thực hiện trên thiết bị và không được kết nối với Xcode vì nó ảnh hưởng đến thử nghiệm. Thay vào đó, hãy sử dụng một cái gì đó giống như Charles proxy để ghi lại các yêu cầu mạng và sử dụng thiết bị, để nó trong một khoảng thời gian và có thể mở và sử dụng một số ứng dụng khác. Bạn sẽ thấy dữ liệu được gửi cuối cùng, nhưng bạn sẽ phải đợi.

+0

Vâng, tôi đã nghiên cứu và đào sâu thêm về điều này, và đó là về sức mạnh và Wi-Fi chủ yếu là hai yếu tố chính khi iOS xác định xem ứng dụng có ở trạng thái tốt để thực hiện các tác vụ tùy ý hay không. Tất nhiên, có một số yếu tố khác nữa, như bạn đã nói ... – Whirlwind

+0

Tuy nhiên, vấn đề là không có dữ liệu nào được gửi nếu ứng dụng ở chế độ nền, không sau 1 phút, không sau 1 giờ. Vấn đề là tôi không phải là người đã viết một lớp xử lý các yêu cầu, vì vậy tôi không thể chắc chắn 100% vào lúc này mọi thứ được cấu hình đúng (hy vọng bản thân lớp đó là vấn đề).Tôi sẽ thực hiện một số xét nghiệm và cho bạn biết về kết quả. Tôi đã thử nghiệm trên một thiết bị kết nối với máy tính chỉ để xem nếu pin có cái gì với điều này. Tất nhiên, tôi sẽ ngắt kết nối một thiết bị sau này. – Whirlwind

+0

Tôi vừa thử một proxy Charles cho vui, đây là một ứng dụng tiện dụng, nhưng nó không phải là hữu ích trong trường hợp của tôi. Bởi vì nó đòi hỏi một kết nối Wi-Fi. Yêu cầu mạng của tôi được gửi (như tôi đã đề cập trong câu hỏi của tôi) khi thiết bị được kết nối qua Wi-Fi. Vấn đề là với kết nối di động (3G). Dù sao, tôi không thực sự cần ứng dụng đó, bởi vì tôi đã thấy trên máy chủ của tôi nếu một yêu cầu thành công hay không. Tôi nghĩ rằng tôi sẽ thử nghiệm một chút với NSURLSession, cấu hình và nhiệm vụ nền của nó. – Whirlwind

Các vấn đề liên quan