之前由于一些关键字问题被简大叔给封锁了...我还是换成正常的来吧~鉴于此顺便给自己开了个 简单的wordpress博客有兴趣的可以去看看吧~~~
最近闲来无事,又跟小伙伴搞起.自由冲浪.的项目,于是这个项目就来了.
运用Apple NetworkExtension框架(现在不用单独申请了哟),搭配NEKit 配置S最终实现....上网
Carthage
由于未知原因苹果在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
首先,我们需要在主程序中像系统生名一个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.......
}
由于目前我使用的是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**很简单,只需对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)
})
}
}
}
我们需要在主程序中传递类似账号、密码、端口、加密方式等参数给我们的V**组件。
let conf = ["port":1000,"method":"AES-256-CFB","password":"hello"]
let providerProtocol = manager.protocolConfiguration as! NETunnelProviderProtocol
providerProtocol.providerConfiguration = conf
manager.protocolConfiguration = orignConf
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导入方法 直接导入即可 导入成功后记得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
修改版本号
CommonCrypto
framework由于
CommonCrypto
框架的问题需要在Cartfile
中添加github "soffes/CommonCrypto"
按照demo上使用Carthage导入NEKit 运行
carthage update --no-use-binaries --platform ios
关闭项目Capabilites中AppGroups开关 将entitlements
中相关的 groups属性删除即可
很高兴App 已经过审, 有兴趣的可以玩玩牛牛数据 支持iPad哦 update: Mac版已成功上架牛牛数据Mac版~~