文章分享至我的个人技术博客: https://cainluo.github.io/14974988224036.html


Notification Content Extensions

在之前我们就讲过苹果爸爸在iOS 10推出了一个新的UserNotification框架, 但苹果爸爸的野心不小, 不单单推出框架那么简单, 而且连Extension都给你搞了一个, 哼哼, 我看还有谁~

这里所演示的项目是和之前一样的, 如果找不到的盆友可以到这里去看看.


添加Notification Extension

回到我们的项目, 拷贝一份新的, 然后添加Notification Extension:


配置Notification Extension Info

添加完Extension之后, 我们需要来配置一下Info.plist文件, 这里我们要添加点东西:

  • UNNotificationExtensionDefaultContentHidden
    • 设置成为YES
  • UNNotificationExtensionCategory
  • 和我们之前项目的AppDelegate.m文件所添加的Category保持一致, 我这里是reminder
  • UNNotificationExtensionInitialContentSizeRatio
    • 这个东东我改为0.5

修改完成后的结果:

来通知的效果:


自定义一个小方法

上面的东西都搞定了之后, 那么接下来就是要自定义一个小方法:

- (void)addShakeAnimation {
    
    CAKeyframeAnimation *frameAnimation = [CAKeyframeAnimation animation];

    frameAnimation.keyPath        = @"transform.translation.x";
    frameAnimation.duration       = 1;
    frameAnimation.repeatCount    = MAXFLOAT;
    frameAnimation.values         = @[@-20.0, @20.0, @-20.0, @20.0, @-10.0, @10.0, @-5.0, @5.0, @0.0];
    frameAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    
    [self.view.layer addAnimation:frameAnimation
                           forKey:@"shake"];
}

- (void)removeShakeAnimation {
    
    [self.view.layer removeAnimationForKey:@"shake"];
}
复制代码
  • addShakeAnimation添加摇摆动画的方法

  • removeShakeAnimation删除摇摆动画的方法

效果:


- didReceiveNotificationResponse:completionHandler:方法

Notification Extension里, 有这么一个方法叫做: - didReceiveNotificationResponse:completionHandler:, 这个方法可以获取通知里的Action事件, 我这里是这么写的:

- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response
                     completionHandler:(void (^)(UNNotificationContentExtensionResponseOption))completion {
    
    if ([response.actionIdentifier isEqualToString:@"cancel"]) {
        
        UNNotificationRequest *request = response.notification.request;
        
        NSArray *identifiers = @[request.identifier];
        
        // 根据标识符删除等待通知
        [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:identifiers];
        
        // 根据标识符删除发送通知
        [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:identifiers];
        
        self.label.text = @"点击了取消按钮";
        
        // 删除动画效果
        [self removeShakeAnimation];
        
        // 不隐藏通知页面
        completion(UNNotificationContentExtensionResponseOptionDoNotDismiss);
        
    } else {
        
        // 隐藏通知页面
        completion(UNNotificationContentExtensionResponseOptionDismiss);
    }
}
复制代码

如果不懂这个动画应用的话, 我在度娘里看到了一篇文章, 可以来看看IOS 核心动画之CAKeyframeAnimation

整体的运行效果:


总结

文章里只是简单的讲解, 如果还想了解更多的话, 可以自行去查看WWDC 2016的视频讲解.


工程地址

项目地址: https://github.com/CainRun/iOS-10-Characteristic/tree/master/6.Notification%20Content%20Extension


最后

码字很费脑, 看官赏点饭钱可好

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐