详解NSString为什么要用copy/strong关键字

经常看到这样一个问题:NSString为什么要用copy关键字,如果用strong会有什么问题?

在实际开发中,用copy或strong修饰NSString都没有错。Copy有安全的优势,但不代表NSString用copy就一定是最好的。

通过代码来实践:

创建两个用Copy和Strong修饰的属性

1
2
@property (nonatomic, strong) NSString * theStrong;
@property (nonatomic, copy) NSString * theCopy;

Read More

Base64编码理解

  1. 将每三个字节作为一组,一共是24个二进制位。
  2. 将这24个二进制位分为四组,每个组有6个二进制位。
  3. 在每组前面加两个00,扩展成32个二进制位,转换为10进制 即四个字节。(如果字节数不足三,最后一组除了前面加两个0以外,后面也要加两个0。)
  4. 得到扩展后的每个字节的对应符号,这就是Base64的编码值。

汉字: 先转换为24位的二进制字符串,然后按规则,转换成四组一共32位的二进制值。

参考

iOS代码混淆

在开发项目中,可能有的项目产品需要防止dump,虽说iOS开发是闭源开发,但是通过一些第三方工具还是能把源代码清晰地dump出来。一些接口和重要方法很可能因此而泄密。因此,我们仍然需要做代码混淆工作。

注意:
个人使用过程中,XIB文件方法、category方法混淆后会无法调用。

代码混淆详细步骤>>

智能硬件 蓝牙搜索遇到的问题

最近做蓝牙智能硬件项目时,遇到这样一个问题:项目代码没有任何改动,APP搜索不到周围蓝牙。打开其他APP搜索一切正常,使用的是相同代码。可以推断不是蓝牙搜索代码的问题,应该是APP和蓝牙硬件交互过程出现异常。

错误日志:Cancelling connection for unused peripheral 或者 Forcing disconnection of unused peripheral。根据英文意思,应该是有一个设备没有正常断开连接。

解决方法:

  1. 在输出的日志中找到没有正常断开连接蓝牙设备UUID
  2. 根据UUID获取到CBPeripheral
  3. 断开CBPeripheral和APP的连接

问题即可解决!

Apple Watch网络请求

Apple Watch POST网络请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
NSURL *url = [NSURL URLWithString:@"http://testUrl.com:8080/wallet.html"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

NSString *bodyStr = [NSString stringWithFormat:@"xx=xx&xx=xx"];

NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPBody:bodyData];

[request setValue:[NSString stringWithFormat:@"string"] forHTTPHeaderField:@"heardstring"];

NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request

completionHandler:

^(NSData *data, NSURLResponse *response, NSError *error) {

NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];

NSLog(@"解析到的数据 dic = %@",dic);
NSLog(@"解析到的数据 error = %@",error);
}];

//使用resume方法启动任务
[dataTask resume];

KeychainItemWrapper本地持久化

Keychain优点:

① 保存的信息不会因App被删除而丢失,在用户重新安装App后依然有效(需要导入Security.framework)
② 不同App共享KeyChain数据

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
NSString * userName = @"Name";   //用户名
NSString * passWord = @"123456"; //密码

KeychainItemWrapper * keychain = [[KeychainItemWrapper alloc]initWithIdentifier:@"UserKeychain"accessGroup:nil];

//必须设置kSecAttrService,KeyChain内部以kSecAttrAccount与kSecAttrService作为唯一钥匙串标识,两个都必须设置才行
[keychain setObject:@"UserKeychain" forKey:(id)kSecAttrService];

//保存用户名
[keychain setObject:userName forKey:(id)kSecAttrAccount];

//保存密码
[keychain setObject:passWord forKey:(id)kSecValueData];

Read More

iPhone手机硬件信息

如果要保证UUID的唯一性,可以使用keychain来保存

1
2
3
4
5
6
7
8
9
10
11
NSString * identifierNumber = identifierNumber = [[UIDevice currentDevice].identifierForVendor UUIDString];
NSLog(@"硬件序列号: %@",identifierNumber);

NSString *sysVersion = [[UIDevice currentDevice] systemVersion];
NSLog(@"系统版本号:%@", sysVersion);

struct utsname systemInfo;
uname(&systemInfo);
NSString* phoneModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
phoneModel = [self returnIphoneModel:phoneModel];
NSLog(@"手机型号: %@",phoneModel);

iPhone设备型号列表:

Read More