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

栏目: IOS · 发布时间: 5年前

内容简介:转载请注明文章出处:半年前写过一篇构建自用Potatso的教程“终于在昨天(除夕)抽出时间,用最新版的代码构建Potatso并安装到我最新版iOS系统的iPad上。这个过程花费了几个小时,覆盖了许多网友咨询我的问题,本文中将一一给出解决方案。

转载请注明文章出处: https://tlanyan.me/build-potatso-problems-and-solutions/

前言

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

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

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

为什么执着于自建客户端?由于iOS生态的封闭性,正常情况下只能通过App Store下载应用。应用下架后,可能会导致手机重置、买新手机后无法安装客户端。而安卓、Windows、MacOS则不会有这个问题,只要安装文件存在,总是有的用。自己构建的客户端永不会下架,放心可靠。

构建步骤

这节简要回顾构建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.tlanyan.mepotatso.tlanyan.me.PacketTunnelpotatso.tlanyan.me.TodayWidget
  6. 更改 PotatsoPacketTunnelTodayWidget 两个子项目 Capabilities 中的 App GroupKeychain 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.

问题截图:

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

原因:pod依赖未安装

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

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

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

问题截图:

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

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

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

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

问题截图:

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

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

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

4. 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问题集锦及解决方案

原因:Apple ID过期未续费

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

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

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

问题截图:

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

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

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

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

问题截图:

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

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

解决方案:换一个新的

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

问题截图:

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

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

解决方案:用一个新的

8. 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依赖更新的情况也应该按此步骤操作。

9. Could not locate device support files

问题截图:

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

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

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

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

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

问题截图:

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

原因: ObjectMapper 的版本过低

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

备注:解决方案参考 https://stackoverflow.com/questions/53038918/xcode-10-update-issue-with-alamofire-objectmapper

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

问题截图:

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

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

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

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

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

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

问题截图:

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

原因:非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)

备注:解决办法的灵感来自: https://stackoverflow.com/questions/31038759/conditional-binding-if-let-error-initializer-for-conditional-binding-must-hav 。当然这个问题和Potatso无关。

还有一个错误截图:

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

具体什么忘了。如果你遇到了或者有解决方案,可留言告诉我。

参考

  1. 构建自己的iOS网络代理客户端

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

标签

标签

Gene Smith / 张军、陈军亮 / 机械工业出版社 / 2012-6 / 59.00元

本书对标记系统这一概念的内涵和外延进行了系统化的、深入浅出的阐述。从什么是标记系统、标记系统有什么价值,到标记系统的架构和与其他分类系统的对比,再到标签的呈现方式和标记系统的实现细节,作者都用通俗易懂的语言进行了阐述,并附有详细的示例和具体的案例研究。本书的每一章都涵盖了标记系统的一个方面,主要内容包括:标记系统的模型、价值、架构,标签的分类、可视化、管理方法,最后介绍标记系统设计方法。本书带领读......一起来看看 《标签》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具