项目中遇到的问题及解决思路

来源:互联网 发布:炉石传说淘宝刷金头 编辑:程序博客网 时间:2024/06/02 22:41

有时遇到一个小问题,但不知道解决方法,就晕死。最近就遇到了两个,开始头大,后来解决了,其实发现也没那么复杂,不过还是记录下来,以便以后遇到这样的问题,可以有所参考。

   第一个问题,就是前段时间做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:[str dataUsingEncoding:NSUTF8StringEncoding]options:NSJSONReadingMutableContainerserror:nil];

               NSLog(@"aio%@",result);

            }

            

        

        });

改成了上述语句,便不会发生崩溃现象了。





0 0