Skip to content

Instantly share code, notes, and snippets.

@shalyf
shalyf / TBPasswordTextField.swift
Last active March 29, 2021 07:23
通过替身修复 iOS 14.2 下使用中文九宫格键盘无法输入密码的问题
//
// TBPasswordTextField.swift
// AirDroid
//
// iOS 14.2开始,使用中文九宫格键盘无法输入密码
// https://developer.apple.com/forums/thread/668859
// 我决定通过替身来修复此问题
//
// Created by Easher Yii on 2021/3/5.
// Copyright © 2021 sandstudio. All rights reserved.
@shalyf
shalyf / webrtc_microphone_mute.md
Last active August 21, 2023 09:23
WebRTC iOS源码修改 - 让SDK支持静音麦克风(用户可以在语音通话过程中静音自己的麦克风)

在WebRTC官方SDK中,如果为RTCPeerConnection添加了AudioTrack,WebRTC就会尝试去初始化音频的输入输出。 Audio通道建立成功之后WebRTC会自动完成声音的采集传输播放。 RTCAudioSession提供了一个useManualAudio属性,将它设置为true,那么音频的输入输出开关将由isAudioEnabled属性控制。 但是,isAudioEnabled只能同时控制音频的输入输出,无法分开控制。 我们的产品现在需要在静音麦克风的功能,也就是保持输出打开,但是关闭输入。
目前官方没有提供API,底层相关代码还没有实现

// sdk/objc/native/src/audio/audio_device_ios.mm
@shalyf
shalyf / audio_format.swift
Last active May 10, 2024 20:28
format CMSampleBuffer from/to AudioBufferList/Data
func data(from sampleBuffer: CMSampleBuffer) -> Data {
var abl = AudioBufferList()
var blockBuffer: CMBlockBuffer?
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer,
bufferListSizeNeededOut: nil,
bufferListOut: &abl,
bufferListSize: MemoryLayout<AudioBufferList>.size,
blockBufferAllocator: nil,
blockBufferMemoryAllocator: nil,
@shalyf
shalyf / combine_iplayground2019.swift
Created February 16, 2020 09:07
从 iPlayground 2019 学到的简易版 Swift Combine 框架实现
import Foundation
let url = URL(string: "https://www.bing.com")!
class Subscriber {
let cancel: () -> Void
init(cancel: @escaping () -> Void) {
self.cancel = cancel
}
@shalyf
shalyf / vpn_route.md
Last active May 4, 2024 14:54
利用路由表给VPN分流

2020年初因为新冠肺炎爆发,所以在家办公,公司给配置了L2TP的VPN,但是我不想所有流量都走VPN(VPN比较慢而且也节省流量),于是想到用路由表给VPN分流。
具体的方案就是公司内网的流量走VPN,外网流量走默认网关。

我是在macOS上操作的,其他平台应该也差不多。

假设:
公司内网 192.168.10.0/24
家里网络 192.168.1.0/24 你已经配置好VPN并且可以使用了。

@shalyf
shalyf / websocket-1006.md
Last active February 16, 2020 09:11
心跳间隔过长导致 Websocket 1006 异常断连

最近开发了一个iOS应用,依赖于websocket长连接,然而提审的时候被拒了。 从审核员提供的截图和服务端的日志来看,审核员手上的设备会不定时断开websocket连接,时长大概在30秒-1分多钟之间。 开始以为是美国连接我们服务器的线路有问题,遂通过科学手段让iOS的出口IP变成美国IP,竟然真就复现了这个问题。

查看客户端的日志:

Error Domain=NSPOSIXErrorDomain Code=54 "Connection reset by peer" UserInfo={_kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1}

故而认为是服务端先动的手,找服务端查看websocket连接日志,不想服务端也认为是客户端先动的手,收到了1006的异常信息。

@shalyf
shalyf / String+NSPredicate.swift
Created December 13, 2018 03:44
使用NSPredicate进行正则匹配
extension String {
/// 检查字符串是否匹配正则
///
/// - Parameter pattern: 正则表达式
/// - Returns: true - 匹配
func matchPattern(_ pattern: String) -> Bool {
let predicate = NSPredicate(format: "SELF MATCHES %@", pattern)
return predicate.evaluate(with: self)
}
}
@shalyf
shalyf / CVPixelBuffer(Data).swift
Created July 17, 2018 12:44
CVPixelBuffer转Data,以及Data转CVPixelBuffer
func getData(from pixelBuffer: CVPixelBuffer) -> Data {
//TODO:可以通过CVPixelBufferGetPlaneCount判断一下pixelBuffer是否有两个Plane
CVPixelBufferLockBaseAddress(pixelBuffer, CVPixelBufferLockFlags(rawValue: 0))
let pixelFormatType = CVPixelBufferGetPixelFormatType(pixelBuffer)
let width = CVPixelBufferGetWidth(pixelBuffer)
let height = CVPixelBufferGetHeight(pixelBuffer)
var data = Data()
@shalyf
shalyf / CVPixelBuffer(vImage).swift
Last active January 6, 2024 20:46
CVPixelBuffer通过vImage转换成CGImage
import Accelerate.vImage
func getImageBuffer(from pixelBuffer: CVPixelBuffer) -> vImage_Buffer? {
var buffer = vImage_Buffer()
let bitmapInfo = CGBitmapInfo(rawValue: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.first.rawValue)
var cgFormat = vImage_CGImageFormat(bitsPerComponent: 8,
bitsPerPixel: 32,
colorSpace: nil,
bitmapInfo: bitmapInfo,
version: 0,
@shalyf
shalyf / undefined_symbols.md
Last active July 9, 2020 08:17
Undefined symbols for architecture arm64

在Swift中使用Google Nearby API的时候,遇到了以下错误

Undefined symbols for architecture arm64:
"OBJC_CLASS$_GNSMessageManager", referenced from:
objc-class-ref in TBGNSMessager.o
"OBJC_CLASS$_GNSMessage", referenced from:
objc-class-ref in TBGNSMessager.o