background:
最近公司代码要求从swift3升级到swift5,语法问题so easy,问题是CocoaAsyncSocket 无法connect 的问题。
server 端一切正常,连接到设定的address和port,client connect server 时,server 一直收不到connect 的回调,而client disconnect 回调, error info 是:
Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Operation not permitted, NSLocalizedFailureReason=Error in connect() function}
网上找了半天,找不到合适的,直到一个帖子说了可能是entitlements设置引起的,于是我仔细关注了project里面entitlements的修改内容。
通过git 对比查看修改的内容,发现工程文件里,自动删除了一下代码:
CODE_SIGN_ENTITLEMENTS = xxxx.entitlements;
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = xxxxxxxxx;
关键在第一行,删除了client 的entitlements,而这个文件是用于和其他外部工程或者其他target 沟通的文件,删除了这个文件,可不就找不到外部target 了吗
但是我并没有手动改这个文件配置啊,但是明确是我就是改了entitleMents啊,所以我仔细对比这块儿
这是以前的:
发现改之后也还是这样,release client 的,debug 是client 对应finder 的entitlements,理论上这是不对的,理论上,debug socket 也是连不通的,但是却找到了,可能是Xcode9的bug ,也可能是优化。
而用Xcode 10,升级到swift5之后,配置没有改,但是peoject文件的修改内容就严格按照这个配置来了,所以dubug 就找不到client 的entitlements了,所以socekt连接不上。
修改方式是什么呢,是将bug 修改成和release 一致,这样debug 也能找到entitlements,连接上socket了:
总结一下:
Xcode 9 虽然entitlements debug 下设置错误,但是内部不知道做了什么处理,找到了正确的entitlements。
升级到Xcode10.3 ,swift3 升级到swift5, Xcode10 完全按照setting 来,所以删除了debug下对应的entitlements设置,所以connect连接不上。解决办法就是将debug 下entitlements设置正确,问题解决.
网友评论