本文简要介绍iOS中Network Extension在提供安全科学(双s)使用G高级搜索、Y视频等App简单应用,同时使用了第三方库NEKit提供路由规则支持。
demo代码已适配swift5,点击
GitHub链接
查看。
demo运行需要有开发者账号,修改bundle id,在自己的开发者账号进行注册。
在创建应用之前我们需要安装
NEProviderTargetTemplates.pkg
,在xcode10.12之后苹果在xcode中删除了这个文件,为什么?可能和中国区被下架的那些VXN一样的原因吧。好在我们还可以从老版本的xcode中提取这个文件,链接在此
点击下载
,提取码:
18ek
,要低调,安装好后重启xcode。
接下来我们开始创建工程,首先和创建普通App一样创建一个Project
好了,到此工程就创建好了。
NEKit集成
由于项目中使用的NEKit这个第三方库只支持Carthage进行集成管理,所以demo使用的集成工具也是Carthage,没有用过的可以自行Google,安装使用难度不高,一看即会。
但是
注意
在第三方库编译的时候需要使用NEKit提供的编译方式,直接carthage update项目无法运行。
carthage update --no-use-binaries --platform mac,ios
第三方库编译好后会在Carthage目录下Build/iOS中生成.framework文件,我们需要把这些framework添加到项目中去,下图的两个位置都要需要添加,与Net无关的包在packetTunnel中可以不需要添加。
创建VXN Manager
首先需要创建一个NETunnelProviderManager
fileprivate func createProviderManager() -> NETunnelProviderManager {
let manager = NETunnelProviderManager()
let conf = NETunnelProviderProtocol()
conf.serverAddress = "BearFree"
manager.protocolConfiguration = conf
manager.localizedDescription = "BearFree"
return manager
本文简要介绍iOS中Network Extension在提供安全科学(双s)使用G高级搜索、Y视频等App简单应用,同时使用了第三方库NEKit提供路由规则支持。demo代码已适配swift5,点击GitHub链接查看。demo运行需要有开发者账号,修改bundle id,在自己的开发者账号进行注册。在创建应用之前我们需要安装NEProviderTargetTemplates.pkg,在...
Swift中的扩展,有点类似于OC中的分类(Category)
扩展可以为枚举、结构体、类、协议添加新功能
可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等等
扩展不能办到的事情
不能覆盖原有的功能
不能添加存储属性,不能向已有的属性添加属性观察器
不能添加父类
不能添加指定初始化器,不能添加反初始化器
计算属性、下标、方法、嵌套类型
extension Double {
var km: Double { self * 1_000.0 }
NEKit已弃用。
它仍然应该工作,但我不再打算对其进行维护。 它具有许多缺陷,需要进行改造才能成为高质量的库。
由于我在编写NEKit时缺乏经验,因此NEKit的体系结构并不理想。 更糟糕的是,它并不是最有效的形式,因为没有一个好的异步io库,而人们将其滥用为应直接实现或使用其他轻量级库的简单功能。
NEKit不是,从来没有打算过,而且可能永远不会成为一个简单的即装即用的库,如果不了解钩子在做什么,它就是开箱即用的。 这些年来,我学到的一件事是对于这个低水平的功能,开发人员应该了解自己在做什么。 我一直担心,由于该库的存在,人们正在创建不必要地降低用户电话速度的应用程序,我对此感到负责。
感谢所有对这个库有贡献,使用或感兴趣的人。
如果满足以下条件,则允许以源代码和二进制形式进行重新分发和使用,无
本例需求 : iOS通过NetworkExtension实现本地连接并成功拦截IP数据包pakcet.
建议:建议阅读本文前先仔细阅读并理解下App extension原理,有助于在项目中解决很多问题。App extension总结
注意:由于简大叔对XXX关键字过敏,而本文只是苹果App extension中一个重要内容,他们自然无法理解,所以本文均用XXX代替VPN,建议可以去本人个人博客...
```swift
// 创建一个AVPlayerViewController实例
let playerViewController = AVPlayerViewController()
// 添加到视图层次结构中
addChild(playerViewController)
view.addSubview(playerViewController.view)
playerViewController.didMove(toParent: self)
4.在AVPlayerViewController实例中,使用AVPictureInPictureController的`playerViewController(_:restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:)`方法,在画中画结束后恢复自定义视图:
```swift
// 在画中画结束后恢复自定义视图
func playerViewController(_ playerViewController: AVPlayerViewController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) {
// 创建自定义视图
let customView = CustomView(frame: playerViewController.view.bounds)
// 添加到视图层次结构中
playerViewController.view.addSubview(customView)
playerViewController.view.bringSubviewToFront(customView)
completionHandler(true)
请注意,您需要在info.plist文件中添加“Supported external accessory protocols”键,并将其设置为“com.apple.avfoundation.tunnel”的值,以便在iOS 14及更高版本中启用画中画功能。