
CSDN把我的博客关闭了!!! 进过一天的努力,CSDN竟然没一点回复,客服没找到,邮件发了N封,伤心之至,决定搬家到此,希望查封博客的事情,永远不要查封了!!! 你们可以封我的文章,可以不让别人看,但是不能不让我看吧?怎么说都没理由!!! 我开博客的目的,就是记录一些好的文章,研究一些东西,没有其他的用意 CSDN还不能在外网使用,有时候用着都非常蛋疼,那边查的东西好好的,回来对着博客看看,结果打不开。 彻底失望后,逃离那个封闭的博客,CSDN ,北北
Tomcat的配置 查看被占用的端口号 sudo lsof -i | grep LISTEN Tomcat是Java的web服务器,目前最新版是8.5.6,可以从这里下载到:http://tomcat.apache.org/download-80.cgi Tomcat并不区分Linux版和Mac版(但Windows版却是要区分的),下载下来就是一个tar.gz包,真正的绿色软件,解压,放到合适的位子去,就算完成安装了。一般来说,是放到/usr/local去,/usr目录就相当于Windows的“program files”目录嘛。 /usr/local/apache-tomcat-8.5.6 //为了防止误操作破坏系统,再用户状态下时没有权限操作系统重要文件的,所以先要取得root权限 sudo -s //给.sh加权 sudo chmod 755 *.sh //启动或者暂停Tomcat ./startup.sh ./shutdown.sh 我习惯性地不修改默认的目录名,依然叫“apache-tomcat-8.5.6”,但我会做一个软链接指向这个目录:(软链接) $cd /Library/Tomcat $ ln -s /usr/local/apache-tomcat-8.5.6 ApacheTomcat 这样就能轻易用/Users/用户名/ApacheTomcat去访问tomcat了。这样做还有一个好处,哪天Tomcat更新的新版本,我直接把Home指向新版本的目录即可,其它关于对Tomcat的路径引用的配置不用改,旧的版本可以继续保留用于测试,要换回去也很简单,改一下Home的指向即可。 启动Tomcat: $cd ApacheTomcat/bin $./startup.sh 立即用浏览器访问一下:http://localhost:8080/,你应该能看到: 配置管理员账号 $vim ApacheTomcat/conf/tomcat-users.xml <user username="admin" password=“qweasd" roles="manager-gui" /> 就设置好了一个叫admin的管理员,密码是qweasd。(这也能叫密码?)重启Tomcat生效。 需要在localhost后面加上8080会让你感到不爽,你想把这个去掉,使用默认端口号80,可以在这里配置: $vim ApacheTomcat/conf/server.xml 找到这一行: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 把8080改为80即可。但!且慢,由于系统权限的问题,80端口不是随随便便谁都能开启的,你需要root权限来运行Tomcat,否则绑定端口就会失败。我建议是放弃,毕竟谁会用自己的Mac来做服务器呢?但我会把8080改为8079,这是因为后面用IntelliJ调试程序的时候,IntelliJ会启动新的Tomcat实例,大家都习惯性地使用8080这个端口,为了避免这个冲突,把默认的8080改一下是有必要的。 顺便提一下,在Mac下想知道哪些端口被占用了,可以用: $sudo lsof -i | grep LISTEN 在Linux下可以用netstat,但Mac下的netstat命令貌似跟Linux下的出入蛮大,不知道为什么会这样。 配置HTTPS 虽然没有绝对的安全,但大牛们说“不用SSL的安全都是‘假装安全’”。所以…… 从图中可以看出,我们要配置https其实就是要配置Connector,Connector在之前配置端口的地方已经接触过了,有印象吧?当然,我们还得准备些材料。那就是密钥,准备方法如下图: 如果你的个人目录(即“cd ~”转到的目录)已经有“.keystore”,那么还要提示你输入密钥库的口令,我这里秘钥库的口令是654321,tomcat这个密钥的口令也是654321。 这样一来,就在你的密钥库中创建了一个叫tomcat的密钥,其中只指明了“名字与姓氏”的信息为localhost,别的都可以留空。完之后你可以看看.keystore到底是个什么玩意儿: $od ~/.keystore 其实啥都看不出来,一堆加密的二进制码。 接着就是Tomcat的server.xml文件了: $vim /Library/Tomcat/Home/conf/server.xml 在<Service>节点中加一个<Connector>节点: <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystorePass="654321" /> 注意,一点都不能写错,包括字母大小写都要完全写正确方可。保存,重启服务器,打开:https://localhost:8443/ Safari浏览器提示你无法验证localhost身份,这是很显然的,你的证书是你自己造的,没有CA(证书颁发机构)的担保,所以浏览器默认是不信任你的,但你可以选择“继续”。 提示:https在实际生产环境中是非常有用的东西,但在开发环境中没什么用,我们只需要知道有这回事,这里先把这个配置拿掉。不拿掉的话后面运行程序的时候可能会出现一个8443端口被占用的错误提示。(尽管此错误其实也无关痛痒)。 添加web应用 有两种方法: 第一是直接把应用放在webapps目录下,Tomcat会自动解释; 另一种是在conf/Catalina/localhost下面放入一个xml文件,如放一个叫test.xml的文件,内容是: <Context docBase="/Users/guogangj/test" /> 然后在/Users/guogangj/test下创建一个index.html,随便写点内容: <!doctype html> <html> <head> <meta charset="UTF-8"> <title> test </title> </head> <body> <h1>test</h1> </body> </html> 然后访问:http://localhost:8079/test/index.html,就能看到test这几个大字了。 IntelliJ的安装 下载的安装包是个dmg,安装无压力,打开并拽入“应用程序”中即可。直接运行,根据提示进行一些默认的配置即可。 创建Java Web项目 说实在的,IntelliJ的项目创建方式不如其它IDE的直观,反正我一开始是没搞懂(其实搞懂也很简单),另外IntelliJ的不同版本之间是有差异的,网上找的一些资料并不准确,最好还是直接看官方文档,根据它的Tutorial走走,这次我看的官方文档是针对IntelliJ v12的,而现在我用的是v13,所幸的是差别并不大。 New Project,然后这样选: 那个Versions只能选3.1,貌似之前还能选3.0,这个版本其实是Servlet的版本,最新的版本是3.1,需要用Tomcat8来承载,如果你选择用Tomcat7来承载的话,会有一个warning说不认识这个版本,使用默认版本云云,忽略这个warning就是。 在下一步中指定项目名,SDK果断选择最新的1.8(Java8): 这样一来你的服务器的运行环境得部署为Java8,不过这个也没啥压力,Java8多了不少很有用的新特性,如果没有什么历史负担的话干嘛不用? Finish,我们现在来看看整个project的结构: .idea这是IntelliJ的相关东西,我们不用管,src目录用于放java源文件,web目录用于放web资源,WEB-INF是java web应用固定的存放配置及类库的目录,index.jsp是我们首页,HelloWorld.iml是IntelliJ的项目文件,打开工程就是打开它了,External Library是一些外部引用的库,展开看看好多。 现在我们来创建一个Servlet,Servlet是Java的服务器端小程序(其实也可以不小),右击src目录: 然后命名为SayHello: 展开,打开SayHello.java的时候却发现IntelliJ提示找不到符号: 这一定是因为某些包没引用。如何引用?一般都是设置CLASSPATH,告诉java如何去找它的包,而这里我们可以直接指定包的位置。 打开Project Struture设置对话框(快捷键为<Cmd>+<;>),如图: 点加号,选“Jars or directories…”,再找到Tomcat下的servlet-api.jar。 这样就可以了,我们把doPost删掉,用不到,再在doGet方法中写点东西输出,SayHello.java就变成这样: package com.mycompany; import java.io.IOException; import java.io.PrintWriter; /** * Created by guogangj on 14-5-13. */ public class SayHello extends javax.servlet.http.HttpServlet { protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } java的代码写好了,配置文件也要加点东西,打开web.xml,加上一个“<servlet-mapping>”节点,改完后的web.xml变成这样: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>SayHello</servlet-name> <servlet-class>com.mycompany.SayHello</servlet-class> </servlet> <servlet-mapping> <servlet-name>SayHello</servlet-name> <url-pattern>/sayhello</url-pattern> </servlet-mapping> </web-app> 编译(<Cmd>+<F9>),通过无压力。但,怎么运行? 运行Java Web项目 Java Web项目无法单独运行,它需要一个程序来承载(Host)它,这和微软体系的东西是很类似的,ASP.net程序需要IIS来承载对不?而现在我们很明显需要用Tomcat来承载这个Web程序。 首先我们要配置好Tomcat,<Cmd>+<,>打开IntelliJ的配置。 如上图那样配置好Tomcat。 然后打开Project的运行配置: 继续看图: 再看图,如此般设置: 这里它提示你有个问题,说缺乏artifacts配置,你可以顺着它的指引,fix一下即可。点OK。 这次可以跑了,<Shift>+<F10>。注意看IntelliJ的输出窗口里有什么提示信息,如果有,想想看是什么原因,我常常会碰到一些端口无法打开的问题,一般都是端口被占用了。 IntelliJ运行Java Web程序的时候会开启新的Tomcat实例,很可能会和之前运行的Tomcat实例发生冲突,解决冲突的最快的办法通常是直接把之前运行的Tomcat shutdown掉。 现在看看运行的成果吧:http://localhost:8080/sayhello 是不是看到“Hello World!”?这是用Java代码输出的“页面”,而不是静态页面。 打成war包 工程编译后生成的内容在/work/HelloWorld/out/production/下,我们要对其中的内容进行打包的话,可以这样: $tar cvf HelloWorld.war /work/HelloWorld/out/production IntelliJ当然也可以帮助你做这个动作,如图:在工程配置中选择artifact的类型,artifact不知道中文怎么翻译好,在很多游戏中,它都被翻译为“神器”,但这里可以简单把它理解为Java的发布包。 这样你就能在其中指定的Output directory中找到那个War包了,把War包直接丢到Tomcat的webapps目录下,Tomcat会自动加载它。 希望本文对读者起到抛砖引玉的作用。 http://www.cnblogs.com/guogangj/p/3725371.html
Java新手入门的30个基本概念 在我们学习Java的过程中,掌握其中的基本概念对我们的学习无论是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基础,所以有必要对其中的基本概念做以归纳,以便大家在以后的学习过程中更好的理解java的精髓,在此我总结了30条基本的概念。 Java概述: 目前Java主要应用于中间件的开发(middleware)---处理客户机于服务器之间的通信技术,早期的实践证明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载计算机的开发. Java于其他语言所不同的是程序运行时提供了平台的独立性,称许可以在windows,solaris,linux其他操作系统上使用完全相同的代码. Java的语法与C++语法类似,C++/C程序员很容易掌握,而且Java是完全的彻底的面向对象的,其中提出了很好的GC(Garbage Collector)垃圾处理机制,防止内存溢出。 javaSe看成是java基础。J2EE看成是应用。 J2EE有两条路线: JSF+EJB3+JPA 与 轻量级的Struts2+Spring+Hibernate. 现在中小企业流行的是轻量级的SSH框架的web开发,大型企业大型项目才用到EJB3为核心的技术。 所以学习的话先从java基础、JSP、servlet、jdbc、SSH框架开始学,还要掌握MySQL或者Oracle数据库 Mac 上的 Java文章 http://blog.csdn.net/sike2008/article/details/42468729 () http://www.cnblogs.com/guogangj/p/3725371.html Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。 Java EE(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。 J2EE的实现之一Spring,其社区所支持的三十多个项目,涵盖了web、大数据、云计算、机器学习、移动终端、任务调度、插件体系、开发IDE、远程调用、消息中间件等,已经成了企业级开发中的事实标准。基于Http协议与Servlet写出来的 Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。 Java的白皮书为我们提出了Java语言的11个关键特质。 (1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。 (2)分布式:Java带有很强大的TCP/IP协议族的例程库,Java应用程序能够通过URL来穿过网络来访问远程对象,由于servlet机制的出现,使Java编程非常的高效,现在许多的大的web server都支持servlet。 (3)OO:面向对象设计是把重点放在对象及对象的接口上的一个编程技术.其面向对象和C++有很多不同,在与多重继承的处理及Java的原类模型。 (4)健壮特质:Java采取了一个安全指针模型,能减小重写内存和数据崩溃的可能型。 (5)安全:Java用来设计网路和分布系统,这带来了新的安全问题,Java可以用来构建防病毒和防攻击的System.事实证明Java在防毒这一方面做的很优秀。 (6)中立体系结构:Java编译其生成体系结构中立的目标文件格式可以在很多处理器上执行,编译器产生的指令字节码(Javabytecode)实现此特性,此字节码可以在任何机器上解释执行。 (7)可移植:Java中对基本数据结构类型的大小和算法都有严格的规定所以可移植很好。 (8)多线程:Java处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成.所以多线程是Java作为服务器端开发语言的流行原因之一。 (9)Applet和servlet:能够在网页上执行的程序叫Applet,需要支持Java的浏览器很多,而applet支持动态的网页,这是很多其他语言所不能做到的。 基本概念: 1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行 了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大 限度上提高复用率。 2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)。 3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)。 4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。 5.对象的3个主要特点 behavior---说明这个对象能做什么. state---当对象施加方法时对象的反映. identity---与其他相似行为对象的区分标志. 每个对象有唯一的indentity 而这3者之间相互影响. 6.类之间的关系: use-a :依赖关系 has-a :聚合关系 is-a :继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中) 7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。 例:Data类的构造器叫Data new Data()---构造一个新对象,且初始化当前时间. Data happyday=new Data()---把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者是不同的.new返回的值是一个引用。 构造器特点:构造器可以有0个,一个或多个参数 构造器和类有相同的名字 一个类可以有多个构造器 构造器没有返回值 构造器总是和new运算符一起使用. 8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法。 9.包(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包.java.lang java.util java,net等,包是分层次的所有的java包都在java和javax包层次内。 10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段。 11.扩展类:扩展类充分体现了is-a的继承关系. 形式为:class (子类) extends (基类)。 12.多态:在java中,对象变量是多态的.而java中不支持多重继承。 13.动态绑定:调用对象方法的机制。 (1)编译器检查对象声明的类型和方法名。 (2)编译器检查方法调用的参数类型。 (3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法。 (4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本。 (5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码。 14.final类:为防止他人从你的类上派生新类,此类是不可扩展的。 15.动态调用比静态调用花费的时间要长。 16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。 例: public abstract string getDescripition 17.Java中的每一个类都是从Object类扩展而来的。 18.object类中的equal和toString方法。 equal用于测试一个对象是否同另一个对象相等。 toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示. (toString 方法是一个很重要的方法) 19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。 20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大小。 21.class类 object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。 22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具。 能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大. 1.在运行时分析类的能力。 2.在运行时探察类的对象。 3.实现通用数组操纵代码。 4.提供方法对象。 而此机制主要针对是工具者而不是应用及程序。 反射机制中的最重要的部分是允许你检查类的结构.用到的API有: java.lang.reflect.Field 返回字段. java.reflect.Method 返回方法. java.lang.reflect.Constructor 返回参数. 方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案。 23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface。 24.接口不是一个类,而是对符合接口要求的类的一套规范。 若实现一个接口需要2个步骤: 1.声明类需要实现的指定接口。 2.提供接口中的所有方法的定义。 声明一个类实现一个接口需要使用implements 关键字 class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口. 25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口:Cloneable 26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。 例:ActionListener 接口监听. 类似的API有:java.swing.JOptionPane java.swing.Timer java.awt.Tookit 27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它。 28.内部类:一个内部类的定义是定义在另一个内部的类。 原因是: 1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。 2.对于同一个包中的其他类来说,内部类能够隐藏起来。 3.匿名内部类可以很方便的定义回调。 4.使用内部类可以非常方便的编写事件驱动程序。 29.代理类(proxy): 1.指定接口要求所有代码 2.object类定义的所有的方法(toString equals) 30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型。
前言: iOS 9 发布之后,推出NetworkExtension, 它可给系统WiFi列表列表里边的WiFi设置密码 、标签(副标题)。 还可获取整个WiFi列表。 首先你得向苹果申请一个权限,人家允许你使用了,你再在工程里面配置一下,这样你才可以使用.苹果会给你发个问卷调查,根据你自己的情况填写.这儿谢谢我初中学霸,专业的英语翻译果然6. 1-1.框架申请链接:https://developer.apple.com/contact/network-extension 问卷调查表 根据自己的实际情况填写.里面有个产品介绍,最好找个英文好的... 1-2 调查表填写完成后,大概过了2 ,3小时,苹果会回复给你一封邮件,并且返回给你一个fllowup.(注意,这并不是代表你已经申请成功了,邮件里面只是确认你填写的问卷信息!) 并不是成功的邮件.png 1-3 接下来,就只能等了.逛苹果论坛,据说要等三星期,可是,我TM等了5星期是什么鬼.所以当超过三星期的时候我也没闲着,打电话 :4006701855 , 虽然得到的回复还是等... 而且,值得一提的是:有人遇见过这种情况,一直没有收到苹果拒绝或者同意的邮件.但是可以使用这个类.所以当超过3星期以后,我是每天都登录到开发者账号 配置描述文件,如果发现这儿多了一个选项.如下图,这也说明你申请成功了 配置描述文件 1-5 所以呢,打了两次电话,重发了5 ,6 次邮件之后,大概苹果也觉得不好意思了吧,终于通过了.此时你会收到这也一封邮件: 通过邮件.png 恭喜您,通过了.但是不得不说,这只成功了一小半.后面你可能遇见更痛苦的事情. 2下面就来来说更痛苦的事情. 2-1 配置工程 a .新建一个App ID. 新建 App ID b. 添加iCloud 和Wireless Accessory 添加iCloud 和Wireless Accessory.png c.新建iCloud Containers 新建iCloud Containers.png d.打开刚刚创建的App ID 发现这个是黄色的,下面就要编辑这个App ID 编辑刚刚创建的AppID.png e 17407914-2B9F-42D2-9E21-7EBF50DF0FEC.png f ABD85AAF-04C8-4FDD-B6E5-005D188980ED.png g 配置App ID完成 2DEACBF8-CB87-4CB0-A6B1-2E092DAD4369.png 2-2 配置描述文件 . 注意选择新建的App ID 注意这个值要加上.png 配置好这个之后,可以到苹果提供的检测环境检测一下配置文件的正确性 附上网址 :https://forums.developer.apple.com/message/75928#75928 这一步很重要:就是检测你的工程配置的描述文件和这个账号使用权限是否对等.后面有小伙伴遇到一个bug就是ruternType一直返回NO,获取不到wifi列表,然后通过上面验证发现,证书的权限和申请使用的权限不相同. 所以这儿有个建议,如果发现获取列表时返回值是NO,把测试证书删掉,重新创建.然后再走一遍上面的流程.(我遇到的BUG奇怪的很,对着英文文档走了好几遍,确定文件没什么问题,就是返回值一直都是NO,后来,在创建iCoud的时候,把那个id改成和App ID不一样,就是按照他下面的要求创建,就奇怪的好了.) 注意 :创建完描述文件别忘了安装到Xcode,直接下载,完了双击就ok了. 3.配置Xcode工程了; 3-1 配置plist文件 (允许后台运行) 通过xml添加 <key>UIBackgroundModes</key> <array> <string>network-authentication</string> </array> 通过xml方式添加.png 添加完了会有这 3-2 targets->Capabilities->iCloud 和Wireless-Accessory-Configuration ,打开并配置icould 打开Wireless-Accessory-Configuration.png 配置完上面两个你就会发现工程左边会多了一个.entitlements结尾的文件. 然后还要向这个文件里面添加一个BOOL值为YES的字段 com.apple.developer.networking.HotspotHelper 配置.entitlements文件.png 3-3 Tagarts-->Build Settings -> code Signing 配置Build Settings 3-4 上代码 (也是蛮辛苦的) Register a Hotspot Helper + (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler @param options kNEHotspotHelperOptionDisplayName :WIFI的注释tag字符串// 此处设置的内容会在WiFi列表中每个WiFi下边展示出来 @param queue dispatch_queue_t 用来调用handle的block @param handler NEHotspotHelperHandler block 用于执行处理 helper commands. @return 注册成功YES, 否则NO. @discussion 一旦这个API调用成功,应用程序有资格在后台启动,并参与各种热点相关的功能。 当应用程序启动此方法应该调用一次。再次调用它不会产生影响,并返回NO。 这个方法是主要的. + (BOOL)logoff:(NEHotspotNetwork *)network @param network 对应当前关联的WiFi网络NEHotspotNetwork @return 注销命令已成功进入队列YES, 否则NO. @discussion 调用此方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向应用程序发出的“handler”模块 网络参数必须符合当前关联的WiFi网络,即它必须来自对NEHotspotHelperCommand网络属性或方法supportedInterfaces + (NSArray *)supportedNetworkInterfaces @return 如果没有网络接口被管理,返回nil。否则,返回NEHotspotNetwork对象数组。 @discussion 每个网络接口由NEHotspotNetwork对象表示。当前返回的数组包含一个NEHotspotNetwork对象代表Wi-Fi接口。 这种方法的主要目的是当没有得到一个命令来处理它时,让一个热点助手偶尔提供在UI里其准确的状态。 此方法加上NEHotspotNetwork的isChosenHelper方法允许应用程序知道它是否是当前处理的网络。 +(void)getWifiList{ NSMutableDictionary* options = [[NSMutableDictionary alloc] init]; [options setObject:@"
前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的人会选择swift来进行iOS的开发看上去更是成为了一种趋势, 不过一个合格的iOS开发者对oc以及c语言的掌握是必不可少的技能, 本篇中主要是写一些大家平时都可能用到但是不一定知道的oc的东西 oc中的对象的创建: 首先会通过 +(id)alloc 动态的分配所有的变量以及父类定义的变量所需要的足够内存, 同时会清除所有的分配的内存空间, 全部置为0 同时接着需要调用class的 -(id)init 方法, 这个方法给每个变量设置初始值 返回的类型为id, id是一个可以指向任意类型的指针(不用 * 号), 这个在一定程度上可以完成多态的效果 对oc中的class文件的理解: class, extension, category ZJPerson.h文件 Snip20160817_4.png ZJPerson.m文件 Snip20160817_5.png ZJPerson.m文件 m [[XXObject alloc] init] 初始化方法不需要参数的时候, 和 [XXObject new] 方法相同 通过字面量来初始化对象, 例如 NSString *string = @"string"; == [[NSString alloc] initWithString:@"string"];等初始化方法 NSNumber *myBOOL = @YES; == [[NSNumber alloc] initWithBool:YES]; NSNumber *myFloat = @3.14f; == NSNumber *myInt = @42; == NSNumber *myLong = @42L; ==... oc(c)中多行宏的定义(这个在swift...中更方便直接一个全局的函数就搞定了): 在除了最后一行的每一行结尾加一条反斜杠 \ 定义.png 使用.png 比较是否相同: 使用 if(a==b) {}, 如果a,b是对象类型, 那么比较的是指针是否相同, 而不是比较值是否相同, 如果a, b是基本类型(int, double...), 那么比较的是值是否相同; 使用if ([a isEqual: b]) { }, 则比较的是a,b的值是否相同 初始化基本类型的时候尽量设置初始值, 因为编译器分配的初始值并不确定, 但是对象类型会默认初始化为nil 条件判断: 当对象不为nil(有内存地址)的时候, 或者基本类型非0, 或者bool类型为true, 这个时候条件都为真, 其他情况条件为假 oc中属性的getter和setter@property (nonatomic) NSString *name; 例如当有这样一个name属性的时候, 默认是readWrite的, 编译器会自动生成一个set (setName:)和get(-(NSString *)name)方法, 这个时候可以通过set或者get方法访问到name, 如果申明为(readonly), 那么将只会生成get方法 [self setName:@"set name"]; NSString *getName = [self name]; 也可以通过点语法访问(实际上是会自动调用set和get方法) self.name = @"set name"; NSString *dotName = self.name; 同时你可以重写name的get(懒加载...)和setter(拦截set方法)... 对应name属性, 编译器会生成(synthesize)一个 _name 允许我们直接通过指针访问变量, 而不会调用get方法, 所以通过_xx访问的变量不会调用懒加载(get方法), 所以在写懒加载方法的时候, 不能使用self.xx(造成死循环), 而要使用_xx - (NSString *)name { // 这里面不能使用self.name , 因为点语法会调用这个get方法, 造成死循环 if (_name == nil) { _name = @"name"; } return _name; } 同时这个synthesize的名字我们是可以自己修改的, 使用如下的语法@synthesize name = customName; 那么这个时候就不能通过 __name访问到name了, 因为我们已经指定了通过customName才能访问到了NSString *getName = customName; 当然如果, 你是这样写的 @synthesize name;, 并没有指定名字, 这个时候访问的时候就直接使用变量名而不需要加下划线( _ )了 name = @"set name";