内容简介:作者:高老师很忙之前和大家分享过一次关于IAP的坑,最近又发现了一个新坑:sob::通常我们是根据针对这种情况,就需要我们在业务上进一步处理,同时还要兼顾之前分享的关于丢单处理的逻辑,防止丢单会涉及一些订单信息的本地存储,之前可能会在收到取消支付回调时删除对应的本地订单信息,这种情况就需要重新补充订单信息。
作者:高老师很忙
之前和大家分享过一次关于IAP的坑,最近又发现了一个新坑:sob::通常我们是根据 -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(nonnull NSArray<SKPaymentTransaction *> *)transactions
方法回调来确认用户支付成功还是失败,从而进入不同的业务处理;然而我最近发现苹果可能会返回错误的回调,用户实际已经支付成功,但是会先收到一次取消支付的回调,然后马上又收到一个支付成功的回调。
针对这种情况,就需要我们在业务上进一步处理,同时还要兼顾之前分享的关于丢单处理的逻辑,防止丢单会涉及一些订单信息的本地存储,之前可能会在收到取消支付回调时删除对应的本地订单信息,这种情况就需要重新补充订单信息。
Xcode 10 / iOS 12 获取 WiFi 信息
作者:KANGZUBIN
在一些特定业务场景下,我们需要获取 iOS 设备所连接的 WiFi 的信息,比如 WiFi 的 SSID
(即 WiFi 的名称),WiFi 的 BSSID
(即 WiFi 的路由器的 Mac 地址)等,相应的代码也很简单,大致如下图所示:
在 Xcode 10(iOS 12)之前,上述代码可以正常运行取到结果,但当升级到 Xcode 10 后编译工程在 iOS 12 上运行时,同样的代码却无法取得 WiFi 的信息。通过断点调试发现 CNCopyCurrentNetworkInfo(...)
函数总是返回 nil
,查阅官方 API 文档,发现该函数的描述多了一条重要提示,如下图红框内容:
大致意思是说:在 iOS 12 及以上系统调用该方法时,需要先在 Xcode 工程中授权获取 WiFi 信息的能力,开启路径为:Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON,如下图:
设置完毕后,我们可以发现在工程的 .entitlements
文件会多了一对键值:
Access WiFi Information
=> YES
至此,我们就可以正常在 iOS 12+ 中获取 WiFi 的信息了。
- 参考链接: juejin.im/post/5ba20f…
Swift 4.x 中使用 +load 和 +initialize
+load 和 +initialize 方法是我们写 Objective-C 代码时常用的两个方法,不过貌似在 Swift 4.x 后,这两个方法在 Swift 类中不那么好使,会报如下编译错误:
Method 'load()' defines Objective-C class method 'load', which is not permitted by Swift Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift 复制代码
所以,如果想在 Swift 类中使用这两个方法,则需要求助于 Objective-C,使用变通的方法,如下代码所示:
// swift class Monitor: NSObject { @objc class func swiftLoad() { // do something print("swift load") } @objc class func swiftInitialize() { // do something print("swift initialize") } } // Objective-C @implementation Monitor (Private) + (void)load { [self swiftLoad]; } + (void)initialize { [self swiftInitialize]; } @end 复制代码
当然,由于这两个方法是 NSObject 类中声明的,所以我们的 Swift 类必须继承自 NSObject 或其子类。另外,我们也可以不用上面这么麻烦地去定义 swiftLoad/swiftInitialize 方法,而是所有操作直接在 Objective-C 代码中完成。
SecRandomCopyBytes 生成伪随机数
在iOS中,生成伪随机数可以使用这么几个函数: rand()
、 random()
、 arc4random()
。另外我们知道随机数是密码技术的核心部分,所以 Apple 也为我们提供了相应的生成随机数的方法,即 SecRandomCopyBytes,这个方法位于 Security.framework
中,所以使用时需要先导入这个库,使用的方法如下:
+ (NSString *)generateRandom { static int size = 8; uint8_t randomBytes[size]; int result = SecRandomCopyBytes(kSecRandomDefault, size, randomBytes); if (result == errSecSuccess) { NSMutableString *randomString = [[NSMutableString alloc] initWithCapacity:size * 2]; for (int i = 0; i < size; i++) { [randomString appendFormat:@"%02x", randomBytes[i]]; } return randomString; } else { return nil; } } 复制代码
这里我们生成一个 8 字节长的uint8_t数组,然后将其转换成 hex 字符串得到一个长度16的随机字条串。另外这个函数也可以作为生成 UUID 的辅助操作,如下代码所示:
+ (NSString*)generateCryptoSecureUUID { unsigned char bytes[16]; int result = SecRandomCopyBytes(kSecRandomDefault, 16, bytes); if (result != noErr) { return nil; } return [[NSUUID alloc] initWithUUIDBytes:bytes].UUIDString; } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 肖仰华谈知识图谱:知识将比数据更重要,得知识者得天下
- 基础知识:css3核心知识整理
- 从知识工程到知识图谱全面回顾 | AI&Society
- 知识图谱发展的难点&构建行业知识图谱的重要性
- 《面试知识,工作可待:集合篇》:Java 集合面试知识大全
- 第四期知识与认知图谱:神经机器翻译也应该嵌入「知识」
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JSP网站开发四“酷”全书
万峰科技 / 电子工业出版社 / 2005-9 / 49.00元
本书以JSP为开发语言,选取当前最流行、最具代表性的4类网站:新闻站点、论坛、电子商城和博客(Blog)系统为例,详细介绍了使用JSP开发网站的核心技术。掌握了本书所举4类网站的开发技术,将帮助你成为网站开发的“全能冠军”。 本书结合作者多年在网站系统开发方面的经验,从系统的需求分析开始,确定系统的流程与设计,到模块的划分,再到数据加结构的设计,最后开始每个模块编程开发,贯穿了网站开......一起来看看 《JSP网站开发四“酷”全书》 这本书的介绍吧!