Xcode清空缓存
iOS开发长时间使用Xcode会产生一系列的缓存,定时清理可以节省出一大部分内存。
- 移除iPhone模拟器产生的缓存数据(Devices) :
点击Finder,点击前往文件夹,输入:~/资源库/Developer/CoreSimulator/Devices/,打开界面如下图,可以删除清空Devices底下的文件。
如图 :
Devices文件夹下的文件移入废纸篓后,立即运行会发现编译成功但模拟器无法运行,提示 :This app could not be installed at this time.(此时无法安装此应用程序。)
点击程序坞的模拟器图标,会提示:Unable to boot device because it cannot be located on disk.(无法启动设备,因为它不在磁盘上。)
此时打开Xcode,打开模拟器选择下拉列表,选择add additional simulators...,在弹出的界面中选择模拟器,删除所有的模拟器,然后重新添加需要的模拟器。
在打开的弹框中选择模拟器,右击选择Detele删除该模拟器。
删除模拟器完毕后,可以选择+号,从新添加模拟器。
然后重新选择新添加的模拟器,模拟器可以成功运行。
2.移除Xcode的缓存文件DerivedData
点击Finder,点击前往文件夹,输入:~/Library/Developer/Xcode/DerivedData/,打开界面如下图,可以删除清空DerivedData底下的文件。文件夹中保存的是Xcode的缓存文件,曾经在Xcode跑过的所有项目的索引、build的信息等都会保存在这里。删除后在下次打开项目编译的时候将会重新生成。
3.移除打包App产生的数据Archives
点击Finder,点击前往文件夹,输入:~/资源库/Developer/Xcode/Archives/,打开界面如下图,根据项目需要进行移除,如果是线上版本,建议保留。
4.移除打包App产生的数据Products
点击Finder,点击前往文件夹,输入:~/资源库/Developer/Xcode/Products/,打开界面如下图,根据项目需要进行移除,里面是以项目Bundle Identifier命名的文件夹,存有app的图标。
5.虚拟包
点击Finder,点击前往文件夹,输入:~/Library/Developer/Xcode/iOS DeviceSupport,这里手机连xcode, 如果没有相应虚拟包,会自动更新;可根据需要进行移除,对于小磁盘的苹果本,也是经常清理的地方。
太久没有清理了,效果显著。清理前 :
清理后 :
Xcode安装配置包
随着IPhone手机系统的升级,往往会出现Xcode无法向手机安装程序而无法进行真机测试的情况,而此时又不想升级Xcode,则可以采用安装配置包的方式,可以在网上下载对应版本的配置包,然后放到Xcode对应的目录下,之后重启Xcode就可以完成安装了。下载安装包的Git地址:https://github.com/wuxie8/DeviceSupport
路径如下 :
failed to send the handshake ack
项目在真机上编译时,编译成功,但无法启动,控制台打印如下:
error: failed to launch '/Users/shawn/Library/Developer/Xcode/DerivedData/YiShopCustomer-afrqtgvoxosyrzasqzfghmoqzmiy/Build/Products/Debug-iphoneos/项目名.app/项目名' -- failed to send the handshake ack
处理办法:
我报错这个错误的原因比较奇葩,是因为在电脑上连接了集线器,在集线器中连接了手机,而导致了这个错误,处理办法是拔掉集线器,将手机直接连接到电脑上。
Xcode构建系统崩溃了。请关闭并重新打开您的工作区。
处理办法:
重复符号(duplicate symbol)
真机编译bitcode_strip
处理办法1 :
点击项目——>Build Settings ——> Enable Bitcode设置为NO。例如 :
此办法无效。
处理办法 2:
- 点击项目——>Build Settings ——> DEPLOYMENT_POSTPROCESSING设置为YES,例如 :
- 点击项目——>Build Settings ——> STRIP_STYLE设置为Debugging Symbols,例如 :
- 点击项目——>Build Settings ——> Compiler Flags设置 -fembed-bitcode 参数,例如 :
- 点击项目——>Build Settings ——> Enable Bitcode设置为YES,例如 :
此办法有效。
注: DEPLOYMENT_POSTPROCESSING 部署处理设置为YES,会对其它选项生成的测试符号产生影响,设置为YES时会删掉所有不必要的编译符号,也包括调试符号,这时断点不会执行。
NSInternalInconsistencyException
NSInternalInconsistencyException :内部不一致异常
failed to obtain a cell from its dataSource : 无法从其数据源获取单元格,原因之一是因为单元格复用标识符错误
This request is forbidden for security reasons(出于安全原因,此请求被禁止)
You currently don't have access to this membership resource.To resolve this issue, agree to the latest Program License Agreement in your developer account.
译:您当前没有访问此成员资格资源的权限。若要解决此问题,请同意开发人员帐户中的最新程序许可协议。
处理办法 :
【1】、首先登录苹果开发者中心https://developer.apple.com/account/
【2】、出现如图所示,则需要同意最新程序许可协议 :
图片内容(译) : 苹果开发者计划许可协议已经更新。要访问某些成员资源,必须接受最新的许可协议。
【3】、点击审查协议,进入如图所示,勾选,点击我同意。
至此,错误解决。
Undefined symbol: OBJC_CLASS$_MJDog
Undefined symbols for architecture x86_64:
"OBJC_CLASS$_MJDog", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
译 :架构x86_64的未定义符号:
“OBJC_CLASS$_MJDog”,引用自:
ViewController.o中的objc类引用
ld:未找到架构x86_64的符号
clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
造成问题的原因,在项目中加入了第三方的文件,虽然在文件列表中进行了添加,但还是造成了错误,可能的原因是:项目 -> Build Phases -> Compile Sources中没有添加对应的.m文件造成的,添加后错误消失。例如 :
Code Signing Error
一般运行第三方Demo时有可能会报出此错误,例如以百度导航为例:
No profile for team 'KLS72L88F6' matching '20200113' found
Xcode couldn't find any provisioning profiles matching 'KLS72L88F6/20200113'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the Signing & Capabilities tab of the target editor.
译 :找不到与“20200113”匹配的团队“KLS72L88F6”的配置文件
Xcode找不到任何与“KLS72L88F6/20200113”匹配的设置配置文件。安装配置文件(通过拖放到Xcode的dock项上)或在目标编辑器的Signing&Capabilities选项卡中选择其他配置文件。
处理方法 :
之后会报出如下错误 :
NaviDemo has conflicting provisioning settings.
NaviDemo is automatically signed, but provisioning profile 1ac15702-24d7-404e-a17b-3ea74dceaf78 has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the Signing & Capabilities editor.
译 : NaviDemo的设置有冲突。
navideo是自动签名的,但已手动指定设置配置文件1ac1572-24d7-404e-a17b-3ea74dceaf78。在生成设置编辑器中将设置配置文件值设置为“自动”,或在签名和功能编辑器中切换到手动签名。
处理方法 :
这里所说的就是要通过修改你的项目的.xcodeproj文件来解决上述的错误。
1>. 找到项目中的**.xcodeproj文件,点击右键,show package contents(打开包内容)。如图 :
2>. 打开后找到project.pbxproj文件,用文本编辑器打开。其实就是右键,点击open就好了。如图 :
3>. 打开这个文件后,按command + F,在这个文件中查找“PROVISIONING_PROFILE"或者 “11ac15702-24d7-404e-a17b-3ea74dceaf78”,找到这个 直接删除,保存。如图:
之后会报出如下错误 :
NaviDemo has conflicting provisioning settings.
NaviDemo is automatically signed, but code signing identity iPhone Developer: rd szlbs (KWNPF2348G) has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the Signing & Capabilities editor.
译 : NaviDemo的设置有冲突。
navideo是自动签名的,但代码签名标识iPhone Developer:rd szlbs(KWNPF2348G)是手动指定的。在构建设置编辑器中将代码签名标识值设置为“iPhone Developer”,或在签名和功能编辑器中切换为手动签名。
处理方法 :
项目 -> Build Setting ->搜索signing后将Iphone Developer改为IOS Developer。如图 :
4>.如果在签署证书时报错如下 :
处理方法 :将Bundle Identifier更换,即使是自己开发者账号下其他项目的Bundle Identifier页可以。
至此,项目成功运行。
AudioObjectRemovePropertyListener: no object with given ID 0
模拟器使用使用AVPlayer进行语音播放后,抛出此异常,处理办法:
在Scheme(Product> Scheme> Edit Scheme)创建一个新的环境变量OS_ACTIVITY_MODE并将其值设置为disable。但是要把勾选取消,否则可能印象NSLog打印,如图:
+[NSMethodSignature signatureWithObjCTypes:]: type signature is empty.
项目中使用了NullSafe,而且版本是相对落后的1.2.1,在iphone6s12.4.5中发生了崩溃,文件如下:
//
// NullSafe.m
//
// Version 1.2.1
//
// Created by Nick Lockwood on 19/12/2012.
// Copyright 2012 Charcoal Design
//
// Distributed under the permissive zlib License
// Get the latest version from here:
//
// https://github.com/nicklockwood/NullSafe
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
#import
#import
#ifndef NULLSAFE_ENABLED
#define NULLSAFE_ENABLED 1
#endif
#pragma GCC diagnostic ignored "-Wgnu-conditional-omitted-operand"
@implementation NSNull (NullSafe)
#if NULLSAFE_ENABLED
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
@synchronized([self class])
{
//look up method signature
NSMethodSignature *signature = [super methodSignatureForSelector:selector];
if (!signature)
{
//not supported by NSNull, search other classes
static NSMutableSet *classList = nil;
static NSMutableDictionary *signatureCache = nil;
if (signatureCache == nil)
{
classList = [[NSMutableSet alloc] init];
signatureCache = [[NSMutableDictionary alloc] init];
//get class list
int numClasses = objc_getClassList(NULL, 0);
Class *classes = (Class *)malloc(sizeof(Class) * (unsigned long)numClasses);
numClasses = objc_getClassList(classes, numClasses);
//add to list for checking
NSMutableSet *excluded = [NSMutableSet set];
for (int i = 0; i < numClasses; I++)
{
//determine if class has a superclass
Class someClass = classes[I];
Class superclass = class_getSuperclass(someClass);
while (superclass)
{
if (superclass == [NSObject class])
{
[classList addObject:someClass];
break;
}
[excluded addObject:NSStringFromClass(superclass)];
superclass = class_getSuperclass(superclass);
}
}
//remove all classes that have subclasses
for (Class someClass in excluded)
{
[classList removeObject:someClass];
}
//free class list
free(classes);
}
//check implementation cache first
NSString *selectorString = NSStringFromSelector(selector);
signature = signatureCache[selectorString];
if (!signature)
{
//find implementation
for (Class someClass in classList)
{
if ([someClass instancesRespondToSelector:selector])
{
//在此处抛出了异常+[NSMethodSignature signatureWithObjCTypes:]: type signature is empty.
signature = [someClass instanceMethodSignatureForSelector:selector];
break;
}
}
//cache for next time
signatureCache[selectorString] = signature ?: [NSNull null];
}
else if ([signature isKindOfClass:[NSNull class]])
{
signature = nil;
}
}
return signature;
}
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
[invocation invokeWithTarget:nil];
#pragma clang diagnostic pop
}
#endif
@end
异常信息如下:
我以最快的速度面向百度搜索了错误,得到的办法是升级该文件,最新版本已经到2.0了,我赶快Git了一下https://github.com/nicklockwood/NullSafe,果然都2.0了,我还1.2.1呢,赶快升级,新文件简化了对于判空的范围,文件如下:
//
// NullSafe.m
//
// Version 2.0
//
// Created by Nick Lockwood on 19/12/2012.
// Copyright 2012 Charcoal Design
//
// Distributed under the permissive zlib License
// Get the latest version from here:
//
// https://github.com/nicklockwood/NullSafe
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
#import
#import
#ifndef NULLSAFE_ENABLED
#define NULLSAFE_ENABLED 1
#endif
#pragma clang diagnostic ignored "-Wgnu-conditional-omitted-operand"
@implementation NSNull (NullSafe)
#if NULLSAFE_ENABLED
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
//look up method signature
NSMethodSignature *signature = [super methodSignatureForSelector:selector];
if (!signature)
{
for (Class someClass in @[
[NSMutableArray class],
[NSMutableDictionary class],
[NSMutableString class],
[NSNumber class],
[NSDate class],
[NSData class]
])
{
@try
{
if ([someClass instancesRespondToSelector:selector])
{
signature = [someClass instanceMethodSignatureForSelector:selector];
break;
}
}
@catch (__unused NSException *unused) {}
}
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
invocation.target = nil;
[invocation invoke];
}
#endif
@end
更换了新文件,果然有了变化,崩溃信息改变了呢,如下:
为什么还是NSNull向size发送了消息,更新无法处理崩溃,怎么办,还是回头看看代码吧,发现就是这行代码运行后,NullSafe执行,并抛出异常的,如下:
if (self.model.card_pic1.length > 0) {
[[SDWebImageManager sharedManager] loadImageWithURL:[YSHUtils urlOfImage:self.model.card_pic1] options:SDWebImageRefreshCached progress:NULL completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
if (self.model.card1) {
return;
}
self.model.base64card1 = [self convertBase64CodeWithImageNoCondence:image];
self.model.card1 = image;
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:1]] withRowAnimation:UITableViewRowAnimationNone];
}];
}
既然是加载图片时报错的,就索性在2.0版本NullSafe的for循环类中增加了[UIImage class],如下:
for (Class someClass in @[
[NSMutableArray class],
[NSMutableDictionary class],
[NSMutableString class],
[NSNumber class],
[NSDate class],
[NSData class],
[UIImage class]
])
崩溃问题解决,单还不知道后续是否会影响NullSafe正常工作,后续观察吧。
dyld: Library not loaded: @rpath/SDWebImage.framework/SDWebImage
引入第三方库,项目编译完成进行连接时报错,库未加载,报错如图:
造成错误的原因 :
dyld: Library not loaded: /usr/lib/libstdc++.6.dylib
在Xcode10以后,添加了libstdc++.6.0.9.dylib、libstdc++.6.dylib、libstdc++.dylib库到相关文件夹后,重新下载其他版本的模拟器,仍旧报错,则需要在该/Library/Developer/CoreSimulator/Profiles/Runtimes路径下找到新下载的模拟器版本 -> 显示包内容 -> Contents -> Resources -> RuntimeRoot -> usr -> lib文件夹下添加libstdc++.6.dylib库。
Build Phases下无添加Embed Frameworks的选项
Build Phases下无Embed Frameworks并且没有添加的Embed Frameworks选项,例如:
处理办法:找到要添加的动态库,在General中拖入Frameworks,Libraries, and Embedded Content中,在Build Phases下会生成Embed Frameworks,例如:
Xcode11.4.1使用Ad Hoc打包报错IPA processing failed
报错如图:
处理办法 :
- 点击Show Logs显示打印日志,找到IDEDistribution.standard.log文件,打开文件,搜索x86_64,找到如下区域:
因为造成该报错的原因是iOS13强制不支持模拟器架构打包,但项目使用的SDK支持i386,x86_86这个架构。复制该Framework名称,在Xcode中找到,Show In Finder,找到路径。
cd 到该Framework所在路径,使用lipo -info HKEApiFramework命令查看该Framework支持的架构(HKEApiFramework为Framework名称),如下:
- 如果Framework支持i386、x86_64架构,分别使用lipo -remove i386 HKEApiFramework -o HKEApiFramework 与 lipo -remove x86_64 HKEApiFramework -o HKEApiFramework命令进行移除,如图:
- 重新进行打包,如果有多个Framework支持该架构,则需要一一进行移除
Xcode12模拟器运行项目报错No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=arm64e armv7 armv7s armv64 arm64).
译:没有要编译的体系结构(只有\u ACTIVE\u ARCH=YES,ACTIVE ARCH=x86\u 64,VALID\u ARCH=arm64e armv7 armv7s armv64 arm64)。
原因:Xcode12将VALID_ARCHS改为了用户定义(User_Defined),但是有些集成进来的第三方库还再使用这个key,Xcode12模拟器已经用arm架构来编译项目,但VALID_ARCHS中缺少x86架构的链接。
处理办法:在Build Settings中搜索VALID_ARCHS,并在里面添加 x86_64,如图:
如果Build Settings -> User_Defined中没有VALID_ARCHS,可以手动添加,如图:
Http请求控制台打印错误NSURLConnection finished with error - code -1022
处理办法:在info.plist文件中添加App Transport Security Settings,在App Transport Security Settings 之下添加Allow Arbitrary Loads,将Allow Arbitrary Loads的值设置YES。例如:
Multiple commands produce解决办法
TARGETS -> Build Phases搜索报错文件,删掉重复的其中一个。