【问题标题】:iphone - running sdk 4.0.1 on Iphone 3.1iphone - 在 Iphone 3.1 上运行 sdk 4.0.1
【发布时间】:2010-08-02 10:01:59
【问题描述】:

我正在使用 iPhone SDK 4.0.1 创建 iPhone 应用程序 我的应用程序中有以下与来自媒体播放器的通知相关的代码行

[[NSNotificationCenter defaultCenter]
        addObserver:self
           selector:@selector(moviePreloadDidFinish:)
               name:MPMoviePlayerLoadStateDidChangeNotification
             object:m_player];

在构建应用程序时,我将产品定位到 iphone 3.1 它的构建良好并且在 iphone 4.0 设备上运行良好 但是在 iphone 3.1.3 操作系统上运行时,应用程序本身崩溃了。它给出以下信息:

dyld: Symbol not found: _MPMoviePlayerLoadStateDidChangeNotification

引用自:/var/mobile/Applications/8572A1FF-488D-4F97-93DD-C06DBAD23B5B/OrangeDemo.app/OrangeDemo 预期在:/System/Library/Frameworks/MediaPlayer.framework/MediaPlayer 在 /var/mobile/Applications/8572A1FF-488D-4F97-93DD-C06DBAD23B5B/OrangeDemo.app/OrangeDemo

我怎样才能避免这个错误。

【问题讨论】:

    标签: iphone mpmovieplayer


    【解决方案1】:

    MPMoviePlayerLoadStateDidChangeNotification 在 iOS 3.1.3 上不存在。您需要通过弱链接检测它的存在:

    if (&MPMoviePlayerLoadStateDidChangeNotification != NULL) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePreloadDidFinish:) name:MPMoviePlayerLoadStateDidChangeNotification object:m_player];
    }
    

    在 iOS 3.2 之前,您可以使用 MPMoviePlayerContentPreloadDidFinishNotification 来检测电影何时完成预加载。如果您链接到较新的 SDK,该符号可能会生成弃用警告(就像您使用 MPMoviePlayerLoadStateDidChangeNotification 时一样。)

    注意符号检查的语法:您必须NULL进行比较,而不是简单地将指针用作布尔值(即if (MPMoviePlayerLoadStateDidChangeNotification)if (&MPMoviePlayerLoadStateDidChangeNotification)。)编译器和动态加载器无法检测和正确处理这些表单,如果检测到它们,将在 3.1.3 上崩溃。

    【讨论】:

    • 稍微澄清一下,您在这里描述的是如何检测方法的存在。他仍然需要通过在 Xcode 中找到应用程序目标、检查它并转到 General 选项卡来弱链接。该选项卡的底部应该是一个框架列表,其中有一列用于类型。将 MediaPlayer 的类型从必需更改为弱。
    • 你应该不需要切换框架的类型,因为它从 iOS 2.0 开始就包含了。
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多