Swift读取App版本信息 和 PCH 文件
Swift读取App版本信息
有时间我们需要读取APP的版本信息之类的配置信息,这样的我们可以使用方法:NSBundle.mainBundle().infoDictionary 来获取
Example:
Swift
let infoDictionary = NSBundle.mainBundle().infoDictionary
let shortVersion = infoDictionary!["CFBundleShortVersionString"]
print(shortVersion!)
PCH 文件
PCH文件命名:
一般以项目名称命名,即项目名称是什么,pch文件也叫什么名字。
PCH原理:
PCH文件里面的内容被项目的所有文件共有。
PCH Tips:
1.pch需要提前编译,在工程文件中,找到Build Setting,选择All选项,中找到 Apple LLVM 1.7 – Language集合下的 : Precompile Prefix Header 设置为 Yes ,然后 Prefix Header 选项中写入pch文件的绝对路径,

2.找到Swift Compiler – Code Generation 集合,从中配置Objectie-C的桥接文件:Objective-C Bridging Header ,写入相同的pch文件路径

3.在xcode中按Command+B编译一下
PCH文件作用:
Swift
/*
首选判断当前有没有C文件,如果有C就不导入OC的语法
每一个OC文件头部默认都会定义__OBJC__这个宏
*/
#ifdef __OBJC__
/**
1.存放一些公用的宏
*/
#define PERSIMMON "Mr.Cong"
/**
2.存放一些公用的头文件
*/
#import "UIImage+Test.h"
/**
3.自定义一些调试用的NSLog(输出日志)
... 表示在宏里面的可变参数
__VA_ARGS__ 表示函数里面的可变参数
*/
#ifdef DEBUG
#define TLog(...) NSLog(__VA_ARGS__)
#else
#define TLog(...)
#endif
#endif
PCH弊端;
1.每次都需要提前编译
2.需要做一些判断,判断当前有没有C文件,如果有C就不导入OC的语法
1 Introduction
数据安全在网络通信中是非常重要的一个方面。为了支持 SSL/TLS,Java 提供了 javax.net.ssl包下的类SslContext 和 SslEngine 。在Netty框架下,I/O数据在ChannelPipeline中被管道中的ChannelHandler处理并转发给下一个ChannelHandler。自然而然地,Netty也提供了ChannelHandler的实现SslHandler来支持SSL, 有一个内部 SslEngine 做实际的工作。
2 Steps
首先看看SslHandler的构造函数:
public SslHandler(SSLEngine engine) {
this(engine, false);
}
public SslHandler(SSLEngine engine, boolean startTls) {
this(engine, startTls, ImmediateExecutor.INSTANCE);
}
不难发现,我们需要一个SSLEngine对象来构建SslHandler。根据资料可以知道,需要根据已初始化的 SSLContext 来调用 SSLContext.createSSLEngine() 即可创建 SSLEngine。
所以基于Netty框架的在TCP连接中使用SSL/TLS加密的流程如下:
1.在代码中导入证书,并使用该证书构造SSLContext
2.调用SSLContext对象的createSSLEngine()创建 SSLEngine
3.用SSLEngine对象去初始化Netty的SslHandler
4.在Netty的ChannelInitializer.initChannel()中,往管道(pipeline)中安装SslHandler。
3 Usage
3.1 导入证书
public SSLContext getClientSSLContext(){
KeyStore trustKeyStore= KeyStore.getInstance("JKS");// 访问Java密钥库,JKS是keytool创建的Java密钥库
InputStream keyStream = MyApplication.getAppContext().getAssets().open("key.jks");//打开证书文件(.jks格式)
char keyStorePass[]="12345678".toCharArray(); //证书密码
keyStore .load(trustKeyStore,keyStorePass);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore );//保存服务端的授权证书
SSLContext clientContext = SSLContext.getInstance( "TLS");
clientContext.init(null, trustManagerFactory.getTrustManagers(), null);
return clientContext;
}
在上述代码,只是实现了client采用trustKeyStore中的key.jks证书(包含了server的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理。
仅仅是server->client单向的SSL认证。
如果要实现server和client之间双向的身份认证,需要模仿trustManagerFactory的初始化来构建一个KeyManagerFactory来其中保存客户端的私钥,并传入
clientContext.init(kmf.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
具体参照 SSL双向认证java实现
3.2 添加 SslHandler
ChannelHandler在应该初始化(ChannelInitializer.initChannel()被调用时)阶段被安装在ChannelPipeline中。
Bootstrap的介绍参考Android开发之使用Netty进行Socket编程(二)
Boostrap的初始化参考Android开发之使用Netty进行Socket编程(三)
bootstrap.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
SSLEngine engine = getClientSSLContext().createSSLEngine();
engine.setUseClientMode(true);
pipeline.addFirst("ssl", new SslHandler(engine));
//....再添加其他的ChannelHandler
pipeline.addLast(nettyChannelHandler);
}
});
在大多数情况下,SslHandler 将成为 ChannelPipeline 中的第一个 ChannelHandler,所以调用了pipeline.addFirst() 。这将确保所有其他 ChannelHandler 应用他们的逻辑到数据后加密后才发生,从而确保他们的变化是安全的
在开发过程中,你可能会遇到这样的问题:在一个很长的界面刚初始化结束的时候默认不是最顶部而是某一个控件,比如ListView;也可能遇到Edittext自己弹出软键盘的问题等等。其实这些都是焦点获取的问题,不想有这样的小bug那么就要对焦点的获取问题进行合理的控制。大多数人会在初始化的时候就对某个控件添加这个属性:
×××.setFocusable(false);
其实在建立xml布局文件的时候Android就提供了焦点控制的属性:
android:descendantFocusability="blocksDescendants"
解释一下相应的属性和对应的表达。
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
项目中往往需要显示一段文本,如果对文本需要特定的效果,就要写自定义的span,这样的工作量会变得很大,目前android支持html格式的文本。提供了两个接口,下面我们就来看一下怎么使用。
1. Spanned android.text.Html.fromHtml(String source) //输入的参数为(html格式的文本)
目前android不支持全部的html的标签,目前只支持与文本显示和段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别;
例子:
TextView t3 = (TextView) findViewById(R.id.text3);
t3.setText(Html.fromHtml( "<b>text3:</b> Text with a " + "<a href=\"http://www.google.com\">link</a> " +"created in the Java source code using HTML."));
另外也可以在string.xml中使用,但是要用用<!–cdata–>去转义。如下例子:
<string name="htmlFormattedText">
<![CDATA[
Text with markup for [b]bold[/b]
and [i]italic[/i] text.
There is also support for a
<tt>teletype-style</tt> font.
But no use for the <code>code</code>
tag!
]]></string>
TextView view = (TextView)findViewById(R.id.sampleText);
String formattedText = getString(R.string.htmlFormattedText);
Spanned result = Html.fromHtml(formattedText);
view.setText(result);
2.Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
Source: 需处理的html文本
imageGetter :对图片处理(处理html中的图片标签)
tagHandler :对标签进行处理(相当于自定义的标签处理,在这里面可以处理自定义的标签)
具体不细说,大家感兴趣可以自行学习;在实际项目里我们就可以使用第一种方式来替代之前我们用的自定义span了。
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
- 本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
ant design中upload组件上传大文件,显示进度条进度的实例
这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29- 这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
- 举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
- 这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25