chillwind 最近的时间轴更新
chillwind

chillwind

V2EX 第 152281 号会员,加入于 2015-12-21 12:00:14 +08:00
像滴答清单这种提醒弹框是怎么实现的?
Android  •  chillwind  •  281 天前  •  最后回复来自 welkinshadow002
5
iOS Core Graphics 画圆角矩形的问题
  •  1   
    iDev  •  chillwind  •  2020-10-26 19:18:36 PM  •  最后回复来自 ysc3839
    1
    一段 object c 代码想转 Swift ,有什么方法吗?
    macOS  •  chillwind  •  2020-08-29 13:17:41 PM  •  最后回复来自 zyc199847
    5
    android 小组件的问题?
    Android  •  chillwind  •  2020-08-11 23:04:57 PM
    求推荐一个好用的富文本编辑器,支持图文混排
    Android  •  chillwind  •  2020-03-30 16:43:05 PM  •  最后回复来自 xutao881
    9
    iPhone xs max 上一像素线闪动的问题
  •  1   
    iDev  •  chillwind  •  2018-10-16 18:43:19 PM  •  最后回复来自 DyingSwan
    2
    iPhone xs max 上一像素线闪动
    iOS  •  chillwind  •  2018-10-17 10:00:27 AM  •  最后回复来自 CommandZi
    3
    chillwind 最近回复了
    @zw1234 求拉 base64 Y2hpbGx3aW5kdGFu
    286 天前
    回复了 chillwind 创建的主题 Android 像滴答清单这种提醒弹框是怎么实现的?
    @vone 应该不是,切换完其他 app 这个悬浮窗应该会消失。而且没有给 SYSTEM_ALERT_WINDOW 权限
    2020-08-28 15:16:06 +08:00
    回复了 chillwind 创建的主题 macOS 一段 object c 代码想转 Swift ,有什么方法吗?
    看了半天 swift,自己人肉转了一个。用的不对的地方,还请各位指正
    ```
    import Foundation
    import CommonCrypto

    struct AES {

    // MARK: - Value
    // MARK: Private
    private let key: Data
    // MARK: - Initialzier
    init?(key: String) {
    guard key.count == kCCKeySizeAES128 || key.count == kCCKeySizeAES256, let keyData = key.data(using: .utf8) else {
    debugPrint("Error: Failed to set a key.")
    return nil
    }


    self.key = keyData

    }


    // MARK: - Function
    // MARK: Public
    func encrypt(string: String) -> Data? {

    let iv = randomGenerateBytes(count: 16)!

    let cryptData = crypt(data: string.data(using: .utf8), iv: iv, option: CCOperation(kCCEncrypt))!

    var hmac = Data(count: 32)
    cryptData.withUnsafeBytes { v in
    hmac.withUnsafeMutableBytes { res in
    key.withUnsafeBytes { k in
    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), k.baseAddress!, key.count, v.baseAddress!, cryptData.count, res.baseAddress!)
    }
    }
    }

    let messageData = NSMutableData()
    messageData.append(iv)
    messageData.append(cryptData)
    messageData.append(hmac)

    return messageData as Data
    }

    func decrypt(data: Data) -> String? {
    //验证数据
    let ivByteData = data.subdata(in: 0..<16)

    let contentByteData = data.subdata(in: 16..<(data.count - 32))

    let serverHmacData = data.subdata(in: (data.count - 32)..<data.count)
    print(data.count)


    var hmac = Data(count: 32)
    contentByteData.withUnsafeBytes { v in
    hmac.withUnsafeMutableBytes { res in
    key.withUnsafeBytes { k in
    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), k.baseAddress!, key.count, v.baseAddress!, contentByteData.count, res.baseAddress!)
    }
    }
    }

    if (serverHmacData == hmac) {
    let decryptedData = crypt(data: contentByteData, iv: ivByteData, option: CCOperation(kCCDecrypt))
    return String(bytes: decryptedData!, encoding: .utf8)
    } else {
    print("HMac 不一致")
    return nil;
    }


    }

    func crypt(data: Data?, iv: Data, option: CCOperation) -> Data? {
    guard let data = data else { return nil }

    let cryptLength = data.count + kCCBlockSizeAES128*2
    var cryptData = Data(count: cryptLength)

    let keyLength = key.count
    let options = CCOptions(kCCOptionPKCS7Padding)

    var bytesLength = Int(0)

    let status = cryptData.withUnsafeMutableBytes { cryptBytes in
    data.withUnsafeBytes { dataBytes in
    iv.withUnsafeBytes { ivBytes in
    key.withUnsafeBytes { keyBytes in
    CCCrypt(option, CCAlgorithm(kCCAlgorithmAES128), options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, cryptLength, &bytesLength)
    }
    }
    }
    }

    guard UInt32(status) == UInt32(kCCSuccess) else {
    debugPrint("Error: Failed to crypt data. Status \(status)")
    return nil
    }

    cryptData.removeSubrange(bytesLength..<cryptData.count)

    return cryptData
    }


    func randomGenerateBytes(count: Int) -> Data? {
    let bytes = UnsafeMutableRawPointer.allocate(byteCount: count, alignment: 1)
    defer { bytes.deallocate() }
    let status = CCRandomGenerateBytes(bytes, count)
    guard status == kCCSuccess else { return nil }
    return Data(bytes: bytes, count: count)
    }
    }

    ```
    @DeweyReed 今天试了一下 paging + room,通过 onZeroItemsLoaded 初始化数据,onItemAtEndLoaded 拉取后面的数据,测试基本功能可用,但是 onItemAtFrontLoaded 数据会有问题,onItemAtFrontLoaded 开始就会执行,而且 RecyclerView 定位到 onItemAtFrontLoaded 的第一条数据,而不是 onZeroItemsLoaded 的第一条数据。不知道是不是我对 PagedList.BoundaryCallback 理解不对,还是有别的方法?
    @DeweyReed 用 paging 刷新时也会卡一下的,感觉是靠 SCROLL_STATE_IDLE 触发的加载数据,没有 onScrolled 里做的加载顺滑
    在 AppTheme 里加了个配置 <item name="android:fontFamily">miui</item> 在小米手机上实现了跟微信一样的效果
    但是在华为手机上会崩溃。xml 文件里似乎是不能判断机型,全局字体有没有办法可以通过代码配置?
    @wowbaby 安卓端没有这个问题,证书验证逻辑不一样?
    @wowbaby 是的,用的 let's encrypt,你后续换的什么证书?
    不太可能是后端问题,iOS 端配置好 charles 的代理,请求就正常了。charles 要安装个证书在手机上,这部分原理不是很清楚,怀疑是不是减少了证书验证环节,证书验证在电脑上的 charles 上进行了。
    服务器端 nginx 收到请求也有延迟,nginx 的日志在客户端启动后约 3s 打印出来
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1216 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:33 · PVG 02:33 · LAX 11:33 · JFK 14:33
    ♥ Do have faith in what you're doing.