iOS开发实战-NetworkExtension食用教程写在前面项目介绍项目准备我不是广告结语

写在前面

之前由于一些关键字问题被简大叔给封锁了...我还是换成正常的来吧~鉴于此顺便给自己开了个 简单的wordpress博客有兴趣的可以去看看吧~~~ 最近闲来无事,又跟小伙伴搞起.自由冲浪.的项目,于是这个项目就来了.

项目介绍

运用Apple NetworkExtension框架(现在不用单独申请了哟),搭配NEKit 配置S最终实现....上网

  • 首先感谢zhuhaow的优秀框架NEKit帮我们做了很多网络相关的处理,原则上我们只用专注UI就可以很方便的在iOS OSX平台开发出一个简单的S客户端
  • 再来就是感谢称一称小哥的优秀Demo,该Demo几乎就是一个iOS平台的S客户端
  • 本项目为Swift项目
  • 根据NEKit的使用帮助,这边第三方类库管理工具我们使用Carthage
  • 本文已称一称小哥的Demo为主

项目准备

一.安装NEProviderTargetTemplates.pkg

由于未知原因苹果在mac OS 10.12中删除了这个文件,因此我们需要从10.11系统中提取或下载--百度网盘 安装完毕后,在新增build target中我们就可以看到多了AppProxy和 Package Tunnrl Provider。我们选择Package Tunnrl Provider

选择target

Package Tunnrl Provider

打开项目将2个Target的Capabilites中的PersonalVPN和NetworkExtesions开关打开,注意是两个都开哦

打开PersonalVPN和NetworkExtesions

二.连接VPN

首先,我们需要在主程序中像系统生名一个ProviderManager,即设置VPN中的栏目。

let manager = NETunnelProviderManager()
let conf = NETunnelProviderProtocol()
conf.serverAddress = "My VPN"          //任意值,显示在设置-VPN-Detial中
manager.protocolConfiguration = conf
manager.localizedDescription = "My VPN"
manager.isEnabled = true               //使VPN在系统中变为选中的状态
NETunnelProviderManager.loadAllFromPreferencesWithCompletionHandler{ 
    (managers, error) in
    guard let managers = managers else{return}
    let manager: NETunnelProviderManager
    if managers.count > 0 {
        manager = managers[0]
    }else{
        manager = self.createProviderManager()
    }
    // Todo
    // manager.saveToPreferences.......
}

三.简单配置extension

由于目前我使用的是Swift3.0,这时候我们需要修改Extension中的几个方法修改一下

//MARK: 启动VPN时调用
func startTunnel(options: [String : NSObject]? = nil, completionHandler: @escaping (Error?) -> Swift.Void)

//MARK: 停止VPN时调用
func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Swift.Void) 

四.启动VPN

启动VPN很简单,只需对ProviderManager执行startVPNTunnelWithOptions()方法即可

saveToPreferences{
   error in
   //出错处理
   manager.loadFromPreferences{
        if $0 != nil{print($0)}
        manager.startVPN.........
    }
}

连接成功会manager.connection.status会发生相应改变,因此我们需要在按下连接按钮后监听status,从而知道目前Vpn的连接状态

 func addVPNStatusObserver() {
     guard !observerAdded else{
         return
     }
     loadProviderManager { [unowned self] (manager) -> Void in
         if let manager = manager {
             self.observerAdded = true
             NotificationCenter.default.addObserver(forName: NSNotification.Name.NEVPNStatusDidChange, object: manager.connection, queue: OperationQueue.main, using: { [unowned self] (notification) in
                 self.updateVPNStatus(manager: manager)
             })
         }
     }
 }

五.关于Debug调试

  • Extension debug不同于正常的程序,尽量使用NSlog代替print,即可在系统日志中查看到内容。同时,如果需要Debug,可通过Xcode->Debug->Attach To Process 选择你的Tunnel名进行debug 打开控制台console就能看到所有日志 筛选一下当前的target就能看到日志信息了

六.传SS递配置文件

我们需要在主程序中传递类似账号、密码、端口、加密方式等参数给我们的VPN组件。

  • 主程序写入
let conf = ["port":1000,"method":"AES-256-CFB","password":"hello"]
let providerProtocol = manager.protocolConfiguration as! NETunnelProviderProtocol
providerProtocol.providerConfiguration = conf
manager.protocolConfiguration = orignConf
  • target读取
public var protocolConfiguration: NEVPNProtocol { get }

guard let conf = (protocolConfiguration as! NETunnelProviderProtocol).providerConfiguration else{
    NSLog("[ERROR] No ProtocolConfiguration Found")
    exit(EXIT_FAILURE)
}
let address = conf["address"] as! String
let port = conf["port"] as! Int

七.导入NEKit

根据NEKit导入方法 直接导入即可 导入成功后记得copy framework哦,脚本copy和手动添加都是可行的

八.上架问题

90080,90087,90209,90125报错

在上架时如果直接使用会报错90080,90087,90209,90125等错误,这是由于NEKit中包含了x86_64, i386 架构,当然这个AppStore是不允许的,所以会在上传的时候报错 解决方法: Build Phases - New Run Script Phase

Build Phases - New Run Script Phase

添加如下代码

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and

# removes unused architectures.

find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK

do

FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)

FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"

echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS

do

echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"

lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"

EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")

done

echo "Merging extracted architectures: ${ARCHS}"

lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"

rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"

rm "$FRAMEWORK_EXECUTABLE_PATH"

mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

添加代码

CFBundleShortVersionString报错

这是由于NEKit没有设置版本号 找到NEKit的framework将info.plist中的版本号

找到info.plist

修改版本号

九.Demo食用方法

  • 添加CommonCryptoframework

由于CommonCrypto框架的问题需要在Cartfile中添加 github "soffes/CommonCrypto"

  • 导入NEKit

按照demo上使用Carthage导入NEKit 运行carthage update --no-use-binaries --platform ios 关闭项目Capabilites中AppGroups开关 将entitlements中相关的 groups属性删除即可

结语

最后再次感谢NEKit?和称一称提供的Demo ?

很高兴App 已经过审, 有兴趣的可以玩玩牛牛数据 支持iPad哦 update: Mac版已成功上架牛牛数据Mac版~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

阅读源代码的姿势:以 go-restful 为例

一般初学者确定一个方向,比如web 后端、前端等,会选择一门编程语言深入下去,比如后端java、python、go等。通过项目不断练习编程语言和编程思维,知道如...

18030
来自专栏数据库新发现

Oracle诊断案例-SGA与Swap之二

案例描述: 这是一个大型生产系统 问题出现时系统累计大量用户进程 用户请求得不到及时响应,新的进程不断尝试建立连接 连接数很快被用完 数据库版本:9.2.0...

10120
来自专栏杨建荣的学习笔记

一天内碰到的3个rac节点问题 (r6笔记第36天)

说到问题,真是层出不穷,自己也算搭建了也不少的rac环境的,但是在本地试验的时候总是会碰到一些问题,昨晚铲掉旧环境,搭建了两遍rac环境,终于在凌晨搭建好了环境...

35170
来自专栏GopherCoder

『阅读源代码的姿势:以 go-restful 为例』

61230
来自专栏移动端开发

iOS 测试三方 KIF 的那些事

一: KIF 三方库的配置       今天的广州天气还不错,原本想试试UI测试的,前几天也了解到很多公司都在用 KIF 这这三方框架!!今天也就试着做做,可就...

24560
来自专栏康怀帅的专栏

Nginx 编译安装

本文介绍了手动编译安装 nginx 的具体步骤。 安装依赖包 RedHat 系 $ yum install -y gcc gcc-c++ pcre-devel ...

37740
来自专栏GopherCoder

『No18: Go 实现世界杯后台管理系统』

趁着周末更新一期,上一期讲到 如何快速熟悉一个项目, 文章的最后讲到,最好的方法是借用相同的技术栈重新实现一个项目。

19910
来自专栏游戏杂谈

xcode中嵌入framework(接入快用最新SDK遇到的问题)

但xcode设置中并没有找到Embed Frameworks这个选项,使用以下方式添加

14840
来自专栏FreeBuf

远程RPC溢出EXP编写实战之MS06-040

0x01 前言 MS06-040算是个比较老的洞了,在当年影响十分之广,基本上Microsoft大部分操作系统都受到了影响,威力不亚于17年爆出的”永恒之蓝”漏...

324100
来自专栏黑泽君的专栏

day54_BOS项目_06

第一步:根据提供的 业务受理.pdm 文件生成建表文件 bos_qp.sql 第二步:由于业务受理.pdm 文件中有伪表,所以我们需要修改生成的建表文件,修改如...

10420

扫码关注云+社区

领取腾讯云代金券