包教包会:本地推送 & 远程推送

2023-11-09

什么是推送?注意,和我们常用的抽象通知不同(NSNotification): 可以让不在前台运行的app,告知用户app内部发生了什么事情;或者没有运行的app接收到服务器发来的通知。。比如离线QQ接受消息,网上商城的打折通知,游戏的版本更新通知,有新的评论生成。。。。
 
iOS的推送分为:本地推送和远程推送。本地推送是应用内的推送,不用连接服务器,常用来定时提醒用户完成一些任务,比如清理垃圾、记账、买衣服、看电影、玩游戏。远程推送则是通过服务器返回实时的通知信息给用户。

先回忆一下,推送通知有5种不同的呈现效果(另外还会在 “通知中心” 进行展示,就是顶端下拉屏幕后的视图):

1、在屏幕顶部显示一块横幅(显示具体内容)

2、在屏幕中间弹出一个UIAlertView(显示具体内容)   很少很少使用这种,,用户体验很差

3、在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)

4、更新app图标的数字(说明新内容的数量)

5、播放音效(提醒作用)

 

我们开始正式配置本地和远程两种推送,并且着重从本地推送开始,因为远程推送的代码实现,需要本地推送的基础~~~~

 

一、如何发出本地推送通知:三步走 + 注册通知(iOS8.0之后才需要,所以小心坑,要做iOS7的适配)

 

1、创建本地推送通知对象

UILocalNotification *ln = [[UILocalNotification alloc] init];

 

2、设置本地推送通知属性

 

(1)推送通知的触发时间(何时发出推送通知)

@property(nonatomic,copy) NSDate *fireDate;

 

(2)推送通知的具体内容

@property(nonatomic,copy) NSString *alertBody;

 

(3)在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)

@property(nonatomic,copy) NSString *alertAction;

 

(4)音效文件名

@property(nonatomic,copy) NSString *soundName;

 

(5)app图标数字

@property(nonatomic) NSInteger applicationIconBadgeNumber;

 

(6)每隔多久重复发一次推送通知

@property(nonatomic) NSCalendarUnit repeatInterval;

 

(7)点击推送通知打开app时显示的启动图片,不设置则没有,如果设置(无论设置成什么),只会显示app启动的图片,很坑的一个属性

@property(nonatomic,copy) NSString *alertLaunchImage;

 

(8)附加的额外信息

@property(nonatomic,copy) NSDictionary *userInfo;

 

(9)时区

@property(nonatomic,copy) NSTimeZone *timeZone;

(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)

 

(10)在通知中心里显示的标题

@property(nonatomic,copy) NSString *title;

 

(11)显示滑动解锁的按钮:设置成no,则显示“滑动来查看”,不显示用户设定的内容

@property(nonatomic) BOOL *hasAction;

 

 

3、推送通知的发出

 

(1)调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)

[[UIApplication sharedApplication] scheduleLocalNotification:ln];

 

(2)获得被调度(定制)的所有本地推送通知

@property(nonatomic,copy) NSArray *scheduledLocalNotifications;

(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)

 

(3)取消调度本地推送通知

- (void)cancelLocalNotification:(UILocalNotification *)notification;

- (void)cancelAllLocalNotifications;

 

(4)立即发出本地推送通知

- (void)presentLocalNotificationNow:(UILocalNotification *)notification;

 

 

 

二、点击本地推送通知的响应

正常情况点击弹出的通知,会打开应用程序,所以,这里的响应,指的是“即将进入前台”

1、当用户点击本地推送通知,会自动打开app,这里有3种情况

(1) 状态:app并没有关闭,一直隐藏在后台;

     操作:让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app,而是即将进入前台的响应  

 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

 

(2) 状态:app在前台运行;

     操作:推送通知仍然会在发送,也会走下面的方法,虽然没有跳转到app  

 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

 

(3) 状态:app已经被关闭(进程已死)

         操作:启动app,启动完毕会调用AppDelegate的下面方法,不会调用上面的方法

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

  launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象

 

 

2、关于页面跳转的逻辑判断(要进行程序所处状态的逻辑判断,,哎呀,如果屡不清看下面代码。。)

 

(1)程序在前台运行时,不需要根据本地推送进行跳转操作

(2)程序在后台运行时,跳转到通知逻辑指定的页面 

(3)程序关闭时,跳转到通知逻辑指定的页面

(4)程序第一次运行(本地推送还没有发生),是不需要加载推送通知逻辑的

 

 3、要结合app的生命周期方法和状态值,来进行上面业务逻辑的判断

(1)Not running   未运⾏,程序没启动。
(2)Inactive     未激活,程序在前台运⾏,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
(3)Active      激活,程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。
(4)Backgroud     后台,程序在后台而且能执⾏代码,大多数程序进⼊这个状态后会在这个状态上停留⼀ 会儿。

(5)Suspended     上一状态时间到了之后会进入挂起状态。有的程序经过特殊的请求后可以长期处于Backgroud状态,Suspended 挂起程序在后台不能执⾏代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

 

4、给出一个参考示例: 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 设置应用程序的图标右上角的数字
    [application setApplicationIconBadgeNumber:0];
    
  //适配 iOS7.0,大于7.0的版本再去注册通知 if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; } // 界面的跳转(针对应用程序被杀死的状态下的跳转,这里判断键值是否存在,如果存在,说明是接受到通知之后开启的app,那么就执行跳转) if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) { // 跳转代码(只是简单的示范,redview中会打印出字典的内容,用来查看接受到通知携带的内容) UILabel *redView = [[UILabel alloc] init]; redView.frame = CGRectMake(0, 0, 200, 300); redView.numberOfLines = 0; redView.font = [UIFont systemFontOfSize:12.0]; redView.backgroundColor = [UIColor redColor]; redView.text = [NSString stringWithFormat:@"%@", launchOptions]; [self.window.rootViewController.view addSubview:redView]; } return YES; } /* 点击通知,应用程序正在进入前台;或者在前台的时候都会执行该方法 */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { // 针对应用程序在后台的时候进行的跳转,如果程序在前台不用跳转
  //注意此时的应用程序状态! if (application.applicationState == UIApplicationStateInactive) { NSLog(@"进行界面的跳转"); NSLog(@"%@", notification.userInfo); UIView *redView = [[UIView alloc] init]; redView.frame = CGRectMake(0, 0, 100, 100); redView.backgroundColor = [UIColor redColor]; [self.window.rootViewController.view addSubview:redView]; } }

 

三、关于注册通知(获得许可)的补充介绍

 

1、从iOS 8.0开始,如果要使用通知,需要得到用户的许可,也就是弹出一个提示框,询问用户是否授权。这个选择也可以在手机的“设置”中进行配置(包括推送通知显示的位置也可以选择)。

 

2、设置方式

 

(1)设置setting,做一些配置,包括推送通知可以显示的类型

   UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];

 

(2)应用程序对象注册推送

   [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

 

(3)关于分类categories

   通过分类可以给推送通知添加快捷回复,包括按钮和文本框,比如QQ的快捷回复,微博的快捷点赞等功能。

 

 

四、单独说一下 category的设置

 

1、在通知处显示按钮,可以点击进行快捷回复,默认会回到程序中。另外可以设置快捷回复的文本框,进行信息发送。这些按钮是可以设置响应事件,进行逻辑实现的!

   

2、设置

 

(1)配置可变的category对象

   UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init];

    

(2)设置标识符,这个必须有,通知对象根据这个标识,从注册的category中找到指定的,设置自己的category属性

   category.identifier = @"cate";

    

(3)为category 准备 action(动作按钮),这点类似  alertViewController

 

 UIMutableUserNotificationAction*action = [[UIMutableUserNotificationAction alloc]init];

    action.title = @“已阅读”;

    action.identifier = @"action1”;

 //让按钮的响应在后台处理,不用跳转到应用程序中去

    action.activationMode = UIUserNotificationActivationModeBackground;

//true时,用户在点击动作之前必须确认自己的身份

    action.authenticationRequired = NO;

 //在通知中心显示不同背景颜色

    action.destructive = NO;

 

     

(4)设置快捷回复的文本框,点击按钮出现输入文本框进行快捷回复

   action.behavior = UIUserNotificationActionBehaviorTextInput;

    

(5)添加动作到分类

    [category setActions:@[action1,action2] forContext:UIUserNotificationActionContextDefault];

 

(6)在注册通知的时候,添加分类进去

    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound |  UIUserNotificationTypeAlert  categories:[NSSet setWithObjects:category, nil]];

     [[UIApplication sharedApplication]registerUserNotificationSettings:setting];

 

3、动作按钮的响应(application的代理方法),在这里面进行业务逻辑的实现

 

(1)动作按钮的响应事件————不带文本框信息

 

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler

    if ([identifier isEqualToString:@"action1”]) { //点击了标记已读
        NSLog(@"点击了标记已读");
    }
    if ([identifier isEqualToString:@"action2”]) { //点击了删除
        NSLog(@"点击了删除");
    }

//这里执行一下block
    completionHandler();
}

 

 

(2)动作按钮的响应事件————快捷回复带文本框信息(和上面的方法不要一起写)

 

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler
{
    if ([identifier isEqualToString:@"action2”]) { //点击了标记已读
//注意key
        NSLog(@"%@",responseInfo[UIUserNotificationActionResponseTypedTextKey]);
    } 
    completionHandler();

}

 

 

 

五、远程推送的原理

 

1、苹果的服务器会和所有的iPhone建立长连接(不懂长连接去找度娘),所以,苹果可以通过这个长连接,实现对所有用iPhone手机的时间校准、系统升级、查找位置等等操作(废话,因为一直和手机连着网么。。。),因而,服务器也可以实现给所有用户发送通知消息,然后用户手机接收到后,针对不同的应用,实现类似本地推送的展示效果。  然而苹果的服务器怎么知道发送什么东西呢----->我们的app后台服务器告诉他的;但是我们的后台服务器以及苹果的服务器又是怎么确定发送给哪个手机和应用的呢----->通过标识deviceToken。。。最后苹果的这个“服务器”,准确的说是服务,叫做 : APNs  (Apple Push Notification Service)。

 

2、远程推送流程详解

   deviceToken:就是由UDID 和 bundleID 生成的唯一标识符

     

 

  (1)  设备(应用)向苹果服务器请求获得deviceToken

    (2)苹果根据请求信息,生成deviceToken,并将其返回给设备

    (3)设备把收到的deviceToken发送给应用的后台服务器,这时服务器记录下了deviceToken 

  (4)应用的服务器需要发送推送时,附加这deviceToken发送给APNs(苹果服务器)

    (5)苹果接受到推送后,根据deviceToken,把信息传达给和他保持长连接的iPhone设备

    (6)设备监听并接受到远程推送,执行类似本地推送的展示

 

 

 

六、远程推送实现的准备工作

 

1、开发iOS程序的推送功能, iOS端需要做的事

  (1)  应用向苹果服务器请求获得deviceToken

    (2)得到苹果返回的deviceToken

    (3)发送deviceToken给应用的后台服务器,这时(自己的)服务器记录下了deviceToken

  (4)监听用户对通知的点击

  

2、调试iOS的远程推送功能, 必备条件:

 

(1)真机,模拟器玩不了咯

 

(2)调试推送需要的证书文件:悲剧的你,需要申请开发者账号了,,不贵,个人账号也就688元

  1> development.cer :  调试推送证书 。   某台电脑就能调试某个app的推送服务

  2> mobileprovision : 描述文件。            某台电脑就能利用某台设备调试某个程序(关联上了设备)

   

  补充一下:证书的类型(没有开发经验的弟弟们经常搞不清楚的东西),描述文件是根据证书和注册设备生成的

       

  

(3)发布具有推送服务的app

  1> production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书 

  2> mobileprovision  : 某台电脑就能发布某个程序

 

3、远程推送准备的流程概述

(1)登录开发者账号,创建App ID:说明哪个App使用推送,绑定bundleID,注意AppID是全称,不能带*(通配的模式不行)

(2)为App ID创建APNs SSL证书:就是上面说的推送证书,这里要关联上面的AppID

(3)生成描述文件:根据上面两个东西生成的--> 最终确定 “哪台设备要在哪台电脑上调试哪个程序”

(4)把证书和描述文件下载安装了:双击,最好先装cer

 

七、开始代码配置~~

上面的工作是远程推送的准备工作,设置完毕后,我们就可以进行代码实现了,很多代码逻辑和本地推送类似

 

1、注册通知,请求deviceToken(只要注册了,就自动发出请求,但是要注意ios版本问题!)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    }

     else { // 适配iOS7
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
    }
    
  //这里类似本地推送的逻辑实现,要判断是否需要跳转 if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { // 跳转 // 添加一个红色的View } return YES; }

 

2、获得deviceToken

 

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 业务逻辑:将DeviceToken传给服务器
    NSLog(@"%@", deviceToken.description);
}

  

3、假设服务器开始发送推送了,接收到推送

(1)服务器发过来的信息有固定格式(userInfo)类比本地推送对象的属性通过这些格式可以确定--> 声音、badge、额外的字段、推送信息等内容

(2)可以使用pushMeBaby这个小程序模拟服务器发送推送~~

(3)这个方法就是类似本地推送时获得推送的响应方法,注意判断是否跳转。

 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);      
}

 

 

4、还有一种接受推送的方式:后台处理

(1)应用程序接收到推送之后,就立即响应,用户不用操作(不用点击通知),在“静默”的情况下,实现了推送想实现的逻辑

(2)推送信息(userInfo)中必须包含字段:"content-available":"1",其中 “1”随便写

(3)实现下面的代码,注意里面有回调block,需要告诉系统是否有新内容(枚举常量)

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"虽然用户没有察觉,但是已经接受到通知");
    
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];
    
    // 1.打开后台模式 2.告诉系统是否有新内容的更新 3.发送的通知有固定的格式("content-available":"1")
    completionHandler(UIBackgroundFetchResultNewData);
}

 

(3)还要有额外的配置,来实现后台运行

   

 

 

 

八、总结

好了,推送的东西讲完了,关于如何申请开发者账号、申请调试证书、注册设备、生成描述文件之类的事情,大家就靠度娘吧,其实也很简单,记住上文中的证书类型页面就好,就那么几种。

另外,苹果的服务器有时候会抽风。。。deviceToken不能及时获取,大家多试几遍,或者找较好的网络环境试试。。

后面有机会给大家介绍第三方的推送,,那个才是真正的应用(貌似白写了这么多。。。)

 

转载于:https://www.cnblogs.com/cleven/p/5437108.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包教包会:本地推送 & 远程推送 的相关文章

  • qt修改构建套件

    1 qtcreator 工具 选项 qtVersion 添加 选择要添加的qmake 2 点击构建套件 选择对应的编译器 3 选择对应的调试器 解决can not find qmake conf问题
  • Synchronized(对象锁)和Static Synchronized(类锁)的区别

    Synchronized和Static Synchronized区别 通过分析这两个用法的分析 我们可以理解java中锁的概念 一个是实例锁 锁在某一个实例对象上 如果该类是单例 那么该锁也具有全局锁的概念 一个是全局锁 该锁针对的是类 无
  • 打造万物识别之利器!微信扫一扫植物识别篇技术解析

    导语 冬去春来日渐暖 柳絮萌芽草生根 立春已过 又到了户外踏青赏花的季节 再过段时间 公园 郊外 路边各种鲜花都会渐次开放 大家踏春的时候都会拍一些好看的照片 发一些朋友圈 写一些花语 市场上也出现了不少识花app 用户下载app 拍张照片
  • 单播与多播mac地址

    MAC 地址 Media Access Control Address 是一个用于识别网络设备的唯一标识符 每个网络设备都有一个独特的 MAC 地址 用于在局域网中进行通信 单播MAC地址 单播MAC地址用于单播通信 即一对一的通信模式 当
  • static静态代码块

    static静态代码块 public class Person 静态代码块 在类加载时候执行静态代码块 只会执行一次 static System out println Person static initializer 实例初始化块 每次
  • 富文本编辑器 VUE-QUILL-EDITOR 使用教程

    一 基础用法 1 NPM 导入 VUE QUILL EDITOR npm install vue quill editor save 2 引入 VUE QUILL EDITOR 在全局中引入 import Vue from vue impo
  • 如何实现单链表任意两个元素交换(不包括表头)

    凭第一感觉写的版本 算法和思路有好的想法再优化 交换链表任意两个元素 void SwapItem LinkedList head int posA int posB 从非头结点开始交换操作 保证至少存在两个节点 assert head he
  • 教你如何用C语言做一个简单的贪吃蛇

    小时候大家可能都玩过贪吃蛇 但有没有想过自己做一个出来玩玩看 今天我们就教大家用C语言做一个简单的贪吃蛇游戏 这里没有采用图形界面去做 而是采用win32控制台 首先 先把做好的游戏初始界面和游戏截图先展示一下 游戏初始界面如图 游戏截图如
  • Vue切换路由,页面回到上一次缓存的滚动位置(代码量少,通用有效)

    需求 当切换不同路由时 期望切换后的路由页面保留上次滚动的位置 解决思路 利用路由中的meta属性 对不同路由页面滚动的位置做缓存 切换路由时 获取当前路由meta属性中缓存的滚动位置 再自动滚动到此位置即可 具体代码 router js文
  • Kali Linux安装教程

    虚拟机Vmware Worksation下Kali Linux安装教程 本次安装Vmware Worksation采用的是15 5 pro 下载kali镜像 首先进入kali官网 https www kali org 点击Downloads
  • GIT操作:把当前仓库的一个分支push到另一个仓库的指定分支

    背景 有时候我们想把当前仓库A的一个指定分支1 推给 另一个仓库B的另一个指定分支2 可以通过2个主要命令git remote xxx 和 git push newOrigin 当前分支 目标分支 完成 示例 假设有2个仓库uu和uunew
  • java什么时候需要用序列化?

    文章目录 一 Java序列化概述 二 什么时候用序列化 三 项目创建很多对象怎么优化 场景 优化思路一 加条件判断 优化思路二 使用clone浅拷贝 一 Java序列化概述 简单说就是为了保存在内存中的各种对象的状态 也就是实例变量 不是方
  • vscode 缩进,取消自动格式化,溢出不换行

    Ctrl P gt 在输入框中输入 settings json 打开第一个 取消自动换行 editor wordWrap off 代码缩进 editor tabSize 4 取消每次保存的时候自动格式化 editor formatOnSav
  • 离散数学:常用的数学符号

    x A x 是 A 的元素 x A x 不是 A 的元素 A B A 是 B 的子集 或 A 包含于 B B 包含 A A B A 是 B 的真子集 A B B 不包含 A 或 A 不包含 B A B A 与 B 有相同的元素 A B A
  • zookeeper的Linux下安装和使用 单机版/集群版

    这个是单节点的 集群的在另一篇文章里做了说明 一 解压zookeeper的tar包 二 到zookeeper的conf目录下 拷贝zoo sample cfg 为zoo cfg 记住名字必须叫zoo cfg root VM 0 7 cent
  • 【高级篇 / SDWAN】(7.0) ❀ 07. DNS 解析最快的宽带优先上网 ❀ FortiGate 防火墙

    自从配置SD WAN之后 很多人反应网速变慢了 打开网站卡半天 你有没有接到过这种投诉 其实这是因为DNS解析的原因 由于多条宽带属于不同的运营商 而运营商自带的DNS对自己宽带的解析很快 但对其它宽带就会报错 所以我们只能使用通用DNS
  • 2021-08-06

    在编译OKVIS中 执行make j8时报错的解决方法 1 根据github上OKVIS的安装步骤一步一步执行 由于github经常进不去 我就进了gitee网站查到OKVIS的安装步骤 参考链接 https gitee com bill4
  • vue 引入 二维码

    vue cli3 动态生成二维码 不带logo的 第一步 先下载插件 npm install qrcodejs2 save 第二步 在需要生成二维码的 页面 导入 import QRCode from qrcodejs2 第三步 在页面中引
  • [云原生专题-34]:K8S - 核心概念 - 网络 - Web服务器与反向代理服务器nginx入门介绍

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122806880 目录 第1章 常见网
  • 深入了解一下C语言scanf()库函数

    目录 一 scanf函数的定义 二 scanf函数的返回值 三 scanf函数的控制符 四 scanf函数控制符的使用 1 一般用法 2 scanf 函数 控制符的用法 2 1 控制符的两种形式 2 2 字符的使用 3 键盘缓冲区残余信息问

随机推荐

  • Confluence 6 管理应用服务器内存设置

    应用服务器中的最小和最大 JVM Heap 空间配置将会影响系统的性能 Confluence 管理员可能希望对默认的配置进行修改 基于你系统的负载不同配置情况也会有所不同 请参考页面 Server Hardware Requirements
  • sed命令常见用法

    常见sed命令的操作 a 增加 在当前行下面增加一行指定内容 c 整行替换 将选定行替换为指定内容 d 删除 删除选定的行 w 将行写入新文件 r 从文件中读取 i 插入 在选定行上面插入一行指定内容 p 打印 如果同时指定行 表示打印指定
  • 五彩斑斓的黑

  • c++操作sqllite

    项目中需要使用的sqllite 有想过使用内存的结果 好像都不大使用 最接近的算是vector了 但是查询方式不大好 而且数据有好几个字段 所以考虑了数据库 sqllite目前已经到了3了 好快 好像这个数据库也不弱 就先用着吧 其实挺简单
  • FPGA—串口RS232(附实现代码)

    目录 1 理论 1 1 串口简介 1 2 RS232信号线 1 3 RS232通信协议简介 2 实操 2 1 硬件资源 2 2 顶层模块 2 2 1 模块说明 2 2 2 RTL 代码 2 2 3 仿真验证 2 3 串口数据接收模块 2 3
  • PyCharm集成SVN,检出、提交代码

    工作需要 使用PyCharm集成SVN 进行代码管理 搜索网上资料 没有讲的很清楚的 自己动手摸索 大致了解了使用方法 遂记录下来 希望他人少走些弯路
  • 比较Opencv自带的frontface检测器

    CascadeClassifier haarcascade frontalface alt new CascadeClassifier xml haarcascade frontalface alt xml CascadeClassifie
  • 【Linux】Linux服务器解决python3.7与openssl的低版本不兼容的问题

    安装了Python3 7之后 遇到的一个很麻烦的坑就是与系统自带的ssl版本不兼容 Python3 7需要的openssl的版本为1 0 2或者1 1 x 这个requirements在config Python3 7的时候使用 with
  • c++栈实现表达式求值

    文章目录 前言 一 思想分析 二 具体实现 前言 后缀表达式的算法思想与具体实现 一 思想分析 设定两个栈 操作数栈 OPND 操作符栈 OPTR 栈初始化 置操作数栈 OPND 为空 操作符栈 OPTR 中预设一个优先级最低的操作符 自左
  • Shell Expect 命令

    expect可以实现shell实现不了的用户交互的需求 expect可以将交互写在一个脚本上 完成很多自动化的动作 比如ssh ftp登陆等 都是需要交互需求的 expect是需要安装的 直接yum y install expect安装即可
  • Class 00 - 学习编程的方法&不同职业所使用的编程语言

    Class 00 学习编程的方法 不同职业所使用的编程语言 学习编程的方法 什么是编程 不同职业所使用的编程语言 数据分析 网页设计 移动应用开发 Web应用开发 游戏开发 Tips 学习编程语言的技巧 从电子表格到 SQL 再到 R 电子
  • threejs学习01-环境搭建+简单示例

    threejs学习 环境搭建 简单示例 环境搭建 node js vite js three js 轻量级的环境 先安装配置好node 在cmd中输入 node v 来查看node版本 node 配置好后就可以创建一个vite的项目了 先调
  • Vuforia Ground Plane 平面识别

    首先弄出这几个组件 如图 还有 再然后 然后就是关键了 如果Vuforia版本低于8 5 8 就得导入ARcore的arr 也就是这个 这个可以在 https dl google com dl android maven2 com goog
  • createBean方法详解

    前言 createBean是创建Bean的主要方法 该方法位于 AbstractBeanFactory的doGetBean方法中的createBean调用 createBean方法流程图 createBean源码解析 protected O
  • Zabbix监控MongoDB、Nignx、Redis、Php-fpm、SNMP(如打印机)

    Zabbix v3 4 MongoDB v3 4 MongoDB模板 感谢大神 MongoDB for Zabbix https share zabbix com databases mongodb mongodb for zabbix 3
  • better mybatis generator 使用详情

    1 在idea中plugins市场中下载better mybatis generator 安装 2 在idea中打开database 3 添加数据库 连接数据库 4 连接成功之后 如果如下图所示 可以看到schemas下边有连接好的数据库b
  • RoI Pooling 和 RoI Align

    RoI Pooling 和 RoI Align 一 背景和基本概念 1 背景 2 基本概念 二 RoI Pooling原理 1 目的 2 步骤 以输出RoI feature大小为2 2 5为例 Step1 Step2 Step3 Step4
  • python画饼图加牵引线_python-Matplotlib绘制分列式饼图并添加表格

    import matplotlib pyplot as plt import numpy as np import matplotlib as mpl 解决中文乱码和正负号问题 mpl rcParams font sans serif Si
  • 计算机汉字的输入和编辑教案,计算机汉字录入教案.doc

    教育局教研室学科教案纸 授课时间 年 月 日 星期 课 题上期总结与本期计划课 型新授本期总第 1 节教 学 目 标 知识与技能 过程与方法 情感态度与价值观 层 次 要 求了解认识理解应用经历体验反应领悟课 时 教 学 目 标 归纳总结上
  • 包教包会:本地推送 & 远程推送

    什么是推送 注意 和我们常用的抽象通知不同 NSNotification 可以让不在前台运行的app 告知用户app内部发生了什么事情 或者没有运行的app接收到服务器发来的通知 比如离线QQ接受消息 网上商城的打折通知 游戏的版本更新通知