【iOS - 月总结】开发中遇到的小知识点(2020.02-2020.03)
由于懒癌,好久不更了,也是有一段时间没有遇到一些值得记录的问题,今天终于有空闲,就把这两个月遇到的问题总结一下。
1.xcode11中,APPdelegate没有window属性,在运行一些需要使用window上属性的方法会崩溃。
// 会有如下的错误提示 -[AppDelegate setWindow:]: unrecognized selector sent to instance // 解决方法 在APPdelegate.h中添加下面代码 @property (nonatomic, strong) UIWindow * window;
2.xcode11中,IPA包上传太慢或者卡在authenticating with the app store
上周我更新应用的时候,IPA上传不成功,上传了半小时一直卡在authenticating with the app store,最开始我以为是安装包有不合规的地方,就使用validate来进行校验。可是结果一切正常,显示successfully validated。这就很奇怪了。
由于xcode11中已经没有了Application Loeader,也在App Store中提供了新的应用transporter来替代它上传,我也是下载了新的应用,可是仍然不成功。
于是我接着在网上找解决方法。终于我找到了一个解决方案,亲测可行,分分钟就上传成功了。
// 第一步 进入你的缓存文件夹 注意需要更改你的用户名 cd /Users/用户名/Library/Caches // 第二步 删除缓存 rm -rf com.apple.amp.itmstransporter // 第三步 执行命令 /Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/itms/bin/iTMSTransporter 补充:这个最后一步最好是FQ后使用,它是下载一些文件,国内下载比较慢
参考:简书文章
3.cocoapods的pod问题
最新方法已经写到了之前发的博客中,请点击查看
4. 查看iOS各系统的版本占比
5.textfield的实时监听在中文输入法下的问题
之前我也是仿照textview的方法写了一个监听textfield的实时输入的方法,但是有一个问题之前没有注意,最近发现了。那就是在中文输入法下,会出现未选择中文,还是拼音的情况下仍会继续进行下一步如搜索的功能。
// 添加监听 [_textField addTarget:self action:@selector(textFieldDidChange:) // 解决方案 - (void)textFieldDidChange:(UITextField *)textField { if (textField.markedTextRange == nil) { NSLog(@"text:%@", textField.text); // 进行操作 ,在这里如果是中文输入法就不会出现搜索拼音的情况 } }
6.禁止输入emoji表情
前几天在搜索功能实现中,我遇到了一个问题,就是在搜索时我输入了emoji表情,后台接口直接报错。这个一般都是后台来解决。然而后来我就想如果是APP来做处理应该怎么做。
(1)第一种方法 这个可能会有遗漏
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([self stringContainsEmoji:text]) { [textView resignFirstResponder]; [MBProgressHUD showMessag:@"暂不支持输入表情符" toView:[UIApplication sharedApplication].keyWindow]; return NO; } return YES; } //表情符号的判断 - (BOOL)stringContainsEmoji:(NSString *)string { __block BOOL returnValue = NO; [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { const unichar hs = [substring characterAtIndex:0]; if (0xd800 <= hs && hs <= 0xdbff) { if (substring.length > 1) { const unichar ls = [substring characterAtIndex:1]; const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000; if (0x1d000 <= uc && uc <= 0x1f77f) { returnValue = YES; } } } else if (substring.length > 1) { const unichar ls = [substring characterAtIndex:1]; if (ls == 0x20e3) { returnValue = YES; } } else { if (0x2100 <= hs && hs <= 0x27ff) { if (0x278b <= hs && hs <= 0x2792) { //自带九宫格拼音键盘 returnValue = NO;; }else if (0x263b == hs) { returnValue = NO;; }else { returnValue = YES; } } else if (0x2B05 <= hs && hs <= 0x2b07) { returnValue = YES; } else if (0x2934 <= hs && hs <= 0x2935) { returnValue = YES; } else if (0x3297 <= hs && hs <= 0x3299) { returnValue = YES; } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) { returnValue = YES; } } }]; return returnValue; }
(2)第二种方法就是判断字符的字节长度
extension ViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { return !string.characterCodingOut } } extension String { var characterCodingOut: Bool { /* 遍历字符串的每一个字符 */ for str in self { var byteCount = 0 /* 计算字符串的编码字节长度 */ /* UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。 */ for _ in String(str).utf8 { byteCount = byteCount + 1 } /* 大于等于四个字节的禁止输入 */ if byteCount >= 4 { return true } } return false } }
7.delegate的修饰
好久没有使用过delegate了 ,昨天使用后发现有警告,后来才返现由于我写了多个方法,有几个不是必须实现的就没写,于是就报警告了。解决方法当然就是添加修饰符了,哪些是必需实现的(@required),哪些是可选的(@optional)
8.删除scenedelegate
这个文件是xcode11中新加的类,一般来说我们不需要他,可以不管,但是我前几天发现了一个问题,我正常使用SVProgressHUD。结果发现弹窗显示在了左上角,不注意根本不会发现。我找了好多原因没发现。后来突发奇想把scenedelegate删除,结果就好了。这个问题的原因暂未找到。
删除这个文件的方法如下 1、删除Scenedelegate的.h.m文件 2、删除Info.plist文件中的Application Scene Manifest配置 3、删除AppDelegate.m文件中的两个管理Scenedelegate生命周期代理方法 4、在AppDelegate.h中,添加window属性