科学技术 · Scientific Internet

搭建Potatso问题汇总和对应解决方法

•̀.̫•́✧ · 10月13日 · 2020年本文5525字 · 阅读14分钟135

简介

六个月前,我写了一个教程“搭建iOS网络代理客户端”,用于记录我搭建的Shadowsocks客户端Potatso。 编译测试在所有进程中都很好地使用,只是libYAML相关依赖下载不正常。 许多同学在搭建时遇到了各种问题,一开始,我以为网民们没有仔细阅读教程,也没有注意搭建环境的差异,在然后,留言的同学越来越多,让我怀疑写完文章后代码有重大更新。

昨晚花了点时间用最新版本的代码构建Potatso,并将其安装在我最新的iOS系统的iPad上。 这个过程花了几个小时,涵盖了很多网友咨询我的问题,本文将给出一个解决方案。

如果您的Xcode版本为9.4.1,请使用其CommitID为318A5E1的代码,并且根据“搭建iOS网络代理客户端”的教程,将Potatso安装到iOS12下面的设备。如果您的设备升级到最新版本或遇到其他问题,请继续阅读本文。

为什么要构建自己的Shadowsocks客户端? 由于iOS生态的封闭性,一般只能从App Store下载应用程序。 在购买新设备后,机架关闭将重置手机并阻止安装。 Android、Windows和MacOS不存在此问题。 只要安装文件存在,就始终可用。 因此,有必要为iOS设备构建自己的客户端,特别是像SS这样的应用程序,即使是在某个时候也有可能出现故障。

搭建步骤

这节简要回顾构建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. 更改PotatsoPacketTunnelTodayWidget两个子项目的Bundle ID,例如本人分别改成:potatso.zsxcool.compotatso.zsxcool.com.PacketTunnelpotatso.zsxcool.com.TodayWidget
  6. 更改PotatsoPacketTunnelTodayWidget两个子项目Capabilities中的App GroupKeychain Sharing的Group:在”App Groups”中删除原有的group.io.wasin.potatso,新增自己的group,例如:”group.potatso.zsxcool.com”;在”Keychain Sharing”中输入自己的group ID;
  7. 打开”PotatsoBase/Potatso.m”文件,将shareGroupIdentifier函数的返回值改成自己的group id;
  8. 将iPhone等iOS设备连接到电脑,目标选择新接入的设备,点击左上角的“build and run”按钮,Xcode会编译并安装App到设备上,然后启动。

可能遇到的问题

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

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

问题截图

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

原因: 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”文件,将”http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz”改成“https://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz”

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

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

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

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

原因:根据错误描述跟踪脚本执行流程,发现是执行预构建脚本时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

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

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

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

5. The operation couldn’t be completed. Unable to log in with …

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…

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

原因: Apple ID过期未续费

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

6. No account for team ‘xxx’. Add a new account in the …

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

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

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

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

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

7. Your account does not have sufficient permissions to modify…

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

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

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

解决方案: 换一个新的

8. An Application Group with Identifier ‘xxxx’ is not available…

An Application Group with Identifier ‘xxxx’ is not available. Please enter a different string.

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

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

解决方案: 用一个新的

9. Module ‘Crashlytics’ not found

这个错误未截图。

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

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

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

10. Could not locate device support files

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

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

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

解决方案: 安装Xcode 10,文件较大,根据网速需要一定时间,请耐心等待

11. Invalid redeclaration of ‘<-‘ EnumOprators.swift

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

原因: ObjectMapper的版本过低

解决办法: 使用新版的ObjectMapper:打开Podfile,将ObjectMapper那一行改成pod 'AlamofireObjectMapper', '~> 5.0'

12. Type ‘RLMIterator’ does not conform to protocol ‘Sequence’

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗
搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

原因: 这个问题不清楚具体原因。怀疑是Realm这个库的问题,没有实现Sequence接口。我将RealmSwift改到最新的3.7.6问题亦没有解决。不懂Swift,不过感觉是RMLIterator或者Proxy/RuleSet等存在问题。

解决办法: 注销PotatsoMode/DBUtils.swift中的相关代码,具体是174-190和202-218行之间的代码。

备注: 解决方案来自:https://github.com/haxpor/Potatso/issues/109。所有错误中,只有这个错误不是完美解决。

13. Initializer for conditional binding must have Optional type, not ‘[Rule]’

问题截图:

搭建Potatso问题汇总和对应解决方法-歪?是3.1415926吗

原因: 非nil值不应该使用if let(我自己的理解,毕竟不懂Swift)

解决办法: 将Potatso/Core/API.swift第65和256行的if和大括号去掉,65行修改示意:

// 修改前
// if let parsedObject = Mapper<Rule>().mapArray(JSONArray: rulesJSON as! [[String : Any]]){
//     let parsedObject = Mapper<Rule>().mapArray(JSONArray: rulesJSON as! [[String : Any]])
//     rules.append(contentsOf: parsedObject)
//}
// 修改后
let parsedObject = Mapper<Rule>().mapArray(JSONArray: rulesJSON as! [[String : Any]])
rules.append(contentsOf: parsedObject)

参考

0 条回应