有时遇到一个小问题,但不知道解决方法,就晕死。最近就遇到了两个,开始头大,后来解决了,其实发现也没那么复杂,不过还是记录下来,以便以后遇到这样的问题,可以有所参考。
第一个问题,就是前段时间做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];
}
[[iPhonePlayer sharedIVMallPlayer]IVMallPlayerInit:@"nil":@"nil"];
然后方法里面有个
NSString *strURL=[NSString stringWithContentsOfURL:[NSURL URLWithString:str] encoding:NSUTF8StringEncoding error:nil];
ret=PRODRM_Init();
当然我在开发时没什么问题,但是当我域名写错了时,开发也没什么问题,就是界面上未显示数据吧,但是当我打包后,安装在手机上时,却老是崩溃,刚开始时,让我百思不得其解,后来看了下手机的崩溃日志后,才发现是未完成创建界面便崩溃了,具体原因是,因为前面两条语句,域名写错,而两者又是同步,造成长时间阻塞,最后导致其被系统杀死,造成崩溃的假象。改了下便好了。dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString *strURL=[NSString stringWithContentsOfURL:[NSURL URLWithString:str] encoding:NSUTF8StringEncoding error:nil];
ret=PRODRM_Init();
dispatch_async(dispatch_get_main_queue(), ^{
if (strURL==nil) {
NSLog(@"nil");
}else{
NSDictionary *result=[NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];
NSLog(@"aio%@",result);
}
});