XMPP代码实现
XMPP需要注意的地方
我们主要实现四个功能:
1.注册
2.登录
3.获取好友列表
4.聊天(最重要的功能)
首先我们创建一个工程
然后我们要引入XMPP所需要的框架。
在这里要给大家说明的是,Xcode5和Xcode6之间有一些区别
在Xcdoe5里面 我们需要导入libresolv.dylib框架和libxml2.dylib框架(xmpp是依赖于Xml的)
另外需要在Build Settings 下的Header Search Paths添加路径/usr/include/libxml2(注意是usr不是user)
但是由于Xcode6里面已经内置了框架,所以我们不用添加
我们在引入
这个框架的时候,Xcode6会给我们报错,提示我们UIImage等文件无法识别缺少框架
我们在学习UIImage的时候已经有说过,UIImage是UIKit管理数据源的,而我们的OC是由Foundation来管理的。这里千万要记住
运行一下,OK没问题
我们来搭建一下我们的页面,这次使用storyboard来进行此次的页面搭建
通常我们在使用storyboard的时候只用一个就创建所有的页面,这样的好处呢就是直观
在一个文件里可以看到所有的界面和他们之间的关系
那不好的地方就是一旦你得界面多了那就看起来太混乱,关系太复杂了,我们来看一个例子
这样的话我们打开这个storyboard的话,如果你得电脑性能比较好那打开的还稍微快点
如果你得电脑性能稍微差一点的话打开这个storyboard就需要十到二十几秒的时间,加载的特别慢,所以我们可以把这个storyboard按模块进行拆分
我们这个登录注册就算是一个模块,一般我们登录了以后就保存了我们的登录状态
下次就不需要保存了,我们就不再需要这个登录功能了,所以呢,我们可以把登录注册放在一个storyboard里面
我们的获取好友列表和聊天的功能就可以放在另一个storyboard里面,这样就可以划分这个storyboard文件
结构比较清晰,而且我们第二次进入这个应用的时候就可以不再加载这个登录界面,可以节省一些内存资源,这也是懒加载的一种形式
首先我们创建一个storyboard作为登录和注册的模块
我们创建了storyboard后需要创建相对应的视图控制器来进行关联一下各个界面
然后我们关联一下我们的控件,我们的注册按钮在关联的时候只需要关联一下事件就行了。
这个时候我们已经有了两个storyboard,那如何才能切换呢?
我们是不是需要去进行一个登录状态的判断呢?
判断一下当前的登录状态,如果未登录,我们让他显示登录界面
如果已经登录成功,那让他显示我们的聊天界面或好友列表界面
在我们的Appdelegate里,
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}
在这个方法内,我们首先创建一个storyboard
UIStoryboard *MainStorybard
然后我们点进去看一看他里面的方法
我们可以看到有一个加号方法,
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil;
他有两个参数
这个Name就是你得storyboard文件名字
还有一个bundle,这个bundle就是你这个storyboard文件所在的bundle
如果你这个文件在mainbundle里面,我们就可以给他一个nil,他就会尝试去mainbundle里去查找,这是一个便利构造方法
下面还有两个实例方法
- (id)instantiateInitialViewController;
- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier;
这两个方法有什么区别呢?
instantiateInitialViewController是什么呢?
我们可以点击我们其中一个storyboard,
设置好了以后我们的NavigationController 前面会有一个箭头
这个方法的功能就是把我们的storyboard设置为主入口
我们现在来完成我们的storyboard对象,name不用给后缀,bundle如果给nil,则默认为是mainBundle
然后获取storyboard中得入口视图控制器对象
如图:
在这里,我们展示之前需要写入[self.window makeKeyAndVisible];
在这段代码中我们有一句
BOOL haveLogin = [[NSUserDefaultsstandardUserDefaults]boolForKey:@“haveLogin”];
这段代码的意思就是判断我们的登陆状态
这里有时会出现一个路径错误
file '/Applications/Xcode 2.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIStoryboard.h' has been modified since the precompiled header '/Users/lanou3g/Library/Developer/Xcode/DerivedData/ModuleCache/3V1NN6TL894NX/UIKit-2DYE2I2D1B3GL.pcm' was built
我们点击Finder 前往文件夹/Users/lanou3g/Library/Developer/Xcode/DerivedData/ModuleCache/3V1NN6TL894NX/UIKit-2DYE2I2D1B3GL.pcm
进入里面把UIKit-2DYE2I2D1B3GL.pcm这个文件删除掉,重新编译一下就没问题了