专栏名称: tlanyan
目录
相关文章推荐
证券时报  ·  DeepSeek突发!本周启动! ·  9 小时前  
冠南固收视野  ·  赎回压力增加,信用债如何配置? ·  昨天  
上海证券报  ·  300543、002989,收警示函 ·  昨天  
上海证券报  ·  大模型应用,新动向 ·  2 天前  
证券时报  ·  DeepSeek官宣! ·  3 天前  
51好读  ›  专栏  ›  tlanyan

构建Potatso问题集锦及解决方案

tlanyan  · 掘金  ·  · 2019-02-11 01:39

正文

阅读 38

构建Potatso问题集锦及解决方案

转载请注明文章出处: tlanyan.me/build-potat…

前言

半年前写过一篇构建自用Shadowsocks客户端Potatso的教程“ 构建自己的iOS网络代理客户端 ”。当时除libYAML依赖下载不正常外,编译测试使用全过程都很顺利。文章投递到几个平台被数万网友围观,不少网友根据教程在构建时遇到各种问题。最初我以为是网友看教程不仔细或构建环境差异造成,没多注意。后来陆续有网友加我QQ,让我怀疑写完文章后代码有了重大更新。

终于在昨天(除夕)抽出时间,用最新版的代码构建Potatso并安装到我最新版iOS系统的iPad上。这个过程花费了几个小时,覆盖了许多网友咨询我的问题,本文中将一一给出解决方案。

如果你的 Xcode版本是9.4.1 ,使用 commitID为318a5e1 的代码,根据“ 构建自己的iOS网络代理客户端 ”中的教程可以顺利的编译和安装Potatso到 iOS12系统以下的设备 。如果你的设备升级到了最新版,或者遇到其他问题,请继续阅读本文。

为什么执着于构建自用Shadowsocks客户端?由于iOS生态的封闭性,正常情况下只能通过App Store下载应用。 应用下架后,会导致手机重置、购买买新设备后无法安装 。安卓、Windows、MacOS则不会有这个问题,只要安装文件存在,总是有得用。所以针对iOS设备构建自用的客户端很有必要,尤其是SS这类随时有可能下架的应用。

本文构建Potatso客户端最终得工程文件以及生成的ipa包已上传到百度云盘: pan.baidu.com/s/1twyMocOv…

如果构建过程中遇到本文列出以外的问题,欢迎留言或加 Q群688196496

构建步骤

这节简要回顾构建Potatso的流程:

1. 安装Cocospods

如果已安装,请略过此步。

  1. 更新系统的gem版本:打开终端,输入: sudo gem update --system
  2. 设置国内gem源: gem sources --list 输出为 https://gems.ruby-china.org/ 请略过此步;否则先删除官方源再添加gems国内源: gem sources --remove https://rubygems.org/; gem sources --add https://gems.ruby-china.org/
  3. 安装Cocospods: sudo gem install cocoapods

2. 构建Potatso

构建Potatso的步骤如下:

  1. 克隆代码: git clone https://github.com/haxpor/Potatso.git
  2. 更新子模块: cd Potatso; git submodule update --init
  3. 安装依赖:打开 Podfile ,将第一行改成: source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git' (使用清华的CocoaPods源),然后运行 pod install --verbose
  4. 使用XCode打开 Potatso.xcworkspace
  5. 更改 Potatso PacketTunnel TodayWidget 两个子项目的 Bundle ID ,例如本人分别改成: potatso.tlanyan.me potatso.tlanyan.me.PacketTunnel potatso.tlanyan.me.TodayWidget
  6. 更改 Potatso PacketTunnel TodayWidget 两个子项目 Capabilities 中的 App Group Keychain Sharing 的Group:在"App Groups"中删除原有的 group.io.wasin.potatso ,新增自己的group,例如:" group.potatso.tlanyan.me ";在"Keychain Sharing"中输入自己的group ID;
  7. 打开"PotatsoBase/Potatso.m"文件,将 shareGroupIdentifier 函数的返回值改成自己的group id;
  8. 将iPhone等iOS设备连接到电脑,目标选择新接入的设备,点击左上角的“build and run”按钮,Xcode会编译并安装App到设备上,然后启动。

可能遇到的问题

昨天几个小时的折腾,遇到的十来个问题。下文将一一列出,并给出解决方案。构建过程中你可能会遇到不止一个错误, 请根据错误信息按 Ctrl + F 在本文查找 。如果遇到其他问题,欢迎留言或加 Q群688196496

1. the sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocosPods installation.

问题截图

原因: pod依赖未安装

解决办法: 安装依赖,执行命令: pod install --verbose

2. url: (7) Failed to connect to pyyaml.org port 80: Connection refused

错误描述: 执行pod install,前面一切顺利,到libYAML会出现问题:

Installing LibYAML (0.1.4)

[!] Error installing LibYAML
[!] /usr/bin/curl -f -L -o /var/folders/dj/ljst94xx47l7fn3wz4q9bwsw0000gn/T/d20180822-4467-1cotycr/file.tgz http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz --create-dirs --netrc-optional --retry 2

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
 curl: (7) Failed to connect to pyyaml.org port 80: Connection refused
复制代码

原因: libYAML的官网关闭了80端口访问

解决办法: 编辑" /Users/你的用户名/.cocoapods/repos/master/Specs/5/b/9/LibYAML/0.1.4/LibYAML.podspec.json"文件,将" pyyaml.org/download/li… "改成“ pyyaml.org/download/li…

备注: 此解决方案来自貌似 LibYAML 官方人员的回复,亲测可以。当然可以使用前文“ 构建自己的iOS网络代理客户端 ”中所说的网络劫持方法。

3. Diff:/Podfile.lock: No such file or directory

使用新版代码并安装好依赖后,这应该是构建过程中最先出现的问题。

问题截图:

原因 :根据错误描述跟踪脚本执行流程,发现是执行预构建脚本时** SRCROOT **环境变量的值无法获取(或被错误置为空)导致。

解决方案 : 尝试过更改构建时生成的临时脚本文件、注入全局环境变量等,这些方法均不凑效。后来通过 diff 发现脚本由文件 Potatso.xcodeproj/project.pbxproj 文件中的配置生成,该文件在 pod install 后被修改。解决办法很简单:还原更改。执行完 pod install 命令后,执行 git checkout Potatso.xcodeproj/project.pbxproj ,问题解决。

4. No podspec found for CallbackURLKit in ./Library/CallbackURLKit

问题截图:

原因: 子模块的代码未下载

解决方案: 初始化子模块代码,执行命令: git submodule update --init

5. The operation couldn't be completed. Unable to log in with account 'xxxx'. The login details for account 'xxxx' / No profiles for 'xxxx' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'xxx' / Code signing is required for product type...

问题截图:

原因: Apple ID过期未续费

解决方案: Apple ID续费或换其他可用的ID

6. No account for team 'xxx'. Add a new account in the Accounts preference pane or verify that your accounts have valid...

错误信息基本与上一条相同,只是账号换成了team ID。

问题截图:

原因: team ID不在已添加的账号内

解决方案: 在属性页面的 Team 中选择自己的账号

7. Your account does not have sufficient permissions to modify containers. / No profiles for 'xxxx' were found

问题截图:

原因: 该Bundle ID已经被其他Apple ID使用

解决方案: 换一个新的

8. An Application Group with Identifier 'xxxx' is not available. Please enter a different string.

问题截图:

原因: Group ID已经被其他Apple ID使用

解决方案: 用一个新的

9. Module 'Crashlytics' not found

这个错误未截图。

原因: Podfile文件里没有加这个库

解决方案: 打开Podfile,在 def library 中添加一行: pod 'Crashlytics', '~> 3.10.7' ,然后执行 pod install --verbose

备注: 该解决方案参考Github的issue: github.com/haxpor/Pota… 。注意pod安装依赖后,会更改 Potatso.xcodeproj/project.pbxproj 文件,直接编译会出现第二个问题。正确操作应当如下:先备份 Potatso.xcodeproj/project.pbxproj 文件,然后执行 pod install --verbose ,成功后将文件覆盖。后续出现pod依赖更新的情况也应该按此步骤操作。

10. Could not locate device support files

问题截图:

原因: Xcode版本过低,不支持iOS 12.1系统。根据官方页面,需要Xcode 10







请到「今天看啥」查看全文