近期iOS开发踩坑记录(一)

381 阅读2分钟

Xcode到14.3产生了file not found: 

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a问题 cocoapods添加如下

post_install do |installer|
    installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
      end
    end
  end

朗读

Timed out loading Siri voice resource for language zh-CN

今天做语音朗读文本出现了这个问题,之前也做过,是跨端的,之前没问题,源生代码复制过来居然不好使,WTF!?

需要把语音对象,和其所在的类进行强引用,否则可能出现对象提前被释放找不到语音包的问题(这种情况不只是中文,所有语言都会出现这个问题)

改成强引用就OK了

日程

删除日程,设置不了标识符没关系,通过懒加载,保证对象唯一,删除后应该把对象置空,防止再添加时报错,说已经删除

- (void)addEvent {
    __weak typeof(self) weakSelf = self;
    if ([self.store respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
        // 获取访问权限
        [self.store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
            if (error){
                //报错啦
            }else if (!granted){
                // 被用户拒绝,不允许访问日历
            }else{
                dispatch_async(dispatch_get_main_queue(), ^{
                    // 用户既然允许事件保存到日历,那就去保存吧
                    [weakSelf saveDataCalendar:self.store];
                });
            }
        }];
    }
}

- (void)saveDataCalendar:(EKEventStore *)eventStore {
    
    NSDate *nowDate = [NSDate date];
    self.event.title  = @"我是标题" ;              //  事件标题
    self.event.startDate = [nowDate dateByAddingTimeInterval:0];   // 开始时间
    self.event.endDate   = [nowDate dateByAddingTimeInterval:0];  // 结束时间
    [self.event addAlarm:[EKAlarm alarmWithAbsoluteDate:nowDate]];
    [self.event setCalendar:[eventStore defaultCalendarForNewEvents]];
    NSError *err;
    [eventStore saveEvent:self.event span:EKSpanThisEvent error:&err];
    if (err) {
        NSLog(@"添加失败%@",err);
    } else {
        NSLog(@"添加成功");
    }
}


- (void)deleteEveent {
    NSError *error;
    BOOL success = [self.store removeEvent:self.event span:EKSpanFutureEvents error:&error];
    
    if (success) {
        NSLog(@"删除成功!");
        self.event = nil;
    } else {
        NSLog(@"删除失败:%@",error);
    }
}

- (EKEvent *)event {
    if (!_event) {
        _event = [EKEvent eventWithEventStore:_store];
    }
    return _event;
}

- (EKEventStore *)store {
    if (!_store) {
        _store = [[EKEventStore alloc] init];
    }
    return _store;
}

iOS创建空白target注意事项

新target记得处理pod库

在target Membership添加.m文件之后,要记得加(inherited),避免Undefined symbol:_OBJC_CLASS__****错误

OC多target

alert没有取消按钮的情况,点击空白处隐藏

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIAlertController (TapGesAlertControlle)
- (void)tapGesAlert;
@end

NS_ASSUME_NONNULL_END


#import "UIAlertController+TapGesAlertControlle.h"

@implementation UIAlertController (TapGesAlertControlle)
- (void)tapGesAlert{
    
  NSArray * arrayViews = [UIApplication sharedApplication].keyWindow.subviews;
    if (arrayViews.count>0) {
        //array会有两个对象,一个是UILayoutContainerView,另外一个是UITransitionView,我们找到最后一个
        UIView * backView = arrayViews.lastObject;
        //我们可以在这个backView上添加点击事件,当然也可以在其子view上添加,如下:
        NSArray * subBackView = [backView subviews];
        backView = subBackView[0];  //或者如下
//        backView = subBackView[1];
        [backView setUserInteractionEnabled:YES];
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
        [backView addGestureRecognizer:tap];
    }

}


- (void)tap
{
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end


[self presentViewController:self.alertVC animated:YES completion:^{
        [self.alertVC tapGesAlert];
        
    }];

手动导入framworkdyld[48233]: Library not loaded: @rpath/XYRTCEngine.framework/XYRTCEngine

Metal API Validation Enabled