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

    技术教程 vpnxxw 来源:tlanyan 45次浏览 0个评论 扫描二维码

    本文说的网络代理客户端指ShadowSocks(R)客户端,用途你懂的。

    本文写作时的环境:MacOS High Sierra 10.13.6,Xcode版本9.4.1,Swift版本4.1.2,所用代码的commitID: 318a5e1

    本文所用的XCode工程文件夹已经上传至网盘:https://pan.baidu.com/s/190N2_ElBWGzxtpL-Hx_d1A

    Xcode10(适用于ios 12及以上设备)构建的版本以及如果构建过程中遇到的问题请参考:构建Potatso问题集锦及解决方案

    前提条件

    构建iOS设备的自用客户端(Potatso),需要两个前提条件:

    1. 一台装有XCode的MacOS设备;
    2. 一个可用的苹果开发者账号。

    构建步骤

    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的作者(icodesign)公开了源代码,而后由于部分人的滥用导致作者删除代码且第二版不再开源。本文使用的Potatso客户端的代码来自icodesignhaxpor等人。

    构建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. 打开”Potatso.m”文件,将shareGroupIdentifier函数的返回值改成自己的group id;
    8. 在Potatso项目的BuildSettings中找Code Signing Entitlements,将”xxxx.entitlements”删除;
    9. 将iPhone等iOS设备连接到电脑,目标选择新接入的设备,点击左上角的“build and run”按钮,Xcode会编译并安装App,然后启动。

    一切顺利的话,iOS设备上的客户端能正常使用,接下来可以安装到多个设备上,也可以打包成ipa用iTunes安装到其他已注册设备。软件截图如下:

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

    请记住用途为自用,请不要商业使用或者将应用发布到App Store上(并收费)。

    可能遇到的问题

    本人构建过程中遇到的主要问题是Cocoapods依赖安装。执行pod install,前面一切顺利,到libYAML会出现问题:

    <code class=" prettyprinted"><span class="typ">Installing</span> <span class="typ">LibYAML</span> <span class="pun">(</span><span class="lit">0.1</span><span class="pun">.</span><span class="lit">4</span><span class="pun">)</span>
    
    <span class="pun">[!]</span> <span class="typ">Error</span><span class="pln"> installing </span><span class="typ">LibYAML</span>
    <span class="pun">[!]</span> <span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">curl </span><span class="pun">-</span><span class="pln">f </span><span class="pun">-</span><span class="pln">L </span><span class="pun">-</span><span class="pln">o </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">folders</span><span class="pun">/</span><span class="pln">dj</span><span class="pun">/</span><span class="pln">ljst94xx47l7fn3wz4q9bwsw0000gn</span><span class="pun">/</span><span class="pln">T</span><span class="pun">/</span><span class="pln">d20180822</span><span class="pun">-</span><span class="lit">4467</span><span class="pun">-</span><span class="lit">1cotycr</span><span class="pun">/</span><span class="pln">file</span><span class="pun">.</span><span class="pln">tgz http</span><span class="pun">:</span><span class="com">//pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz --create-dirs --netrc-optional --retry 2</span>
    
      <span class="pun">%</span> <span class="typ">Total</span>    <span class="pun">%</span> <span class="typ">Received</span> <span class="pun">%</span> <span class="typ">Xferd</span>  <span class="typ">Average</span> <span class="typ">Speed</span>   <span class="typ">Time</span>    <span class="typ">Time</span>     <span class="typ">Time</span>  <span class="typ">Current</span>
                                     <span class="typ">Dload</span>  <span class="typ">Upload</span>   <span class="typ">Total</span>   <span class="typ">Spent</span>    <span class="typ">Left</span>  <span class="typ">Speed</span>
      <span class="lit">0</span>     <span class="lit">0</span>    <span class="lit">0</span>     <span class="lit">0</span>    <span class="lit">0</span>     <span class="lit">0</span>      <span class="lit">0</span>      <span class="lit">0</span> <span class="pun">--:--:--</span> <span class="pun">--:--:--</span> <span class="pun">--:--:--</span>     <span class="lit">0</span><span class="pln">
     curl</span><span class="pun">:</span> <span class="pun">(</span><span class="lit">7</span><span class="pun">)</span> <span class="typ">Failed</span><span class="pln"> to connect to pyyaml</span><span class="pun">.</span><span class="pln">org port </span><span class="lit">80</span><span class="pun">:</span> <span class="typ">Connection</span><span class="pln"> refused</span></code>

    根据提示libYAML官网的80端口关闭了,将http替换成https发现可以正常下载。libYAML官网这仅支持https,连301跳转机会都不给的骚操作顿时让我有点小蛋疼。用grep搜索工程,没发现可以把http改成https的配置文件存在;对Cocoapods不熟,libYAML的地址不知是否从云端下载下来;打开Podfile.lock,将版本从”0.1.4″改成其他的,依赖又出问题;无奈之下先将文件下载下来,将其放到”/var/folders/dj/ljst94xx47l7fn3wz4q9bwsw0000gn/T/d20180822-4467-1cotycr/”目录下并改名为”file.tgz”,再次运行pod install --verbose,发现路径每次都不一样,非常蛋疼。

    最后的解决方案是采用网络劫持:

    1. 新开一个终端,进入root模式:sudo -i
    2. 创建download/libyaml目录,将下载的文件复制到文件夹:mkdir -p download/libyaml; mv /Users/tlanyan/Downloads/yaml-0.1.4.tar.gz download/libyaml/
    3. 将pyyaml.org域名解析指向本地:vim编辑/etc/hosts文件,增加一行:127.0.0.1 pyyaml.org
    4. 用Python启动一个静态web服务器,监听80端口:python -SimpleHTTPServer 80

    以root身份设置好监听后,在原来终端继续pod install --verbose,问题解决。

    除了依赖问题,其他问题主要是以Bundle ID/group ID的问题,请根据错误提示修改。

    有关Potatso

    Potatso的作者是icodesign祭奠死去的 Potatso 1为作者对Potatso的自述,建议每一个使用Potatso代码的人都看看。

    Github上搜”Potatso”,最匹配排名第一的仓库持有者是haxpor(Wasin Thonkaew)。其在仓库README的第一位置建议使用代码的人查看ADHERE_LICENSE.md中的内容。简单来说就是不要直接复制源码然后发布到App Store上,具体来讲haxpor的希望是:

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

    其他

    本人常用的客户端是SsrConnectPro,可惜不管全局还是系统代理,都无法使用TG。后来用了WaterDrop,使用TG无忧。遗憾的是前两周WaterDrop抽风,连接服务器后又立马断开,原因未知。想着重装一下就好了,就将其卸载掉。打开App Store搜索发现软件不见踪影,上网查方知已经下架(其他区也下架),只好寻找替代品。在App Store下载了多个客户端,能上外网的很多,用得了Telegram的很少。这顿时让我有种危机感:要是这些软件下架了,我该怎么在iOS上(尤其是新设备)访问外网、使用TG呢?

    解决办法之一是做一个自己的客户端,这样就永远不会下架。本人比较幸运,从闲下来找代码以及编译并测试使用正常,总共花了几个小时(主要时间是解决Cocospods的依赖安装)。上网查了一圈,貌似没有相关教程,于是有了此文。

    本人从未用过Swift,无法对客户端功能进行修改,类似问题请勿咨询本人。如果可以,请购买Potatso 2支持原作者,或者给haxpor等人捐赠。

    感谢阅读!

    参考

    1. https://github.com/haxpor/Potatso
    2. https://www.jianshu.com/p/1711e131987d
    3. https://sspai.com/post/38909
    4. https://coolshell.cn/articles/1480.html
    5. https://cloud.tencent.com/developer/article/1072481
    6. https://mirror.tuna.tsinghua.edu.cn/help/CocoaPods/
    anyShare分享到:

    VPN信息网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明-VPN信息网-构建自己的iOS网络代理客户端
    喜欢 (0)
    发表我的评论
    取消评论

    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址