相关文章推荐
谦和的豌豆  ·  ubuntu安装m2crypto - CSDN文库·  1 年前    · 
近视的遥控器  ·  什么是样板代码?_问答-阿里云开发者社区·  1 年前    · 
路过的酱肘子  ·  用户对问题“SVN钩子预检修-更改不起作用” ...·  2 年前    · 
仗义的夕阳  ·  Seaborn配对图图例-如何控制位置 - ...·  2 年前    · 
追风的鼠标  ·  Swift framework 与 OC ...·  2 年前    · 
Code  ›  iOS开发实战-NetworkExtension食用教程写在前面项目介绍项目准备我不是广告结语开发者社区
ios开发
https://cloud.tencent.com/developer/article/1193619
发财的熊猫
1 年前
gwk_iOS

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

腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
gwk_iOS
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > iOS开发实战-NetworkExtension食用教程写在前面项目介绍项目准备我不是广告结语

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

作者头像
gwk_iOS
发布 于 2018-08-23 10:54:21
7.3K 1
发布 于 2018-08-23 10:54:21
举报
文章被收录于专栏: coding... coding...

写在前面

之前由于一些关键字问题被简大叔给封锁了...我还是换成正常的来吧~鉴于此顺便给自己开了个 简单的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中的PersonalV**和NetworkExtesions开关打开,注意是两个都开哦

打开PersonalV**和NetworkExtesions

二.连接V**

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

let manager = NETunnelProviderManager()
let conf = NETunnelProviderProtocol()
conf.serverAddress = "My V**"          //任意值,显示在设置-V**-Detial中
manager.protocolConfiguration = conf
manager.localizedDescription = "My V**"
manager.isEnabled = true               //使V**在系统中变为选中的状态

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: 启动V**时调用
func startTunnel(options: [String : NSObject]? = nil, completionHandler: @escaping (Error?) -> Swift.Void)
//MARK: 停止V**时调用
func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Swift.Void) 

四.启动V**

启动V**很简单,只需对ProviderManager执行startV**TunnelWithOptions()方法即可

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

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

 func addV**StatusObserver() {
     guard !observerAdded else{
         return
     loadProviderManager { [unowned self] (manager) -> Void in
         if let manager = manager {
             self.observerAdded = true
             NotificationCenter.default.addObserver(forName: NSNotification.Name.NEV**StatusDidChange, object: manager.connection, queue: OperationQueue.main, using: { [unowned self] (notification) in
                 self.updateV**Status(manager: manager)

五.关于Debug调试

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

六.传SS递配置文件

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

  • 主程序写入
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: NEV**Protocol { 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
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
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
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

修改版本号

 
推荐文章
谦和的豌豆  ·  ubuntu安装m2crypto - CSDN文库
1 年前
近视的遥控器  ·  什么是样板代码?_问答-阿里云开发者社区
1 年前
路过的酱肘子  ·  用户对问题“SVN钩子预检修-更改不起作用”的回答 - 问答 - 腾讯云开发者社区-腾讯云
2 年前
仗义的夕阳  ·  Seaborn配对图图例-如何控制位置 - 问答 - 腾讯云开发者社区-腾讯云
2 年前
追风的鼠标  ·  Swift framework 与 OC 混编 - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号