3

我正在开发一个我想为 iPhone 3.0、iPhone 4.0 部署的应用程序,它可以在 iPad 上以模拟模式运行。

我正在使用 XCode 3.2.3 进行开发,并且我有要播放的视频。我想使用MPMoviePlayerViewController>= 3.2 和MPMoviePlayerController< 3.2。

如果我使用

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) 
{
    MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];

   ...
}

带有 OS 3.0 的 iPhone 是否能够处理它不知道的类?

将代码放在__IPHONE_OS_VERSION_MIN_REQUIRED > 30200ifelse 块中好吗?像这样:

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
   MPMoviePlayerViewController* moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
    ...
}

__IPHONE_OS_VERSION_MIN_REQUIRED真正的作用是什么?在我看来,它只是重复了我为项目设置的设置:min=3.0

4

2 回答 2

2

你是对的__IPHONE_OS_VERSION_MIN_REQUIRED:这就是你在项目中投入的任何东西。因此,您使用的任何#if语句都将在编译时进行评估,这不是您想要的。

相反,做你最初做的事情,但有一些小的变化,比如:

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
    id moviePlayerViewController = [[mplayerControllerClass alloc] initWithContentURL:movieUrl];
    ...
}

关键是您不应该单独使用MPMoviePlayerViewController,即使您已经验证它应该存在(无论如何,我认为它不会正确编译/链接)。但是,是的,这在装有 OS 3.0 的设备上可以正常工作。(例如,请参阅 Apple 的 OpenGL ES 示例,了解与 . 相同的内容CADisplayLink。)

于 2010-07-27T19:00:18.950 回答
2

在您的第一个片段中,您正在创建一个基于NSString. 这是可能的,因为您弱链接了您的框架,因此旧版本的操作系统不会在这种情况下崩溃。这是在运行时完成的,并将按您的预期工作。

另一方面,第二个片段使用预编译器条件。这不会产生任何影响,因为为了让您使用MPMoviePlayerViewController,您将使用 4.0 的 Base SDK,因此#if始终是正确的。

底线:弱链接是你想要的,继续你的第一个片段,并确保框架弱链接的。

于 2010-07-27T19:03:39.740 回答