【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各系统的版本占比

(1)苹果官网查询 (2)三方统计

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属性

 

posted @ 2020-03-23 15:01  weicy  阅读(419)  评论(0编辑  收藏  举报