「 iOS知识小集 」2018 · 第 41 期

栏目: IOS · 发布时间: 6年前

内容简介:作者:高老师很忙之前和大家分享过一次关于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 地址)等,相应的代码也很简单,大致如下图所示:

「 iOS知识小集 」2018 · 第 41 期

在 Xcode 10(iOS 12)之前,上述代码可以正常运行取到结果,但当升级到 Xcode 10 后编译工程在 iOS 12 上运行时,同样的代码却无法取得 WiFi 的信息。通过断点调试发现 CNCopyCurrentNetworkInfo(...) 函数总是返回 nil ,查阅官方 API 文档,发现该函数的描述多了一条重要提示,如下图红框内容:

「 iOS知识小集 」2018 · 第 41 期

大致意思是说:在 iOS 12 及以上系统调用该方法时,需要先在 Xcode 工程中授权获取 WiFi 信息的能力,开启路径为:Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON,如下图:

「 iOS知识小集 」2018 · 第 41 期

设置完毕后,我们可以发现在工程的 .entitlements 文件会多了一对键值:

Access WiFi Information => YES

至此,我们就可以正常在 iOS 12+ 中获取 WiFi 的信息了。

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;
}
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Web开发从初学到精通

Java Web开发从初学到精通

方振宇 / 电子工业 / 2010-6 / 69.00元

《Java Web开发从初学到精通》介绍如何整合Web框架进行J2EE开发,所有实例都基于MyEclipse IDE开发,引领读者快速进入基于JaVa web的J2EE应用领域。《Java Web开发从初学到精通》开始主要介绍Servlet、JSP、JavaBean、EL、JSTL、JDBC等Web开发基础知识,然后学习Struts、Hibernate、Spring、Ajax、JSF等开源框架,并......一起来看看 《Java Web开发从初学到精通》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具