<commit_before>---
layout:     post
title:      Tips
subtitle:   在不断填坑中前进。。
date:       2030-09-22
author:     三十一
header-img: img/post-bg-nextgen-web-pwa.jpg
header-mask: 0.3
catalog:    true
tags:
   - iOS
---

# Tips

### 1. TARGET_IPHONE_SIMULATOR
经常集成的第三方库，有些不支持模拟器，每一次调试代码要么就是一直连接真机，要么就是，把这个库相关的代码屏蔽，其实有更优雅的解决办法：`TARGET_IPHONE_SIMULATOR`

使用示例如下：

```
#if TARGET_IPHONE_SIMULATOR
#else
//只支持真机的第三方库
#import <LopeKit/LopeKit.h>
#endif



#if TARGET_IPHONE_SIMULATOR
//模拟器编译代码
@interface BluetoothManager()
<
CBCentralManagerDelegate
>
#else
//非模拟器编译代码
@interface BluetoothManager()
<
NPDSophKeyDelegate,//只支持真机的第三方库代理
CBCentralManagerDelegate
>
#endif
```

### 2. 构建版本一直不显示

从iOS10开始,苹果更加注重对用于隐私的保护,app里边如果需要访问用户隐私,必须要做相应隐私权限的描述,所以要在plist文件中添加描述。
下面是几种权限的描述，按需添加：

* `麦克风权限`：Privacy - Microphone Usage Description 是否允许此App使用你的麦克风？
* `相机权限`： Privacy - Camera Usage Description 是否允许此App使用你的相机？
* `相册权限`： Privacy - Photo Library Usage Description 是否允许此App访问你的媒体资料库？
* `通讯录权限`： Privacy - Contacts Usage Description 是否允许此App访问你的通讯录？
* `蓝牙权限`：Privacy - Bluetooth Peripheral Usage Description 是否允许此App使用蓝牙？
* `语音转文字权限`：Privacy - Speech Recognition Usage Description 是否允许此App使用语音识别？
* `日历权限`：Privacy - Calendars Usage Description 是否允许此App使用日历？
* `定位权限`：Privacy - Location When In Use Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据


### 3. IDFA
友盟的提供的无 IDFA 版本的 SDK。
使用命令行检查含有 IDFA，但是审核的时间选择 `否`，又不影响审核。🤣🤣

```
➜  copm_staff grep -r advertisingIdentifier .
Binary file ./copm_staff/Business/lib/Share/UMSocial/UMSocialSDK/UMSocialCore.framework/UMSocialCore matches
Binary file ./copm_staff/Expand/UMessage/UMessage_Sdk_1.4.0/libUMessage_Sdk_1.4.0.a matches
Binary file ./copm_staff/Expand/UMessage/UMessage_Sdk_1.5.0a/libUMessage_Sdk_1.5.0a.a matches
Binary file ./UMMobClick.framework/UMMobClick matches
Binary file ./UMMobClick.framework/Versions/A/UMMobClick matches
Binary file ./UMMobClick.framework/Versions/Current/UMMobClick matches
```

### 4. 生成好看的代码图片

这个网站：https://carbon.now.sh/ 可以把代码生成一种很好看的格式。

![test](/img/in-post/carbon_code.png)


### 5. 安装破解的文件
 “通用”里有时没有“任何来源”这个选项：
 
显示"任何来源"选项在控制台中执行：
`sudo spctl --master-disable` 

不显示"任何来源"选项（macOS 10.12默认为不显示）在控制台中执行：
 `sudo spctl --master-enable`

### 6. 近距离感应器


```
// 打开距离传感器
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
// 通过通知监听有物品靠近还是离开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];

- (void)proximityStateDidChange:(NSNotification *)note
{
    if ([UIDevice currentDevice].proximityState) {
        NSLog(@"有物品靠近");
    } else {
        NSLog(@"有物品离开");
    }
} 
```

### 7. 使用第三方库上层再来一次封装
 使用第三方库上层再来一次封装，不要直接使用第三方库，这样的好处是替换第三方库的成本会低很多。譬如使用 `AFNetworking`,`MJRefresh`等。如果做了一层封装，以后替换就只需要修改封装的上层代码。
 
### 8. Mac `预览/Preview` 启动后就卡死的问题

打开 `~/Library/Containers` 目录。

找到 `com.apple.preview` 相关目录，删掉后，重新打开 `预览/Preview` 就可以正常使用了。

### 8. `source` 命令

在编译核心时，常常要反复输入一长串命令，如

```
make mrproper
make menuconfig
make dep
make clean
make bzImage
.......
```

这些命令既长，又繁琐。而且有时候容易输错，浪费你的时间和精力。如果把这些命令做成一个文件，让它自动按顺序执行，对于需要多次反复编译核心的用户来说，会很方便。
用`source`命令可以办到这一点。它的作用就是把一个文件的内容当成是`shell`来执行。


`shell` 编程中的命令有时和C语言是一样的。`&&` 表示与，`||` 表示或。把两个命令用 `&&` 联接起来，如 `make mrproper && make menuconfig`，表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生，下面的命令不会盲目地继续执行。

### 9. AF 报错 Code=-1016
这个是因为通讯通里面包含的 `content-type` 包含的不是你支持的几种格式，一般我们用 json 指定响应格式，但是服务端经常返回的通讯头 `content-type` 值是：`text/plain`,AF默认的响应是不支持这种响应的，要么是服务端改，要么是客户端改。。。但一般都客户端改。。。

一般会把 `AFJSONResponseSerializer` 里面改为

```
    self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil];

```

改了以后，有时候会有 `Code=3840` 的错误，这个一般是因为服务端返回的字符串带有转义字符导致的，没法解析出`json`。

### 10. Mac OS 如何更改文件的默认打开方式

选中文件 邮件显示编辑菜单，点击显示简介（快捷键： ⌘ + i）。
然后会有一个打开方式的选项，更改后，点击下面的全部更改，以后打开这种文件，就默认使用你设定的App了。
![](/media/15126261967799/15126262330397.png)


![](/media/15126261967799/15126262330398.png)

### 11. 蒲公英、Fir 分发平台 无法直接替换 App Store 版本


今天测试告诉我，扫码安装测试包，不能像之前一样替换了，就搜索了一下，有两种场景，分别是[蒲公英平台](https://www.pgyer.com/)：

```
为什么在 iOS 9 中，点击“安装”按钮后，没有任何反应，桌面也没有出现应用图标，但是状态栏上的网络图标在转？

这是由于 iOS 9 中的一个 Bug 造成的。虽然看上去没有反应，其实应用已经在后台开始下载并安装了，状态栏上的网络图标在转就是一个证明。这个时候，只要多等待一会儿就好了，应用安装完成之后会在桌面上显示出来的。
```

和 [fir平台](https://fir.im/)

```
第五种：设备上已安装了该应用，并且与当前要安装的应用使用的证书不同

解决方法：删除旧的应用，重新安装
```
无法替换 App Store 版本的这种情景就属于第二种，App Store版本的证书与测试版本的证书不一致导致的。

<commit_msg>计算滑动距离<commit_after>---
layout:     post
title:      Tips
subtitle:   在不断填坑中前进。。
date:       2030-09-22
author:     三十一
header-img: img/post-bg-nextgen-web-pwa.jpg
header-mask: 0.3
catalog:    true
tags:
   - iOS
---

# Tips

### 1. TARGET_IPHONE_SIMULATOR
经常集成的第三方库，有些不支持模拟器，每一次调试代码要么就是一直连接真机，要么就是，把这个库相关的代码屏蔽，其实有更优雅的解决办法：`TARGET_IPHONE_SIMULATOR`

使用示例如下：

```
#if TARGET_IPHONE_SIMULATOR
#else
//只支持真机的第三方库
#import <LopeKit/LopeKit.h>
#endif



#if TARGET_IPHONE_SIMULATOR
//模拟器编译代码
@interface BluetoothManager()
<
CBCentralManagerDelegate
>
#else
//非模拟器编译代码
@interface BluetoothManager()
<
NPDSophKeyDelegate,//只支持真机的第三方库代理
CBCentralManagerDelegate
>
#endif
```

### 2. 构建版本一直不显示

从iOS10开始,苹果更加注重对用于隐私的保护,app里边如果需要访问用户隐私,必须要做相应隐私权限的描述,所以要在plist文件中添加描述。
下面是几种权限的描述，按需添加：

* `麦克风权限`：Privacy - Microphone Usage Description 是否允许此App使用你的麦克风？
* `相机权限`： Privacy - Camera Usage Description 是否允许此App使用你的相机？
* `相册权限`： Privacy - Photo Library Usage Description 是否允许此App访问你的媒体资料库？
* `通讯录权限`： Privacy - Contacts Usage Description 是否允许此App访问你的通讯录？
* `蓝牙权限`：Privacy - Bluetooth Peripheral Usage Description 是否允许此App使用蓝牙？
* `语音转文字权限`：Privacy - Speech Recognition Usage Description 是否允许此App使用语音识别？
* `日历权限`：Privacy - Calendars Usage Description 是否允许此App使用日历？
* `定位权限`：Privacy - Location When In Use Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据


### 3. IDFA
友盟的提供的无 IDFA 版本的 SDK。
使用命令行检查含有 IDFA，但是审核的时间选择 `否`，又不影响审核。🤣🤣

```
➜  copm_staff grep -r advertisingIdentifier .
Binary file ./copm_staff/Business/lib/Share/UMSocial/UMSocialSDK/UMSocialCore.framework/UMSocialCore matches
Binary file ./copm_staff/Expand/UMessage/UMessage_Sdk_1.4.0/libUMessage_Sdk_1.4.0.a matches
Binary file ./copm_staff/Expand/UMessage/UMessage_Sdk_1.5.0a/libUMessage_Sdk_1.5.0a.a matches
Binary file ./UMMobClick.framework/UMMobClick matches
Binary file ./UMMobClick.framework/Versions/A/UMMobClick matches
Binary file ./UMMobClick.framework/Versions/Current/UMMobClick matches
```

### 4. 生成好看的代码图片

这个网站：https://carbon.now.sh/ 可以把代码生成一种很好看的格式。

![test](/img/in-post/carbon_code.png)


### 5. 安装破解的文件
 “通用”里有时没有“任何来源”这个选项：
 
显示"任何来源"选项在控制台中执行：
`sudo spctl --master-disable` 

不显示"任何来源"选项（macOS 10.12默认为不显示）在控制台中执行：
 `sudo spctl --master-enable`

### 6. 近距离感应器


```
// 打开距离传感器
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
// 通过通知监听有物品靠近还是离开
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange:) name:UIDeviceProximityStateDidChangeNotification object:nil];

- (void)proximityStateDidChange:(NSNotification *)note
{
    if ([UIDevice currentDevice].proximityState) {
        NSLog(@"有物品靠近");
    } else {
        NSLog(@"有物品离开");
    }
} 
```

### 7. 使用第三方库上层再来一次封装
 使用第三方库上层再来一次封装，不要直接使用第三方库，这样的好处是替换第三方库的成本会低很多。譬如使用 `AFNetworking`,`MJRefresh`等。如果做了一层封装，以后替换就只需要修改封装的上层代码。
 
### 8. Mac `预览/Preview` 启动后就卡死的问题

打开 `~/Library/Containers` 目录。

找到 `com.apple.preview` 相关目录，删掉后，重新打开 `预览/Preview` 就可以正常使用了。

### 8. `source` 命令

在编译核心时，常常要反复输入一长串命令，如

```
make mrproper
make menuconfig
make dep
make clean
make bzImage
.......
```

这些命令既长，又繁琐。而且有时候容易输错，浪费你的时间和精力。如果把这些命令做成一个文件，让它自动按顺序执行，对于需要多次反复编译核心的用户来说，会很方便。
用`source`命令可以办到这一点。它的作用就是把一个文件的内容当成是`shell`来执行。


`shell` 编程中的命令有时和C语言是一样的。`&&` 表示与，`||` 表示或。把两个命令用 `&&` 联接起来，如 `make mrproper && make menuconfig`，表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生，下面的命令不会盲目地继续执行。

### 9. AF 报错 Code=-1016
这个是因为通讯通里面包含的 `content-type` 包含的不是你支持的几种格式，一般我们用 json 指定响应格式，但是服务端经常返回的通讯头 `content-type` 值是：`text/plain`,AF默认的响应是不支持这种响应的，要么是服务端改，要么是客户端改。。。但一般都客户端改。。。

一般会把 `AFJSONResponseSerializer` 里面改为

```
    self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil];

```

改了以后，有时候会有 `Code=3840` 的错误，这个一般是因为服务端返回的字符串带有转义字符导致的，没法解析出`json`。

### 10. Mac OS 如何更改文件的默认打开方式

选中文件 邮件显示编辑菜单，点击显示简介（快捷键： ⌘ + i）。
然后会有一个打开方式的选项，更改后，点击下面的全部更改，以后打开这种文件，就默认使用你设定的App了。
![](/media/15126261967799/15126262330397.png)


![](/media/15126261967799/15126262330398.png)

### 11. 蒲公英、Fir 分发平台 无法直接替换 App Store 版本


今天测试告诉我，扫码安装测试包，不能像之前一样替换了，就搜索了一下，有两种场景，分别是[蒲公英平台](https://www.pgyer.com/)：

```
为什么在 iOS 9 中，点击“安装”按钮后，没有任何反应，桌面也没有出现应用图标，但是状态栏上的网络图标在转？

这是由于 iOS 9 中的一个 Bug 造成的。虽然看上去没有反应，其实应用已经在后台开始下载并安装了，状态栏上的网络图标在转就是一个证明。这个时候，只要多等待一会儿就好了，应用安装完成之后会在桌面上显示出来的。
```

和 [fir平台](https://fir.im/)

```
第五种：设备上已安装了该应用，并且与当前要安装的应用使用的证书不同

解决方法：删除旧的应用，重新安装
```
无法替换 App Store 版本的这种情景就属于第二种，App Store版本的证书与测试版本的证书不一致导致的。


### 12. 计算滑动距离

```
- (void)panGesture:(UIPanGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateBegan) {
        startLocation = [sender locationInView:self.view];
    }
    else if (sender.state == UIGestureRecognizerStateEnded) {
        CGPoint stopLocation = [sender locationInView:self.view];
        CGFloat dx = stopLocation.x - startLocation.x;
        CGFloat dy = stopLocation.y - startLocation.y;
        CGFloat distance = sqrt(dx*dx + dy*dy );
        NSLog(@"Distance: %f", distance);
    }
}
```

{'fraction_non_alphanumeric': 0.13336881319850985, 'fraction_numerical': 0.023203831825439062, 'mean_word_length': 5.833454545454545, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 6, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1971084', 'n_tokens_mistral': 5638, 'n_tokens_neox': 6142, 'n_words': 583}