• 1. 技术分享Apple pay
  • 2. Apple payApple Pay,是苹果公司在2014苹果秋季新品发布会上发布的一种基于NFC的手机支付功能,于2014年10月20日在美国正式上线。 2016年2月18日凌晨5:00, Apple Pay 业务在中国上线。
  • 3. (本页无文本内容)
  • 4. 在Xcode和苹果开发者会员中心中配Apple Pay使用Apple Pay的APP需要一项特殊的权限,该权限可以在开发者会员中心和Xcode中开启。你同样需要注册一个商业标示,并设置密钥;在给服务器发送支付信息时,这些密匙可以确保数据的安全传输。 需要一个商号的ID标识,你需要注册一个商号的身份,并且配置证书
  • 5. 开启支付功能
  • 6. 判断支付可否进行
  • 7. PKPaymentRequest支付对象类,对属性进行配置,填充支付信息
  • 8. (本页无文本内容)
  • 9. 显示认证视图
  • 10. 代理方法处理结果
  • 11. (本页无文本内容)
  • 12. 多线程概述当用户播放音频、下载资源、进行图像处理时往往希望做这些事情的时候其他操作不会被中断或者希望这些操作过程中更加顺畅。在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验。早在单核处理器时期就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行,不影响用户其他UI操作),其处理能力并没有明显的变化。如今无论是移动操作系统还是PC、服务器都是多核处理器,于是“并行运算”就更多的被提及。一件事情我们可以分成多个步骤,在没有顺序要求的情况下使用多线程既能解决线程阻塞又能充分利用多核处理器运行能力。
  • 13. 在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程。由于在iOS中除了主线程,其他子线程是独立于Cocoa Touch的,所以只有主线程可以更新UI界面(新版iOS中,使用其他线程更新UI可能也能成功,但是不推荐)。iOS中多线程使用并不复杂,关键是如何控制好各个线程的执行顺序、处理好资源竞争问题。常用的多线程开发有三种方式: 1.NSThread  2.NSOperation  3.GCD 三种方式是随着iOS的发展逐渐引入的,所以相比而言后者比前者更加简单易用,并且GCD也是目前苹果官方比较推荐的方式(它充分利用了多核处理器的运算性能)。
  • 14. NSThreadNSThread是轻量级的多线程开发,使用起来也并不复杂,但是使用NSThread需要自己管理线程生命周期,线程同步。
  • 15. 创建1、 [NSThread detachNewThreadSelector:@selector(NSThreadActM) toTarget:self withObject:nil];创建后运行直接调用开启线程 2、 thread = [[NSThread alloc]initWithTarget:self selector:@selector(NSThreadAct) object:nil]; thread.name = @"thread线程"; [thread start];创建后需要调用start方法开启线程
  • 16. 线程操作-加锁NSLock,它遵循 NSLooking协议,我们可以使用 lock, tryLock, lockBeforeData:来加锁,用 unLock来解锁。同一个NSLock对象成功调用lock函数后,在其显式unlock之前任何线程都不能再对此NSLock对象加锁,以达到互斥访问的目的。使用示例: NSLock*lock = [[NSLock alloc] init]; [lock lock];加锁 [obj yourMethod];需要加锁的线程写在这里 [lock unlock];解锁 除了lock函数,对NSLock加锁的函数还包括tryLock以及lockBeforeDate函数,lock函数在成功加锁之间会一直阻塞,而tryLock会尝试加锁,如果不成功,不会阻塞,而是直接返回NO,lockBeforeDate则是阻塞到传入的NSDate日期为止。 BOOL isLock = [lock lockBeforeDate:<#(nonnull NSDate *)#>]; BOOL isLock = [theLock tryLock];
  • 17. 线程控制- (void)cancel NS_AVAILABLE(10_5, 2_0);结束线程 (void)start NS_AVAILABLE(10_5, 2_0);开启线程  + (void)sleepForTimeInterval:(NSTimeInterval)time; //线程休眠 + (void)sleepUntilDate:(NSDate *)date; + (void)exit; //exit是用于立即结束当前线程的运行(有点鲁莽),因为无法保证当前线程对资源的释放,所以不推荐使用。
  • 18. 线程间的通讯副线程给主线程发消息:[self performSelectorOnMainThread:@selector(mainThreadMethod) withObject:nil waitUntilDone:NO]; self是方法的调用者,mainThreadMethod是让主线程调用的方法,然后这个方法可以带参数,也就是object,最后的waitUntilDone是指是否等到主线程把方法执行完了,这个performSelector方法才返回。 向其他任意线程发消息:[self performSelector:@selector(timerFire) onThread:_thread1 withObject:nil waitUntilDone:NO];主要是这里要传入一个NSThread对象用于指定在哪个线程执行,这也是前面构建线程的时候保留线程对象的意义。 然后,需要注意的是,这些performSelector形式的方法,都需要对方线程的RunLoop处于开启状态,因为这些方法实质是runloop的输入源,把消息发送给对方线程的runloop,然后对方从runloop里面获取消息,才去执行方法。主线程的runloop是默认开启的,副线程的runloop是默认构建,但是需要手动开启。
  • 19. 线程 间通信  
线程 在运行过程中,可能需要与其它线程 进行通信。我们可以使用 NSObject 中的一些方法: 
在应用程序主线程 中做事情: 
performSelectorOnMainThread:withObject:waitUntilDone: 
performSelectorOnMainThread:withObject:waitUntilDone:modes: 
 
在指定 线程 中做事情: 
performSelector:onThread:withObject:waitUntilDone: 
performSelector:onThread:withObject:waitUntilDone:modes: 
 
在当前 线程 中做事情: 
performSelector:withObject:afterDelay: 
performSelector:withObject:afterDelay:inModes: 
 
取消发送给当前 线程 的某个消息 
cancelPreviousPerformRequestsWithTarget: 
cancelPreviousPerformRequestsWithTarget:selector:object: 
  • 20. 结束!