【问题标题】:iOS/Obj-C - Fire local notification without timer?iOS/Obj-C - 在没有计时器的情况下触发本地通知?
【发布时间】:2017-04-12 04:17:57
【问题描述】:

我想在我的 iOS 应用程序中设置一些本地通知,但是我似乎找到的关于实现这些的每个教程似乎只允许我基于计时器触发通知(参见下面的示例代码)?例如,当新数据加载到 UITableView 时,是否可以触发本地通知?对于一般性问题,我很抱歉,但我似乎找不到很多关于此的文档。我也不确定如果仅在用户点击屏幕时才获取数据,我该怎么做? 例如数据在 ViewController 的 viewDidLoad 中被抓取/更新?

-(void)viewDidLoad {

        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.fireDate = dateTime;
        localNotification.alertBody = [NSString stringWithFormat:@"Alert Fired at %@", dateTime];
        localNotification.soundName = UILocalNotificationDefaultSoundName;
        localNotification.applicationIconBadgeNumber = 1;
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

    }

【问题讨论】:

  • "新数据已加载"NSUrlSession 使用completionHandler 另见this tutorial。一旦 UrlRequest 完成 你可以做一些事情......“当按钮被按下时”action (就像一个函数......在这里,您的函数将在 target(按钮)上运行您想要的 localNotification)here
  • 如果您想在某个时间点(例如加载完成时)触发它,则在您为加载创建的加载空白处。在那里创建一个本地通知,如果这没有帮助,我很抱歉,但我没有清楚地了解你的问题
  • 您能否澄清一些事情:1)您希望通知的与数据相关的事件是否在屏幕上可见(即UI事件是重要事件),例如完成网络数据获取(即数据可用性是重要事件),还是其他? 2) 通知的具体目的是什么?是否只是简单地通知用户操作已经完成,如果是,他们具体需要知道什么? 3) 当应用程序在后台或仅在前台时,您希望能够通知他们此事件吗?
  • 使用 UILocalNotification 是在特定时间在本地触发通知。这些通知旨在提醒用户在应用程序未运行或最小化时发生事件。 UILocalNotifications 在应用程序运行时不显示(因此设置延迟)。您描述的场景听起来更像是您应该查看 NSNotificationCenter 以向应用程序中的观察者触发通知。

标签: ios objective-c


【解决方案1】:

首先,您应该考虑一个事实,即您使用的 UILocalNotification 类从 iOS 10 开始已被弃用。从 iOS 10 开始,本地通知和远程通知之间没有区别。

在UserNotifications 框架(iOS 10.0+,Swift | Objective-C)中,不会像 Apple 之前的一些类似框架/API 的实现那样创建UNNotification 的实例。相反,UNNotificationCenter 的实例负责创建通知对象并在收到新通知时和在显示默认 UI 之前调用委托方法。有关符合UNUserNotificationCenterDelegate 协议要求的更多详细信息,请参阅Apple's documentation。 我经常最终使用AppDelegate 作为符合该协议的类

现在回到问题。要从应用程序内开始创建通知,首先您应该创建一个触发器(在您的情况下,您可能希望使用UNTime​Interval​Notification​Trigger),然后创建一个通知请求,最后将该请求添加到可以访问的通知中心单例致电UNUserNotificationCenter.current()。

let content = UNMutableNotificationContent()
content.title = "Alert Fired"

创建一个触发器,用于确定 UNUserNotificationCenter 何时调用通知

let trigger = UNTime​Interval​Notification​Trigger(timeInterval: 0, repeats: false)

创建通知请求。你只创建那些来调用本地通知,因为 iOS 负责为传入的推送通知创建请求对象。

let request = UNNotificationRequest(identifier: "FiveSecond", content: content, trigger: trigger)

现在我们必须将我们的请求添加到与我们的应用关联的当前通知中心。

let center = UNUserNotificationCenter.current()
center.add(request, withCompletionHandler: nil)

在我们的例子中,通知将由 UNUserNotificationCenter 立即触发。

【讨论】:

  • 我没有使用 Swift 编码,我使用的是 Obj-C。你有这个 obj-c 的解决方案吗?
  • 还有:这个方法还是用定时器?
  • @Brittany 是的,如果您正在为 iOS 10 开发,那么所有 api 在 Swift 和 Obj-C 中都可用。我也可以在 Obj-C 中发布答案,但我鼓励您先阅读 UserNotification documentation。
  • 要立即触发通知,您应该在请求中使用 'trigger: nil'
【解决方案2】:

您可以像这样使用 postNotificationName 方法:

MyCustomObject *customObject = [MyCustomObject new];
[[NSNotificationCenter defaultCenter] postNotificationName:@"Your notification name" object:customObject];

处理来自已发布通知的对象看起来像这样。显然,我只是在这里登录,但你可以随意处理它。

- (void)methodToProcessNotificationData:(NSNotification *)notification {
   NSLog(@"%@",notification.object);
}

当你想要一个类来监听通知时,你可以执行下面的代码块。这会将观察者添加到类中,为其提供要调用的方法(在此实例中为 methodToProcessNotificationData)以及您希望监听的通知名称。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(methodToProcessNotificationData:) name:@"Your notification name" object:nil];

【讨论】:

  • 我没有官方来源,但我是一名 iOS 开发人员。这个答案是根据我对通知的经验构建的
【解决方案3】:

您可以改用以下方法[1]:

- (void)postNotificationName:(NSNotificationName)aName 
                      object:(id)anObject 
                    userInfo:(NSDictionary *)aUserInfo;

[1]https://developer.apple.com/reference/foundation/nsnotificationcenter/1410608-postnotificationname?language=objc

【讨论】:

  • 所以 NSNotificationName 将是我在上面的代码中命名通知的任何名称,是吗? “anObject”数据来自哪里/例如它是什么?
  • @Brittany 如果你想向通知的订阅者发送一些数据,那么你可以在 userInfo 中传递。
  • @Brittany (NSNotificationName)aName 是您要发布的通知的名称。然后你用相同的名字订阅这个通知
  • @Brittany 见Fundamentals of callback。此解决方案仅适用于您的按钮逻辑。如果您想在加载数据后做某事,则不起作用
【解决方案4】:

只要您想触发本地通知,您就可以简单地将时间设置为[NSDate date]。它将在当前时间触发通知。

【讨论】:

    【解决方案5】:

    首先要记住你需要什么 ios 本地本地通知

    // Handle launching from a notification
    
    if(IOS_VERSION<10)
    {
        UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
        if (locationNotification)
     {
        // Set icon badge number to zero
        application.applicationIconBadgeNumber = 0;
    }
    
    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
    {
    
        [application registerUserNotificationSettings:[UIUserNotificationSettings
                                                       settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|
                                                       UIUserNotificationTypeSound categories:nil]];
    }
    

    }其他{

    [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound)
                                                                        completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                                                            // Enable or disable features based on authorization.
                                                                        }];
    

    }

    最后一件事

        if(IOS_VERSION<10){
    
            [[UIApplication sharedApplication] cancelAllLocalNotifications];
    
            NSLog(@"LocalNotifications]count %d",(int) [[[UIApplication sharedApplication] scheduledLocalNotifications]count]);
    
            NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar] ;
            NSDate *now = [NSDate date];
            NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:now];
            [components setHour:15];
            [components setMinute:35];
    
            UILocalNotification *notification = [[UILocalNotification alloc]init];
            notification.fireDate = [calendar dateFromComponents:components];
            notification.repeatInterval = NSCalendarUnitDay;
            notification.alertBody =@"message";
            notification.applicationIconBadgeNumber = 0;
            notification.soundName = UILocalNotificationDefaultSoundName;
            [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    
    
        }else{
    
            [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
            NSLog(@"LocalNotifications]count %d",(int) [[[UIApplication sharedApplication] scheduledLocalNotifications]count]);
    
            NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar] ;
            NSDate *now = [NSDate date];
            NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:now];
            [components setHour:15];
            [components setMinute:35];
    
    
    
    
            UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
    //        objNotificationContent.title = [NSString localizedUserNotificationStringForKey:NotificationHeading arguments:nil];
            objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@"message"
                                                                                arguments:nil];
            objNotificationContent.sound = [UNNotificationSound defaultSound];
    
            /// 4. update application icon badge number
            objNotificationContent.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber]);
    
    //        UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
    //                                                      triggerWithTimeInterval:60 repeats:YES];
    
            UNCalendarNotificationTrigger *trigger2 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
    
            UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                                  content:objNotificationContent trigger:trigger2];
    
            /// 3. schedule localNotification
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    
    
            [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
                if (!error) {
                    NSLog(@"Local Notification succeeded");
                }
                else {
                    NSLog(@"Local Notification failed");
                }
            }];
    
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      相关资源
      最近更新 更多