Ứ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?
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
@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
@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