京公网安备 11010802034615号
经营许可证编号:京B2-20210330
项目中遇到的问题及解决思路
有时遇到一个小问题,但不知道解决方法,就晕死。最近就遇到了两个,开始头大,后来解决了,其实发现也没那么复杂,不过还是记录下来,以便以后遇到这样的问题,可以有所参考。
第一个问题,就是前段时间做DRM做视频的解密,就遇到了一个棘手的问题。我们DRM的流程大体是这样的,就是说,安装该APP时,终端会为DRM提供一个特定的序列号,DRM就会注册这个序列号,当发现这个序列号以前没有注册过后,第一次调用初始化接口后,DRM就会为这个应用写一段数据,当下次启动时,再次初始化时,DRM端就会检测该序列号是否被注册过,如果不是,当然会写数据,但是如果是,就会再原来写数据的位置读数据。如果读到的话,就会初始化成功,然后就可以拿key播放了。
那么,现在问题就来了,大家知道,我们写数据的时候,一般都是获得应用底下的路径。然后往里面写数据,比如,我原来是这么写的
//写数据。
//存储到应用的私有文件中
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *documentsDirectory = [paths objectAtIndex:0];
// NSLog(@"document paths = %@",documentsDirectory);
// NSString *fileName = [@"drmLibFile" stringByAppendingFormat:@"%hhu",BlockID];
// NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
// NSLog(@"%@",filePath);
// NSFileManager *fileManager = [NSFileManager defaultManager];
// if ([fileManager fileExistsAtPath:filePath]) {
// [fileManager createFileAtPath:filePath contents:nil attributes:nil];
// }
//
// NSData *fileData = [NSData dataWithBytes:Ptr length:Size];
// [fileData writeToFile:filePath atomically:YES];
读数据
//从应用保存的私有文件中读取
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *documentsDirectory = [paths objectAtIndex:0];
// NSLog(@"document paths = %@",documentsDirectory);
// NSString *fileName = [@"drmLibFile" stringByAppendingFormat:@"%hhu",BlockID];
// NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
// NSLog(@"%@",filePath);
// NSDataReadingOptions *readOption = nil;
// NSError *error = nil;
// NSData *getFileData = [NSData dataWithContentsOfFile:filePath options:&readOption error:&error];
//
// if (getFileData == nil) {
// NSLog(@"error = %@",error);
// return 0;
// }
//
//// NSLog(@"Data from file = %@",getFileData);
//
// //将文件中的数据给移植库
// if (getFileData.length > 0) {
// printf("getfileData length = %d",getFileData.length);
// memcpy(Ptr, getFileData.bytes, getFileData.length);
// }else{
//
// NSLog(@"getFileData.length == 0");
//
// }
好,现在问题来了,假设我现在把这个应用删掉啊,就是把DRM写在应用里的数据也一块给删掉了,但是DRM又不知道我把应用给删掉了。所以下次我再次安装这个应用时,就会发现,这个应用的加密播放不能播放了。原因很简单,我把DRM的数据给删掉了,但是现在DRM初始化时,发现这个序列号被注册过了,就会不会继续往这个应用里面写数据,而是会直接读数据,而数据早已经被我删掉了,因此会初始化失败,此时,就不可以播放加密视频了。当时想了好久,最后发现只要解决一个问题就行了,就是删除应用时,不应该删除DRM删除的私有数据。
这里就用到了KeyChain前几篇博客写过它,挺好用的,我改过后,就发现,删除应用后,下次安装应用时仍然可以播放加密视频。这就说明DRM私有数据未被删除啊、
然后是第二个问题啊,是原来给香港HKBN写的项目,在用Xcode6.1编译打包后,他们测试发现,5s以上会发生白屏。这个程序不是我写的啊,是以前的同事写的,而且还是好几年前写的,一直没有改过。看起来麻烦,但是还是硬着头皮看了一遍,初步判定问题,应该是创建界面时出现了问题,但是,我看它写的代码本身是不存在问题的,只要创建界面,就会loading,因为是xib,但是,就是没有loading,直接白屏。
后来突然想到了一个方法,既然是创建界面出现了问题,是不是我可以再每次程序从后台到前台时,重新加载一次界面不就可以了吗
然后在appdelegate里面在这个函数,重新创建和加载界面就可以了。
- (void)applicationWillEnterForeground:(UIApplication*)application {
/*
Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background.
*/
NSLog(@"enterForeground");
[selfreloadTabPage];
[selfcreateInterface];
}
[[iPhonePlayersharedIVMallPlayer]IVMallPlayerInit:@"nil":@"nil"];
然后方法里面有个
NSString*strURL=[NSStringstringWithContentsOfURL:[NSURLURLWithString:str]encoding:NSUTF8StringEncodingerror:nil];
ret=PRODRM_Init();
当然我在开发时没什么问题,但是当我域名写错了时,开发也没什么问题,就是界面上未显示数据吧,但是当我打包后,安装在手机上时,却老是崩溃,刚开始时,让我百思不得其解,后来看了下手机的崩溃日志后,才发现是未完成创建界面便崩溃了,具体原因是,因为前面两条语句,域名写错,而两者又是同步,造成长时间阻塞,最后导致其被系统杀死,造成崩溃的假象。改了下便好了。
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSString*strURL=[NSStringstringWithContentsOfURL:[NSURLURLWithString:str]encoding:NSUTF8StringEncodingerror:nil];
ret=PRODRM_Init();
dispatch_async(dispatch_get_main_queue(), ^{
if(strURL==nil) {
NSLog(@"nil");
}else{
NSDictionary*result=[NSJSONSerializationJSONObjectWithData:[strdataUsingEncoding:NSUTF8StringEncoding]options:NSJSONReadingMutableContainerserror:nil];
NSLog(@"aio%@",result);
}
});
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数字经济飞速发展的今天,数据分析已从“辅助工具”升级为“核心竞争力”,渗透到商业、科技、民生、金融等各个领域。无论是全 ...
2026-03-11上市公司财务报表是反映企业经营状况、盈利能力、偿债能力的核心数据载体,是投资者决策、研究者分析、从业者复盘的重要依据。16 ...
2026-03-11数字化浪潮下,数据已成为企业生存发展的核心资产,而数据思维,正是CDA(Certified Data Analyst)数据分析师解锁数据价值、赋 ...
2026-03-11线性回归是数据分析中最常用的预测与关联分析方法,广泛应用于销售额预测、风险评估、趋势分析等场景(如前文销售额预测中的多元 ...
2026-03-10在SQL Server安装与配置的实操中,“服务名无效”是最令初学者头疼的高频问题之一。无论是在命令行执行net start启动服务、通过S ...
2026-03-10在数据驱动业务的当下,CDA(Certified Data Analyst)数据分析师的核心价值,不仅在于解读数据,更在于搭建一套科学、可落地的 ...
2026-03-10在企业经营决策中,销售额预测是核心环节之一——无论是库存备货、营销预算制定、产能规划,还是战略布局,都需要基于精准的销售 ...
2026-03-09金融数据分析的核心价值,是通过挖掘数据规律、识别风险、捕捉机会,为投资决策、风险控制、业务优化提供精准支撑——而这一切的 ...
2026-03-09在数据驱动决策的时代,CDA(Certified Data Analyst)数据分析师的核心工作,是通过数据解读业务、支撑决策,而指标与指标体系 ...
2026-03-09在数据处理的全流程中,数据呈现与数据分析是两个紧密关联却截然不同的核心环节。无论是科研数据整理、企业业务复盘,还是日常数 ...
2026-03-06在数据分析、数据预处理场景中,dat文件是一种常见的二进制或文本格式数据文件,广泛应用于科研数据、工程数据、传感器数据等领 ...
2026-03-06在数据驱动决策的时代,CDA(Certified Data Analyst)数据分析师的核心价值,早已超越单纯的数据清洗与统计分析,而是通过数据 ...
2026-03-06在教学管理、培训数据统计、课程体系搭建等场景中,经常需要对课时数据进行排序并实现累加计算——比如,按课程章节排序,累加各 ...
2026-03-05在数据分析场景中,环比是衡量数据短期波动的核心指标——它通过对比“当前周期与上一个相邻周期”的数据,直观反映指标的月度、 ...
2026-03-05数据治理是数字化时代企业实现数据价值最大化的核心前提,而CDA(Certified Data Analyst)数据分析师作为数据全生命周期的核心 ...
2026-03-05在实验检测、质量控制、科研验证等场景中,“方法验证”是确保检测/分析结果可靠、可复用的核心环节——无论是新开发的检测方法 ...
2026-03-04在数据分析、科研实验、办公统计等场景中,我们常常需要对比两组数据的整体差异——比如两种营销策略的销售额差异、两种实验方案 ...
2026-03-04在数字化转型进入深水区的今天,企业对数据的依赖程度日益加深,而数据治理体系则是企业实现数据规范化、高质量化、价值化的核心 ...
2026-03-04在深度学习,尤其是卷积神经网络(CNN)的实操中,转置卷积(Transposed Convolution)是一个高频应用的操作——它核心用于实现 ...
2026-03-03在日常办公、数据分析、金融理财、科研统计等场景中,我们经常需要计算“平均值”来概括一组数据的整体水平——比如计算月度平均 ...
2026-03-03