Skip to content

Latest commit

 

History

History
54 lines (45 loc) · 3.69 KB

针对项目的问题.md

File metadata and controls

54 lines (45 loc) · 3.69 KB

针对项目的问题

礼物相关

  • 普通礼物是采用的什么方案?如果是序列帧,那么帧率是多少?每张图片多大?
    采用的是序列帧的方案,FPS设定为8,图片大小是700x450。

  • 一个礼物压缩包是多大?
    这个根据礼物的动画帧数的多少而不同。

  • 如果收到礼物时,资源还没有下载完毕,你们项目中是如何处理的?
    在这种情况下,会去下载这个礼物的资源,优先级设为高。等下载完成后再播放。

  • 你知道哪些动图格式?
    Gif: 致命的缺点是,它通常只支持256色索引颜色,这导致它只能通过抖动,差值等方式模拟较多丰富的颜色;它的alpha通常只有1bit,这意味着一个像素只能是完全透明或者完全不透明。
    BPG: 一个移动端比较冷门的格式,压缩比很高,但是效率是硬伤。在所有的格式比较中,解码速度基本只有别的格式的1/2到1/10,基本不能用到礼物这种需要及时显示的需求上。
    APNG: PNG的位图动画扩展,但未获得PNG组织官方认可。虽然有三方库可以解决播放的问题,但是它的压缩效率不高,文件体积较大。
    WebP: 这个可以用在直播的礼物方案中。
    可以查看文章视频直播之webp礼物解决方案,了解更多。

项目中在网络通信环节用了哪些安全技术?

https + AES加密。
虽然SSL通信被认为是相当安全了,但是中间人攻击(man-in-the-middle attack)还是会带来威胁。为了万无一失,就需要用到SSL Pinning技术。使用这个技术,可以保证一个APP是在和期望的服务器在进行通信。在实现的时候,要求将服务器的SSL证书,打包进APP的bundle中。

下面给出使用原生的NSURLSession进行网络通信时的方案。著名的网络库AFNetworking也支持SSL Pinning,使用起来更是简单。了解详情可以看下这篇文章

NSURLSession
-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {

    // Get remote certificate
    SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
    SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0);

    // Set SSL policies for domain name check
    NSMutableArray *policies = [NSMutableArray array];
    [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)challenge.protectionSpace.host)];
    SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies);

    // Evaluate server certificate
    SecTrustResultType result;
    SecTrustEvaluate(serverTrust, &result);
    BOOL certificateIsValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed);

    // Get local and remote cert data
    NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate));
    NSString *pathToCert = [[NSBundle mainBundle]pathForResource:@"github.com" ofType:@"cer"];
    NSData *localCertificate = [NSData dataWithContentsOfFile:pathToCert];

    // The pinnning check
    if ([remoteCertificateData isEqualToData:localCertificate] && certificateIsValid) {
        NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
        completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
    } else {
        completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, NULL);
    }
}