NFC简介
NFC(Near FieldCommunication) 是短距离非接触式的一种通信方式,它结合了非接触式感应以及无线连接技术,作用于13.56Mhz 频带,传输距离大约10CM 左右。传输速度目前为106Kbit/s、212Kbit/s 或者424Kbit/s,将来可提高至1Mb 左右。它不仅符合ISO18092、ISO21481、ECMA(340,352 以及356)和ETSI TS 102190 标准,而且与采用ISO14443A、B 标准广泛应用的非接触智能卡基础设备兼容。如飞利浦的MIFARE 技术以及索尼的Felica 技术。
与其它短距离无线通信技术相比,NFC 更安全,反应时间更短,因此非常适合作为无线传输环境下的电子钱包技术,交易快速且具有安全性。除了支付功能,NFC 技术还可以提供各种设备间轻松,安全,迅速而自动的通信。例如NFC 可以帮助人们在不同的设备间交换信息,例如音乐、信息、照片、视频剪辑等,还可以购买新的信息内容。
NFC的三种工作模式
卡模式 :是指用于非接触移动支付,如商场、交通等应用中,用户只需要将手机靠近读卡器,然后用户只需输入密码确认交易或者直接接收交易即可。例如门禁管制,车票,门票等等。此种方式下,卡片通过非接触读卡器的RF 域来供电,即便是手机没电也可以工作。
点对点通信模式 :即实现无线数据交换,将两个具备NFC 功能的设备链接,能实现数据点对点传输,如下载音乐,交换图片或者同步设备地址薄。因此通过NFC,多个设备如数字相机,PDA,计算机,手机之间,都可以进行无线胡同,交换资料或者服务。
读卡器模式
:即作为非接触读卡器使用,比如从海报或者展览信息电子标签上读取相关信息。
NFC技术的几种实现
NFC手机方案
该方案中NFC 功能芯片和天线与手机的其他部分及SIM 卡相独立,但NFC模块与手机共用电池。电池有电时,NFC 模块可在主动、被动和双向三种模式下工作;电池断电时,只能在被动模式下工作,相当于普通的一卡通。手机开关机对NFC 模块无影响,即在手机关机时也可使用NFC 功能。
实现方式有两种:一是定制手机,将天线集成在手机电池或主板上,使NFC 应用与手机融为一体,工作稳定可靠,但需更换手机;二是将天线与NFC 芯片直接相连,然后与电池紧贴放在电池和手机后盖之间,用户不需更换手机。
此方案的不足在于,天线连接的可靠性不高;此外对手机的内部尺寸有特殊要求,增加天线之后影响了手机的便携性。此方案的NFC 模块不能和手机的处理器或SIM 卡通信,用户和电信运营商无法通过手机控制NFC 模块。这会造成信用卡发行商和手机制造商单独接触,完全脱离电信运营商的市场格局。另一方面,若要将NFC 模块收发的信息与蜂窝网络联系起来,须在NFC 模块和手机基带芯片间建立接口,且各层的设计都必须绕开运营商的控制,也无法直接读写SIM 卡,软硬件设计将变得非常复杂。此方案的优点是对不同技术、不同信用卡发行商的卡兼容性好,在全球已有很多案例,应用技术也比较成熟,比较适合试点期的项目。
双界面SIM 卡方案
该方案基于一种双界面智能SIM 卡,支持非接触式应用,同时也可实现普通手机SIM 卡的功能,在接听拨打电话、收发短信时不影响非接触式操作。两种实现方式与NFC 方案基本相同:一是定制手机;二是将天线与SIM 卡直接相连后放在电池和手机后盖之间,这样可只更换SIM 卡,降低成本,缺点也是天线连接的可靠性低、对手机尺寸要求高等。该方案占用了C4 和C8 接口,而这两个接口是用于高速数据下载的,可能会影响到未来高速空中下载应用。
带有USIM 卡安全功能的NFC 方案
此方案是目前的主推方案,分离了应用层和底层功能,把NFC 应用重要数据以及安全控制放在SIM 卡中,把NFC 功能芯片放在手机中。NFC 主控芯片通过SWP/HCI 协议与SIM 卡通信,不会占用原有的准备用于大容量卡的管脚。应用Midlet 与SIM 卡通过标准ISO7816 协议通信。用户更换SIM 卡时,可以带走现有的交易数据,实现彻底的机卡分离。
UITableView下拉刷新页面的实现
以前看到facebook,人人和其他的一些应用,很多都使用了下拉列表,列表就重新加载数据的应用.感觉用户体验很好,但是一直没有时间找相应的解决方法,今天终于有时间整理一下代码:
下图是实现的效果图,当用户下拉列表的时候,就出现向上的箭头.
实现的开源框架是:https://github.com/enormego/EGOTableViewPullRefresh
实现过程很简单,下载相应的demo,然后拷贝资源文件和EGORefreshTableHeaderView.h和EGORefreshTableHeaderView.m到相依的工程中.在table所在的类中添加如下代码:
#import <UIKit/UIKit.h>
#import "EGORefreshTableHeaderView.h"
@interface iphone_navtaViewController : UIViewController
<UITableViewDelegate,UITableViewDataSource,EGORefreshTableHeaderDelegate>{
BOOL isflage;
IBOutlet UITableView *myTableView;
EGORefreshTableHeaderView *_refreshHeaderView;
BOOL _reloading;
}
@property (nonatomic,retain) UITableView *myTableView;
- (void)reloadTableViewDataSource;
- (void)doneLoadingTableViewData;
@end
实现方法:
#import "iphone_navtaViewController.h"
@implementation iphone_navtaViewController
@synthesize myTableView;
- (void)viewDidLoad {
[super viewDidLoad];
if (_refreshHeaderView == nil) {
EGORefreshTableHeaderView *view1 = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 10.0f – self.myTableView.bounds.size.height, self.myTableView.frame.size.width, self.view.bounds.size.height)];
view1.delegate = self;
[self.myTableView addSubview:view1];
_refreshHeaderView = view1;
[view1 release];
}
[_refreshHeaderView refreshLastUpdatedDate];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
self.myTableView=nil;
_refreshHeaderView=nil;
}
- (void)dealloc {
_refreshHeaderView=nil;
[self.myTableView release];
[super dealloc];
}
#pragma mark –
#pragma mark onClick
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
isflage=!isflage;
[super.navigationController setNavigationBarHidden:isflage animated:TRUE];
[super.navigationController setToolbarHidden:isflage animated:TRUE];
}
#pragma mark –
#pragma mark UITableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"tag"];
if (cell==nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:@"tag"] autorelease];
}
//表格设计
return cell;
}
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
#pragma mark –
#pragma mark Data Source Loading / Reloading Methods
- (void)reloadTableViewDataSource{
NSLog(@"==开始加载数据");
_reloading = YES;
}
- (void)doneLoadingTableViewData{
NSLog(@"===加载完数据");
_reloading = NO;
[_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.myTableView];
}
#pragma mark –
#pragma mark UIScrollViewDelegate Methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
[_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
}
#pragma mark –
#pragma mark EGORefreshTableHeaderDelegate Methods
- (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
[self reloadTableViewDataSource];
[self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];
}
- (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
return _reloading;
}
- (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
return [NSDate date];
}
@end
一个最重要的步骤,就是要添加QuartzCore.framework组建。
然后运行即可。
一些项目在Xcode4里编译的时候,会出现如下错误:
Check dependencies
[BEROR]No architectures to compile for (ARCHS=armv6 armv7, VALID_ARCHS=).
解决方法如下:
在项目设置里Architectures下有个Valid Architectures选项,如果出现如上错误,该选项默认是空白的,将其
修改成armv6 armv7,然后编译就可以了!!!