Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C:应用程序带有提醒,即使应用程序被关闭或手机重新启动也能正常工作_Ios_Objective C_Uibackgroundmode - Fatal编程技术网

Ios Objective-C:应用程序带有提醒,即使应用程序被关闭或手机重新启动也能正常工作

Ios Objective-C:应用程序带有提醒,即使应用程序被关闭或手机重新启动也能正常工作,ios,objective-c,uibackgroundmode,Ios,Objective C,Uibackgroundmode,在下面的代码中,我设法每15秒触发一次checkSchedule方法(出于测试目的),checkSchedule将发送一个API,然后检查是否有预约。如果connectionFinishLoading检测到结果,它将通知用户 如果应用程序位于前台或后台,当前代码将起作用 但是,我希望在应用程序被关闭或手机重新启动且应用程序未启动时使其工作。基本上,该功能类似于Any.do应用程序(提醒应用程序),即使应用程序被关闭或手机重新启动,也会触发提醒。非常感谢您的指点和帮助 @AppDelegate.m

在下面的代码中,我设法每15秒触发一次
checkSchedule
方法(出于测试目的),
checkSchedule
将发送一个API,然后检查是否有预约。如果
connectionFinishLoading
检测到结果,它将通知用户

如果应用程序位于前台或后台,当前代码将起作用

但是,我希望在应用程序被关闭或手机重新启动且应用程序未启动时使其工作。基本上,该功能类似于
Any.do
应用程序(提醒应用程序),即使应用程序被关闭或手机重新启动,也会触发提醒。非常感谢您的指点和帮助

@AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [self startTimerLoop];

    return YES;
}

//==== This loop will run every hour and call Check Schedule,
//==== It will break the 3 min barrier
-(void)startTimerLoop{
    //NSLog(@"Hi I am in the timer .. %@ ", [NSDate date]);
    [objTimer invalidate];
    objTimer = nil;

    //===repeat every 15 secs for testing purposes
    bgTask = UIBackgroundTaskInvalid;
    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{}];
    objTimer = [NSTimer scheduledTimerWithTimeInterval:15 target:self   selector:@selector(checkSchedule) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:objTimer forMode:UITrackingRunLoopMode];

}

//=== Check from 2 hours from now if there is any classes
//=== it will send and web API and is it return a result,
//=== it will notify the user
-(void)checkSchedule{

    //=== Initialize the responseData Mutable Data
    self.responseData = [NSMutableData data];

    //=== Call the stored txtMemCode, something like session ---
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *sMemCode = [defaults objectForKey:@"txtMemCode"];

    NSDate *now = [NSDate date];
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"HH:mm"];
    NSString *sTime = [outputFormatter stringFromDate:now];
    sTime = [sTime stringByReplacingOccurrencesOfString:@":" withString:@"%3A"];
    //====Check from 2 hours from now====
    NSTimeInterval secInTwoHours = 2*60*60; //=== sec in 2 hours
    NSDate *twoHoursAhead = [now dateByAddingTimeInterval:secInTwoHours];
    NSString *sTime2Hours = [outputFormatter stringFromDate:twoHoursAhead];
    sTime2Hours = [sTime2Hours stringByReplacingOccurrencesOfString:@":" withString:@"%3A"];

    if (sMemCode != nil) {
        //=== Pass the string to web and get the return State response.write
        sURL = gURL;
        sURL = [sURL stringByAppendingString:@"/apps/checkBooking.asp?"];
        sURL = [sURL stringByAppendingString:@"memCode="];
        sURL = [sURL stringByAppendingString:sMemCode];
        sURL = [sURL stringByAppendingString:@"&tocheck="];
        sURL = [sURL stringByAppendingString:sTime];
        sURL = [sURL stringByAppendingString:@"&tocheck2="];
        sURL = [sURL stringByAppendingString:sTime2Hours];

        NSLog(@" The sURL : %@ ", sURL);

        NSURLRequest *requestState = [NSURLRequest requestWithURL:[NSURL URLWithString:sURL]];

        (void) [[NSURLConnection alloc] initWithRequest:requestState delegate:self];
    }
}

//=== This getting the return results from the called API.
//=== If there is a result, it will notify the user.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"connectionDidFinishLoading");
    NSLog(@"=========Succeeded! Received %d bytes of data",[self.responseData length]);

    NSString *sResponseData = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
    NSLog(@"=======*************** This Response.write stuff %@", sResponseData);

    NSString *sSeparator= @"|";

    NSRange range = [sResponseData rangeOfString:sSeparator];
    NSInteger position = range.location + range.length;
    NSString *sRecords = [sResponseData substringToIndex:position-1];
    NSString *sRemaining = [sResponseData substringFromIndex:position];

    if ([sRecords isEqualToString:@"0"]){
        NSLog(@" There is no classes ");
    }else {
        range = [sRemaining rangeOfString:sSeparator];
        position = range.location + range.length;
        NSString *sMessage = [sRemaining substringToIndex:position-1];
        NSString *sTime = [sRemaining substringFromIndex:position];

        NSString *sBody = sMessage;
        sBody = [sBody stringByAppendingString:@" "];
        sBody = [sBody stringByAppendingString:sTime];

        UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];

        content.title = [NSString localizedUserNotificationStringForKey:@"Class Reminder!"
                                                          arguments:nil];

        content.body = [NSString localizedUserNotificationStringForKey:sBody
                                                         arguments:nil];
        content.sound = [UNNotificationSound defaultSound];

        UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];

        UNNotificationRequest *notificationRequest = [UNNotificationRequest requestWithIdentifier:@"NotificationIdentifier" content:content trigger:trigger];

        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center addNotificationRequest:notificationRequest
             withCompletionHandler:^(NSError * _Nullable error) {
                 NSLog(@"completed!");
         }];
    }

    [[UIApplication sharedApplication] endIgnoringInteractionEvents];

}

必须按照Firebase的说明设置远程通知

// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
   willPresentNotification:(UNNotification *)notification
     withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
// Print message ID.
NSDictionary *userInfo = notification.request.content.userInfo;
if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"**3 :  Message ID: %@", userInfo[kGCMMessageIDKey]);
}

// Print full message.
NSLog(@" **4 : %@", userInfo);

//==== This will show the notification while APP is in the foreground
completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge);
//completionHandler(UNNotificationPresentationOptionNone);

}

在iOS应用程序中无法执行此操作。您需要服务器跟踪新约会的发生时间,并向设备发送APNS通知。iCloud怎么样?@GeorgeGreen谢谢您的提示。我有点明白。我可以使用Firebase进行远程通知吗?基本上,我需要生成一个JSON脚本发送到Firebase,并可能每小时发送到设备。是的,Firebase也可以与Android的APNS和google推送消息集成。是的,您需要您的服务器响应正在创建的新约会(或为他们轮询一些外部服务?),然后向设备发送通知。感谢刚刚开始工作,我们将在此处发布答案