本文发自 http://www.binss.me/blog/compile-shadowsocks-ios-with-error-sodium-description/,转载请注明出处。

近日使用shadowsocks-ios发现无法翻了,感觉是上次编译的版本太老,在此记录新版本编译的过程。

太长不看版本:

从IOS8起,作者就停止了开源版本(2.0.3)的更新,后续由于总所周知的原因更是移除了相关代码。尽管修修补补,在IOS9下勉强能跑,但是偶尔会出现无法连接到sslocal,进而无法进行代理的情况。所以,还是上Surge类应用吧,无论是功能还是稳定性上都好太多。

原项目地址:

https://github.com/shadowsocks/shadowsocks-iOS/

目前可用的版本地址:

https://github.com/binss/shadowsocks-iOS/

最后更新时间

2016.03.12

测试环境:

XCode 7.2.1

iPhone 6S 9.2.1

以下是编译过程:

  1. 下载代码和依赖模块

    $ git clone https://github.com/shadowsocks/shadowsocks-iOS/
    $ git cd 目录
    $ git submodule init
    $ git submodule update

    如果$git submodule update的过程报没有权限的错误,请查看目录下的.gitmodules文件,将所有链接改为https格式,如:

    // ...
    [submodule "AppProxyCap"]
        path = AppProxyCap
        url = https://github.com/freewizard/AppProxyCap.git
  2. Xcode打开工程, 开始编译

    错误1:'sodium.h' file not found

    解决方法:安装libsodium,建议不要傻傻的到官网下载然后自己编译(各种报错)。我选用的是CocoaPods安装法。先安装好CocoaPods(需要Ruby环境):

    $ sudo gem install cocoapods
    $ cd /shadowsocks-ios
    $ pod init

    修改项目下的Podfile文件为:

    platform :ios, '9.2'
    pod 'libsodium', '~> 1.0.3'

    安装libsodium:

    $ pod install

    注意:此后Xcode使用shadowsocks.xcworkspace 作为项目工程文件。

    在project的build settings中设置头文件目录:

    错误2:Use of undeclared identifier '_description'; did you mean 'description'?

    解决方法:修改_description为_description_t,并在头文件加入

    @property (nonatomic, strong, readonly) NSString *description_t;

    错误3:no such file or directory ... interpose.c

    解决方法:找到该目录发现里面没有内容,到https://github.com/comex/inject_and_interpose 手动下载粘入。

    错误4:you must install Crashlytics to continue.

    解决方法:简单粗暴,移除下图中run script中的内容。

    错误5:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

    解决方法:在shadowsocks-Info.plist中,设置App Transport Security Settings-Allow Arbitrary Loads为YES(如果没有,请新建)。

    错误6:-fembed-bitcode is not supported on versions of iOS prior to 6.0

    Xcode 7 has a ENABLE_BITCODE option to embed bitcode in apps, app extensions, and frameworks. The option is turned on by default for iOS and is mandatory for watchOS projects submitted to the store. When bitcode is enabled for a target, all the objects, static libraries and user frameworks used when linking that target must contain bitcode.

    解决方法:在项目的Build Setttings中,设置Enable Bitcode为No。

    错误7:运行时出现`address already in use,bind error()`

    非常感谢6楼童鞋提供的解决方案。

    解决方法:IOS8后,1080端口被占用。代码搜索1080,将之改为其他端口。注意proxy.pac.gz中的端口也要修改(先解压,修改后用gzip压回)。

  3. 最后记得我们的目标:

    取消掉SWBViewController.m 中 [self play]; 的注释。