2012-05-10 25 views
7

Ứng dụng của tôi bị từ chối bởi Apple ba lần, tất cả bằng chữ từ chối cùng, đó là:Làm thế nào để sử dụng đúng vị trí trong nền - Ứng dụng đã từ chối 3 lần

Chúng tôi thấy rằng ứng dụng của bạn sử dụng một chế độ nền nhưng không bao gồm chức năng yêu cầu chế độ đó chạy liên tục. Hành vi này không tuân thủ Nguyên tắc đánh giá của App Store.

Chúng tôi nhận thấy ứng dụng của bạn tuyên bố hỗ trợ vị trí trong khóa UIBackgroundModes trong Info.plist của bạn nhưng không bao gồm các tính năng yêu cầu vị trí liên tục.

Sẽ thích hợp để thêm các tính năng yêu cầu cập nhật vị trí trong khi ứng dụng ở chế độ nền hoặc xóa cài đặt "vị trí" từ khóa UIBackgroundModes.

Nếu bạn chọn để thêm tính năng sử dụng chế độ Location nền, xin kèm theo khuyến cáo sử dụng pin sau trong ứng dụng của bạn Mô tả:

"Tiếp tục sử dụng GPS đang chạy trong nền có thể đột ngột giảm tuổi thọ pin . "

Để biết thông tin về các chế độ nền, vui lòng tham khảo phần "Thực thi mã trong nền" trong Thư viện tham khảo iOS.

Bây giờ, như xa như tôi biết tôi đang chạy trên nền và "làm một cái gì đó" ... Trong appdelegate của tôi, tôi đã đoạn mã sau vào didFinishLaunchingWithOptions:

if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsLocationKey] && 
    ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])) 
{ 
    id locationInBackground = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]; 
    if ([locationInBackground isKindOfClass:[CLLocation class]]) 
    { 
     [self updateMyLocationToServer:locationInBackground]; 
    } 
    else 
    { 
     //Keep updating location if significant changes 
     CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
     self.bgLocationManager = locationManager; 
     self.bgLocationManager.delegate = self; 
     self.bgLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
     [bgLocationManager startMonitoringSignificantLocationChanges]; 
    } 
} 

Các appdelegate cũng bắt đầu một người quản lý vị trí và tự mình làm đại biểu. Sau đó, tôi có đoạn mã sau để xử lý các bản cập nhật vị trí trên nền:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    [self updateMyLocationToServer:newLocation]; 
} 


-(void)updateMyLocationToServer:(CLLocation*)myNewLocation 
{ 
    // NSLog(@"Updating Location from the background"); 

    NSString *fbID = [NSString stringWithString:[facebookDetails objectForKey:@"fbID"]]; 
    NSString *firstName = [NSString stringWithString:[facebookDetails objectForKey:@"firstName"]]; 
    NSString *lastName = [NSString stringWithString:[facebookDetails objectForKey:@"lastName"]]; 

    NSString *urlString = [NSString stringWithFormat:@"MY_SERVER_API", fbID, myNewLocation.coordinate.latitude, myNewLocation.coordinate.longitude, firstName, lastName]; 


    NSURL *url = [NSURL URLWithString:urlString]; 

    __block ASIHTTPRequest *newRequest = [ASIHTTPRequest requestWithURL:url]; 

    [newRequest setCompletionBlock:^{ 


    }]; 

    [newRequest setFailedBlock:^{ 

    }]; 

    // [newRequest setDelegate:self]; 
    [newRequest startAsynchronous]; 
} 

Tôi cũng đặt một từ chối trách nhiệm trong trang mô tả ứng dụng của tôi:

chuyên sâu sử dụng GPS đang chạy trong nền có thể làm giảm đáng kể tuổi thọ pin. Vì lý do này, MY_APP_NAME chạy trên nền chỉ lắng nghe những thay đổi đáng kể về vị trí.

Có điều gì tôi thiếu ở đây không?

+0

Không phải 'chế độ nền' có nghĩa là một cái gì đó vẫn đang chạy sau khi người dùng đã thoát khỏi ứng dụng? – cgull

+0

@thephpdeveloper Cảm ơn bạn đã nói với tôi. Khá mới mẻ đối với StackOverflow, tôi không biết hệ thống này. – Giovanni

+0

@cgull Tôi không chắc chắn. Ý tôi là, không đăng ký để cập nhật vị trí đủ tốt? Sau đó, khi có một vị trí mới, ứng dụng của tôi được đánh thức vào trạng thái hoạt động nền, và sau đó tôi có cơ hội để làm điều gì đó, như đăng nhập vị trí mới của tôi vào máy chủ của tôi. Đó là những gì tôi nghĩ ... – Giovanni

Trả lời

4

Trong vị tríManager: didUpdateToLocation: fromLocation: hoặc trong bản cập nhậtMyLocationToServer: Bạn nên kiểm tra xem ứng dụng có ở trạng thái nền hay không.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground 

Và sau đó nếu ứng dụng của bạn ở chế độ nền Bạn nên sử dụng ví dụ:

backgroundTask = [[UIApplication sharedApplication] 
        beginBackgroundTaskWithExpirationHandler: 
        ^{ 
         [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
        }]; 

/*Write Your internet request code here*/ 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
    bgTask = UIBackgroundTaskInvalid; 
} 

Ứng dụng theo cách này nên thực hiện tác vụ này hoàn toàn.

+6

Ứng dụng của bạn có được chấp nhận bằng cách thêm mã này không? – theDuncs

+1

Không có điểm nào trong việc cố gắng kết thúcBackgroundTask bên trong trình xử lý hết hạn, ứng dụng đã kết thúc sau khi hết hạn – malhal

+1

Nghe @ Malhal nhận xét về nguy hiểm của chính bạn! Từ tài liệu của Apple: * Bạn nên sử dụng trình xử lý này để dọn dẹp và đánh dấu sự kết thúc của tác vụ nền. ** Không kết thúc tác vụ một cách rõ ràng sẽ dẫn đến việc chấm dứt ứng dụng. *** https://developer.apple.com/reference/uikit/uiapplication/1623031-beginbackgroundtask – mxcl

7

Câu hỏi này là cũ và đã trả lời nhưng bạn không cần chìa khóa UIBackgroundModes nếu bạn thu thập các địa điểm sử dụng startMonitoringSignificantLocationChanges API

+0

Tôi nhận được sự từ chối giống như đã nêu ở trên nhưng khi tôi đưa ra Các chế độ UIBackground, startMonitoringSignificantLocationChanges của tôi không bao giờ được gọi và tôi thấy mũi tên điều hướng trong thanh hệ thống biến mất. Có suy nghĩ gì không? –

+0

Tôi đề nghị bạn tạo một câu hỏi mới với tất cả các chi tiết về những gì bạn đang làm và một số mẫu mã. Phạm vi quá rộng đối với nhận xét 500 ký tự. Nếu bạn đăng liên kết câu hỏi của mình ở đây dưới dạng nhận xét, tôi sẽ xem xét nó. Nó sẽ làm việc cho bạn. Nó làm việc cho tôi. – jackslash

1

startMonitoringSignificantLocationChanges không yêu cầu đăng ký chế độ nền. Chỉ những thay đổi vị trí liên tục mới thực hiện được.

+0

Tại sao bạn lại cung cấp cùng một câu trả lời chính xác một lần nữa (http://stackoverflow.com/questions/12690459/apple-rejection-because-uibackgroundmode-location), vui lòng tham khảo câu trả lời của bạn không chỉ làm một bản sao trực tiếp. Và bình luận vẫn còn từ câu trả lời khác. Đây không thực sự là câu trả lời và trường hợp này thậm chí không trả lời câu hỏi -1 – Popeye

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