2

3G / 4G / LTE(WiFiではない)を使用して、5〜10分ごとに、または場所が変更されたときに、その場所をバックグラウンドからサーバーにアップロードするようにiOS7デバイスを作成したいと考えています。

私がすでに試したことは次のようなものです:

1.バックグラウンドフェッチ

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler非常に不規則に呼び出され、制御できません。

2.リモート通知(サイレントプッシュではありません)

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandlerWiFi 接続でのみ呼び出されます。

3.CLLocationManager

アップローダーを入れまし- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocationたが、WiFiのみで呼び出されます。

Appleネイティブアプリである「友達を探す」のようなアプリをiOS8で実現したいです。何かアイデアはありますか?

ご協力ありがとうございました。

アップデート

NSURLSession upload以下のようにトリガーしてみましCLLocationManager didUpdateToLocationたが、それでもWiFiでのみアップロードされます。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{

[[NSUserDefaults standardUserDefaults] setFloat:newLocation.coordinate.latitude forKey:@"lat"];
[[NSUserDefaults standardUserDefaults] setFloat:newLocation.coordinate.longitude forKey:@"lon"];
[[NSUserDefaults standardUserDefaults] synchronize];

[self update];

}

- (void)update
{

NSURL *url = [NSURL URLWithString:@"http://.../updater.php"];
NSString *identifier = [NSDate date].description;
NSURLSessionConfiguration *configration = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
configuration.networkServiceType = NSURLNetworkServiceTypeBackground;
configuration.discretionary = NO;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"PUT";
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
                                                      delegate:self
                                                 delegateQueue:[NSOperationQueue mainQueue]];

float lat = [[NSUserDefaults standardUserDefaults] floatForKey:@"lat"];
float lon = [[NSUserDefaults standardUserDefaults] floatForKey:@"lon"];

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSNumber numberWithFloat:lat], @"lat",
                            [NSNumber numberWithFloat:lon], @"lon", nil];

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil];

NSString *path = [[self applicationDocumentsDirectory].path stringByAppendingPathComponent:@"json.data"];
[data writeToFile:path atomically:YES];

NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromFile:[NSURL fileURLWithPath:path]];

[task resume];

}

- (NSURL *)applicationDocumentsDirectory
{

// The directory the application uses to store the Core Data store file. This code uses a directory named "jp.skyElements.NNZ" in the application's documents directory.
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

}
4

1 に答える 1

0

アプリが場所の変更について通知を受けることができるバックグラウンドの場所更新モードがあります。詳細についてBackground Modesは、iOS の Xcode ドキュメントのセクションを参照してください。

現在、バックグラウンドでの位置情報の更新中にネットワーク リクエストを実行しようとしたことはありませんが、次のことを試してみます。

NSURLSessionバックグラウンド設定あり。サーバーに POST し、これのすべての負担を iOS 自体に委任します。QoS、ネットワーク スロットリング、電力効率、およびその他の利点は、これから生まれます。

于 2014-12-13T14:35:19.250 に答える