私は参加している小売店でバーコードをスキャンするための iOS アプリを作成しています。顧客が領収書に印刷された QR コードをスキャンした後、その場所が顧客に代わって慈善団体に寄付します。
ユーザーが参加している場所に 60 秒以上滞在した場合にローカル通知を送信して、そこで購入したレシートをスキャンするように促したいと考えています。
私の問題は、ユーザーが地域に入ったときに呼び出しを 60 秒遅らせたいということです.60 秒後にまだその地域にいる場合は、ローカル通知を送信します.アプリがフォアグラウンドに戻るまで起動します。これは、遅延が発生する前にスレッドが終了することがあることに関係していると思いますが、よくわかりません。stackoverflow や他の場所 (ブロック、nstimer など) で見つけることができるすべてのアプローチを試しましたが、役に立ちませんでした。この問題へのより良いアプローチ方法についてのアイデアはありますか?
- (void) sendLocalNotification:(NSString *)regionId {
NSLog(@"we entered %@ and we're currently in %@", regionId, self.currentRegionId);
if ([regionId isEqualToString:self.currentRegionId]) {// if we're still in the region, send a local notification
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil) return;
NSDate *fireTime = [[NSDate date] addTimeInterval:2]; // adds 2 secs
localNotif.fireDate = fireTime;
localNotif.alertBody = [NSString stringWithFormat:@"Did you just visit %@? If so, don't forget to scan your receipt!", regionId];
localNotif.applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber+1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
[localNotif release];
}
}
- (void) stillInRegion:(CLRegion *)region {
NSLog(@"did enter region: %@", region.identifier);
[self performSelector:@selector(sendLocalNotification:) withObject:region.identifier afterDelay:60];
}
- (void) locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
if (self.didLaunchForRegionUpdate) {
NSString *path = [DGGeofencingHelper applicationDocumentsDirectory];
NSString *finalPath = [path stringByAppendingPathComponent:@"notifications.dg"];
NSMutableArray *updates = [NSMutableArray arrayWithContentsOfFile:finalPath];
if (!updates) {
updates = [NSMutableArray array];
}
NSMutableDictionary *update = [NSMutableDictionary dictionary];
[update setObject:region.identifier forKey:@"fid"];
[update setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]] forKey:@"timestamp"];
[update setObject:@"enter" forKey:@"status"];
[updates addObject:update];
[updates writeToFile:finalPath atomically:YES];
} else {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"enter" forKey:@"status"];
[dict setObject:region.identifier forKey:@"fid"];
NSString *jsStatement = [NSString stringWithFormat:@"DGGeofencing.regionMonitorUpdate(%@);", [dict JSONString]];
[self.webView stringByEvaluatingJavaScriptFromString:jsStatement];
}
self.currentRegionId = region.identifier;
self.cRegionEnterTime =[NSDate date];
[self stillInRegion:region];
}