我正在使用AVCaptureVideoDataOutput和记录视频和音频,AVCaptureAudioDataOutput并且在captureOutput:didOutputSampleBuffer:fromConnection:委托方法中,我想在我从视频连接接收的每个单独的样本缓冲区上绘制文本.文本随着每一帧(它是一个秒表标签)而变化,我希望将其记录在捕获的视频数据之上.
这是我到目前为止所能提出的:
//1.
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
//2.
UIImage *textImage = [self createTextImage];
CIImage *maskImage = [CIImage imageWithCGImage:textImage.CGImage];
//3.
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSDictionary *options = [NSDictionary dictionaryWithObject:(__bridge id)colorSpace forKey:kCIImageColorSpace];
CIImage *inputImage = [CIImage imageWithCVPixelBuffer:pixelBuffer options:options];
//4.
CIFilter *filter = [CIFilter filterWithName:@"CIBlendWithMask"];
[filter setValue:inputImage forKey:@"inputImage"];
[filter setValue:maskImage forKey:@"inputMaskImage"];
CIImage *outputImage = [filter outputImage];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
//5.
[self.renderContext render:outputImage toCVPixelBuffer:pixelBuffer bounds:[outputImage extent] colorSpace:CGColorSpaceCreateDeviceRGB()];
//6.
[self.pixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:timestamp];
Run Code Online (Sandbox Code Playgroud)
createTextImage这样.我能够验证这一步是否有效;我保存了一个带有文本的图像到我的照片中.我最近一直在努力解决我正在制作的iOS应用程序的安全性和用户身份验证问题,主要问题是如何允许用户注册任何第三方服务(或本机用户帐户)并仍然保持安全和模块化的过程.
我提出的解决方案非常复杂,我不是百分之百确定是否所有这些都是最佳实践,所以我想我会问我并得到任何建议和指示我可以解决的问题,什么工作正常,什么是坏的等等.
首先是认证问题.我喜欢将认证的概念与用户的想法分开.对我来说,身份验证是由设备或客户端执行的,独立于特定用户,而用户帐户是由于该身份验证而创建或检索的内容.这允许您做的是将客户端的身份验证视为一个进程,然后对用户进行身份验证(检查帐户是否存在等),以便有两层安全性.比如说客户端成功验证但是用户密码错误,整体验证失败并且松散耦合这两个概念是有益的.
为了实现身份验证,出于多种原因,我使用JWT(JSON Web令牌)而不是cookie.1)它们在移动设备上工作得更好2)是无会话的,这使得服务器实现变得更加容易,并且据我所知,它不受CORS攻击.在使用移动设备时,JWT似乎是更好的解决方案.我使用了很多npm库,最明显的是express-jwt和jsonwebtoken来在服务器端进行身份验证.
正如我上面提到的,我不仅尝试执行身份验证,还希望允许用户注册他们想要的任何第三方服务,例如Facebook,Twitter,以减少注册期间的用户摩擦.在考虑了一段时间并且谷歌搜索了很多之后,我想出了身份提供者的想法,身份提供者是一种身份验证系统,其中每个"帐户类型"被视为一个单独的身份提供者,并被推广为提供诸如access_token之类的信息,user_id,到期数据等.身份提供者很像你在许多应用程序设置页面中看到的"链接帐户".在iOS方面,我创建了一个抽象类,对于我想要支持的每个服务,我创建了一个具体的子类FacebookIdentityProvider,LocalIdentityProvider(电子邮件/密码)等.
在服务器端,我使用Passport模块来支持每种身份提供者.例如,他们有一个Facebook的令牌模块,一个是用户的电子邮件和密码等,所以我做了一个API的路线/authenticate,我们的客户主动要求与序列化的身份提供,且基于标识字符串,local,facebook-token,护照会召唤适当的子模块,用于根据提供的信息验证该提供者.
总的来说,安全流程如下所示:
verify端点发出请求.此端点将验证令牌是否仍然有效且未过期.refresh_token使用过期令牌向我的端点发出请求,该令牌将尝试重新发出令牌.如果失败,则客户端向我的authenticate端点发出请求,该请求只能由于用户操作而被调用.完成所有这些并完成后,我对一些事情仍然有点模糊.首先,我在express-jwt页面上阅读了有关撤销令牌的内容.什么时候我应该撤销令牌并让用户再次登录?每次无限期到期时,不断刷新令牌是没有意义的.
其次,当我将序列化身份提供者发送到服务器时,我会传递一份额外信息字典,这些信息将由护照用于根据流程进行身份验证.如果成功,则为该用户创建身份提供者并将其存储在数据库中.是否足够或者我应该使用access_token以及我从成功通话中获得的其他字段做得更多?特别是使用Facebook SDK,当客户端通过应用程序进行身份验证时,我会获得访问令牌,然后当客户端再次通过服务器进行身份验证时,我会获得另一个令牌.
我有一个额外的想法是有人通过标头或查询参数集成了每个请求传递的api密钥.api密钥将保密并在客户端保护.我认为这样做会为尚未完成身份验证过程的客户端添加另一层"身份验证".只有具有api-key的客户端才能够首先到达我的api,并且只有那些客户端才能尝试进行身份验证.
我的背景是正式的网络安全(我从来没有任何好处)和现在全栈移动开发,所以我对这些东西有更好的把握,然后大多数,但我觉得好像我没有做一些潜在的危险漏洞.我很遗憾不能发布代码,因为这是我的业务,但如果有什么我没有说清楚,只是评论,我很乐意详细说明.
另外我觉得我应该提一下,所有这些都是通过SSL完成的,我使用Nginx进行配置,所有iOS网络请求都是使用Overcoat完成的.最终我想使用Nginx作为负载均衡器,但那是另一天的帖子.
如果我有以下代码:
protocol ObjectType {
var title: String { get set }
}
extension ObjectType {
var objectTypeString: String {
let mirror = Mirror(reflecting: self)
return "\(mirror.subjectType)"
}
}
class Object: ObjectType {
var title = ""
}
class SomeOtherClass {
private func someFunc<T: Object>(object: T) {
print(object.objectTypeString)
}
}
Run Code Online (Sandbox Code Playgroud)
在Object符合的地方ObjectType,你会期望你可以访问objectTypeString任何ObjectInstance.但编译器说Type T has no member objectTypeString当在某个继承的泛型类型上访问该成员时Object,如上面的代码所示.当函数是非泛型函数并且仅传入Object参数时,没有问题.那么为什么参数是通用的,所以我无法访问符合类应该访问的协议成员?
我在这里遇到了这个问题,但我对解决方法不感兴趣,我只想了解通用系统是什么让我的例子不起作用.(简单的解决方法是做<T: ObjectType>)
如果我有课:
class Spaceship<FuelType> {
function prepareForLiftoff() throws {
//Start the countdown!
}
}
Run Code Online (Sandbox Code Playgroud)
我最初假设我可以prepareForLiftoff通过添加扩展来覆盖没有子类:
extension Spaceship where FuelType: CollectionType {
func prepareForLiftoff() throws {}
}
Run Code Online (Sandbox Code Playgroud)
这段代码不能编译,错误说明invalid redeclaration函数,这是有道理的.
我的问题是:是否有覆盖特定类的功能?换句话说,我可以在某些条件下替换功能,如上面的示例所示FuelType: CollectionType.如果没有,是否有任何其他解决方法或方法来实现该行为(可能声明另一个协议,idk)
现在我更多地考虑它,我不得不说这是不可能的,因为阻止某人覆盖任何标准库函数是什么?
我正在构建一个需要使用表情符号的应用程序,特别是生成大量随机表情符号序列。这需要有一个很大的列表可供选择。我决定采用不同的方法,从Unicode 网站下载和解析数据,而不是采用此处详细介绍的循环硬编码十六进制范围的方法。从那里,我进行一些代码生成,并将所有独特的表情符号写入磁盘,然后我可以在我的应用程序中获取它们。所有这些都是作为我的应用程序的手动步骤或构建步骤发生的。
然而,Unicode 规范很复杂,我不确定应该从哪些数据中提取来建立一个明确的列表。最新版本的Unicode(14.0)下有三个文件:
Unicode 字符数据库 (UCD) 中还有两个文件:
所有这些列表之间肯定存在重复项,例如,虽然我可以下载并解析所有五个文件并将列表减少到脚本中的唯一实例,但我希望使我的脚本尽可能简单,而不做不必要的工作。
据我了解:
1F1E6 1F1E8))或与变体选择器组合的表情符号(例如FE0F所有这些让我相当困惑,哪个列表或列表组合会给我最全面的表情符号列表。emoji-data.txt似乎有一个最广泛的列表,但我不想要表情符号修饰符或表情符号组件之类的东西;我只是在寻找用户可以使用键盘选择的表情符号(例如,您不能单独选择肤色修改器)。
哪些列表或列表组合可以生成我可以在应用程序中使用的最全面、最广泛的表情符号列表?
我正在构建一个使用NSPersistentCloudKitContainer. 该应用程序没有共享功能,其唯一的后端功能是使用 cloudkit 容器在用户设备之间同步数据。设置相当简单,实例化容器,设置单个商店描述,然后加载商店。
我的大问题:我需要对持久历史记录进行任何操作吗?我尚未找到这个问题的具体答案,但据我所知,持久历史记录跟踪用于将一个目标(例如扩展)中发生的更改合并到另一个目标中。听起来我不需要它来充分利用 iCloud 同步。
我想知道,如果我点击图标时有一个弹出窗口的chrome扩展,并且弹出窗口有一个文本框来输入数据,那么javascript会在文本框中获取文本的样子是什么?
更新:我知道如何从文本框中获取值,但我的问题是,如何专门访问popup.html文件的元素?我尝试访问document.getElementById等,但它获取实际页面内容中的元素,而不是我的自定义弹出窗口.
如果我有一个字符串白名单,我想检查用户输入到我的 javascript 程序中的所有内容,那么最有效的方法是什么?我可以只拥有一个数组并循环遍历它,直到找到匹配项,但这是 O(N)。有没有一种更好的方法,并且不涉及任何类型的键值查找,只需检查该值是否存在?
编辑:我想我正在寻找的相当于 C++ 中的集合,我可以在其中检查给定的值是否已存在于集合中。
我想要ReactiveCocoa 中的pauseorpauseUntil信号,其行为类似于skipUntilexcept 而不是只是跳过发送的值self直到skipUntil收到触发信号,我想要pause/pauseUntil有条件地等待并收集值,当触发信号触发时,转发所有已收集的值。
该pauseUntil函数将接受触发信号 ( Signal<(), NoError>),一旦触发,self就会像正常一样运行。
pause另一方面,该函数将充当切换开关,采用 的参数Signal<Bool, NoError>,有效地暂停和取消暂停相关信号。
我喜欢Dwifft,但我更希望将它与ReactiveCocoa一起使用,以帮助减少我的集合视图控制器中的代码复杂性.
目前,我有一个辅助类,它接受SignalProducer<[[T]]>where 的实例T: Equatable(因此它适用于不同的).每次信号产生器发出一个新值:
self.data.producer.observeOn(UIScheduler()).on(next: { [unowned self] in
guard let collectionView = self.collectionView else { return }
for (index, element) in $0.enumerate() {
if index == self.diffCalculators.count {
let calculator = CollectionViewDiffCalculator<T>(collectionView: collectionView, initialRows: element)
calculator.sectionIndex = index
self.diffCalculators.append(calculator)
} else {
let calculator = self.diffCalculators[index]
calculator.rows = element
}
for index in self.data.value.count..<(self.diffCalculators.count >= self.data.value.count ? self.diffCalculators.count : self.data.value.count) {
self.diffCalculators.removeAtIndex(index)
}
}
})
.takeUntil(self.willDeallocSignal())
.start()
Run Code Online (Sandbox Code Playgroud)
在这里,通过我的2d数组枚举,如果还没有存在差异计算器,则会创建一个并添加到我的存储阵列中diffCalculators.如果确实存在,rows则设置该属性.之后,我遍历其余部分并将其删除.
不幸的是,我一直难以置信地将其付诸实践.一次The number …
ios ×6
swift ×5
generics ×2
javascript ×2
avfoundation ×1
core-data ×1
core-image ×1
core-video ×1
emoji ×1
html ×1
jwt ×1
node.js ×1
nspersistentcloudkitcontainer ×1
objective-c ×1
performance ×1
protocols ×1
security ×1
unicode ×1