前言:
接触到Telegram是因为工作的原因,需求是对Telegram进行二次开发。面临的问题是:下载过源码以后发现很多错误,所以就开了踩坑历劫之旅。
开篇提醒:
1.由于工程比较大,有时候反应慢,build的时候可能会达到30分钟以上,需要内心等待
2.还是由于工程比较大,有时候你修改完了bug,但是Xcode没反应过来,等你去编译的时候依然报错,这个时候如果你感觉你是对的,就要敢于怀疑工具的缓存问题,clean 一下工程或者采取更暴力的措施==>关机 重启Xcode ,这种问题我遇到过3次以上
正文
一、Telegram下载地址:
二、下载过源代码以后开始编译,改bug
1、第一次编译(command+B)报错:“No signing certificate "iOS"Development......”
截图1:
解决办法:
1、证书和配置文件错误,统一处理,按照groups app 每个target之间的规律和关系自定义每一个target对应的 Bundle Identifier,
groups app 每个target之间的Bundle Identifier对应规律是:
groups id: group.com.abc.banana
Telegraph: com.abc.banana (groups app规律是这一Bundle Identifier是根据自己的心情定义的,其他的Bundle Identifier都是基于这个Bundle Identifier)
Share: com.abc.banana.share
watchkitapp: com.abc.banana.watchkitapp
watchKit Extension: com.abc.banana.watchkitapp.watchkitextension
SiriIntents: com.abc.banana.siriintents
LegacyDatabase: com.abc.banana.legacydatabase
Widget: com.abc.banana.widget
解释一下:Telegraph: com.abc.banana 的意思是 Telegraph这个target对应的Bundle Identifier 是com.abc.banana 其他的不一一解释了。
2、然后把app中所有出现的签名,Signing 统一选择 Automatically manage signing
截图2:
3、app中出现的其他的target 对应的Bundle Identifier根据自己的心情随便定义吧,然后同样Signing 统一选择 Automatically manage signing,如果你要问我为什么选择Xcode 自动配置证书,我的理由是:app中的target太多,需要配置的文件很多,所以自动配置最安全并且省时间。
当你感觉你已经修改完这一类错误的时候在app文件搜索区域 搜索 xcodeproj 确保所有的project中的所有target证书配置完毕,然后满心欢喜的build一下,看看有没有错误
4、闲聊一下:app文件比较多,有时候编译的时间很长,不要着急,去倒杯水喝着坐等,等待下一波错误,接下来都是这种节奏,慢慢改吧,也别灰心,最后你发现没改多少东西,都是配置文件的修改
2、第二次编译,报错,先看第一种错误“error: An Application Group with Identifier 'group.org.telegram.TelegramEnterprise' is not available. Please enter a different string. (in target 'Share')
”
截图3:
我发现第一种错误有很多处,这里先解决一下,其他地方同理,解决方法看如下截图
截图4:
如果你还没有在开发者账号中申请自己的groups id,赶紧去申请一个,然后再来修改此处错误,至于groups id的格式我已经在上文提到了,我写的是 group.com.abc.banana ,
修改之后如下图
截图5:
你会发现这个选项提醒我们配置有错误 看红色的感叹号提示重点错误内容是:"Share has conflicting provisioning settings",解决这个配置错误,来到Share 对应的Build Settings 里面去寻找provisioning对应的设置,provisioning和解决办法如下图:
截图6:
解决方法已经用绿色文字备注了,怎么删除配置呢,一共8行配置,从第一行开,始单击选中第一行 然后按 键盘delete键即可,后面依次删除,遇到删除不掉的,就双击右边的文件,把弹框里的东西删除即可,如下图
截图7:
然后再回到Share 对应的 设置选项查看,之前的App Groups 处已经不报错了,如下
截图8:
接着把app中其他地方出现同样错误的几个地方按照这个思路依次都修改了吧,
按照这个思路修改了Telegraph 这个PROJECT 对应的7个target 中的多个错误,再来Command + build 编译一下看看有没有其他错误了,惊喜不断感觉快成功了
3、第三次编译(command+B)报错:"error: Multiple commands produce '/Users/maohongpeng/Library/Developer/Xcode/DerivedData/Telegram-cqpmbkdcpsuygodgvbxuftuxshhi/Build/Products/Release-iphoneos/libtgvoip.framework/Info.plist':......"
如下图
截图9:
我解决问题的方法,选择简单粗暴的办法,如下图步骤,选择 File---->Workspace Settings ---->Build System,然后把Build System修改为Legacy Build System,具体可以参考他人博客
4、第四次编译(command+B)报错:"Code Signing Error: watchkitapp Extension has conflicting provisioning settings. watchkitapp Extension is automatically signed for development, but a conflicting code signing identity iPhone Distribution 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 project editor"
如下 截图10:
解决办法:1、找到错误的地方 Code Signing Identity 下面的红色框框里所有的行全部全部修改为 IOS Developer (目的是要把之前一个开发者在target里面的签名配置换成当前开发者的证书文件签名) (此处截图上传失败,抱歉啦!)
2、修改了Code Signing Identity之后,我看到了Code Signing Identity上面的设置Code Signing Entitlements然后我发现上图 entitlements 文件的路径不正确,里面的配置路径可能是之前的开发者留下来的,这里有两个办法可以修改:
第一种是:简单粗暴的方法:直接删除app中所有的 Ccode Signing Entitlements下面配置的的文件路径。然后你回到这个target (也就是Widget)的App Groups 发现报错了,这时候你 点击 Fix issue 让Xcode自动修复,其实此时Xcode会自动帮你配置上正确的Ccode Signing Entitlements的文件路径,(流程图上传失败,抱歉)。
第二种办法:就是你找到Widget.entitlements在工程中的相对路径(相对路径可以直接把Widget.entitlements拖进终端里,查看路径,然后取路径的后半部分在打开的工程中能找到的部分,作为这个文件的路径,然后复制,粘贴到设置中),然后把路径自己手动填写到路径设置的地方,搞定,这个方法比价麻烦,容易出错,我不提倡,在此不再赘述。
按照第一种解决办法,把工程中所有的 .entitlements 结尾的 权限配置文件的路径,都给重新设置一次吧,否则工程还会报错。
5、第五次编译(command+B)报错:“error: WatchKit App doesn't contain any WatchKit Extensions whose WKAppBundleIdentifier matches "com.sfbm.banana.watchkitapp". Verify that the value of WKAppBundleIdentifier in your WatchKit Extension's Info.plist matches the value of CFBundleIdentifier in your WatchKit App's Info.plist.
(流程图上传失败,抱歉)
解决办法是:
错误提醒翻译过来就是:需要你把WKAppBundleIdentifier 的对应内容设置成 com.sfbm.banana.watchkitapp ,解释一下也就是要把WKAppBundleIdentifier 对应的内容设置成WatchKit App 这个target 所对应的 CFBundleIdentifier,因为我的WatchKit App 这个target的BundleIdentifier已经设置成了com.sfbm.banana.watchkitapp,所以我很清楚的去修改这个配置文件,通常来说你的BundleIdentifier和我的一定是不一样的,所以你需要根据错误提示去修改这个WKAppBundleIdentifier对应的value
6、第六次编译(command+B)报错:“error: The value of WKCompanionAppBundleIdentifier in your WatchKit app's Info.plist "com.sfbm" does not match the bundle identifier of your companion app "com.sfbm.banana".”
[图片上传失败...(image-a615bf-1546060814729)]
解决办法:
错误提醒翻译过来是:需要把WKCompanionAppBundleIdentifier 的值"com.sfbm" 修改为 "com.sfbm.banana",从而和你的companion app的bundle identifier相匹配,解释一下:也就是此处要把WKCompanionAppBundleIdentifier的值设置为 Telegraph这个target 所对应的bundle identifier。然后我们去设置
7、第七次编译(command+B),结果是:Build Succeeded ,
搞定,真机测试,打包都让xcode自动去配置文件和证书,就没有任何问题了,如果您还有不懂的,欢迎留言,我们相互交流,一起进步~(再次对文中流程图上传失败表示十万分抱歉,后期有时间再重新编辑上传)