-
普通礼物是采用的什么方案?如果是序列帧,那么帧率是多少?每张图片多大?
采用的是序列帧的方案,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,使用起来更是简单。了解详情可以看下这篇文章
-(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);
}
}