cocos2d-x老项目适配ios13提示 MPMoviePlayerController 替换为 AVPlayerViewController

在将使用cocos2d-x-3.10的老项目升级到iOS13时,遇到因MPMoviePlayerController被弃用而引发的闪退问题。尝试更新cocos2d-x版本、升级项目至v4.x以及自定义UIVideoPlayer类来解决。最终通过修改UIVideoPlayer.h和UIVideoPlayer-ios.mm文件,引入AVKit和CoreMedia框架,成功适配iOS13。
摘要由CSDN通过智能技术生成

问题描述:

        老项目用的cocos2d-x-3.10版本,最近为了提神ios,把xcode升级到了最新的11.5来适配ios13,顺便把系统也升级到了10.15。其中遇到了很多问题,比如打包脚本报错,提示各种找不到、一些软件的兼容问题等。总结就是一句话:不作不死。言归正传,解决了脚本报错等诸多问题之后,终于打出了测试ipa包。迫不及待的安装、测试,惊喜不过3秒,闪退,闪退,闪退!只能用xcode连真机调试,看到了报错信息,大概意思就是 ios13的sdk已经不再支持 MPMoviePlayerController 要用 AVKit 中的 AVPlayerViewController替换。我以为只要替换一下这个方法就ok了,事实证明我还是 so young so simple。下面介绍我的踏坑之旅。

尝试解决方法1

首先我想到,既然是cocos引擎的问题,那么去cocos官网看看版本信息吧,说不定已经解决这个问题了呢。没想到cocos官网还真的有最新的版本并且已经解决了这个问题。感叹幸运之神的眷顾,把最新的cocos2d-x-4.0下载下来,替换原来的3.10岂不是能完美解决。现实总是在你最开心的时候给你一耳刮子,下载、解压、打开目录、查找、查找、查找。。。。当时真的以为自己出现了错觉,我心心念念的 cocos2d_libs.xcodeproj coco2d_lua_bindings.xcodeproj 最终还是没找到。MPMoviePlayerController 方法在 libcocos2d ios.a中,libcocos2d ios.a 是 cocos2d_libs.xcodeproj工程编译得来。工程都没当然也就没办法编译出新的 .a 文件。这条路就此中断。

尝试解决方法2

cocos2d-x-4.0的开发文件中提到,可以把v3.x 版本升级到v4.x。https://docs.cocos2d-x.org/cocos2d-x/v4/en/upgradeGuide/ 然后就开始了新一轮的折腾,安装cmake、改makelist、编译,后面还要更改工程里的好多设置,比如连接第三方库的连接路径等等,反正看到最后我就放弃了,本来就急着出提审包,没有这么多时间改、测试这些东西。既然升级都这么繁琐,重建一个v4的项目,然后把老的资源整合进去也就更不可能实现了。

尝试解决方法3

这个方法受到方法2中构建cocos2d_libs.xcodeproj中受到启发。虽然方法2中构建出的cocos2d_libs.xcodeproj工程编译出的 .a 文件中的类引用路径不同,但是新的4.0引擎有 AVPlayerViewController 的实现方法,最终找这两个版本播放视频的类名都是UIVideoPlayer。想出的解决方法是,用4.0的UIVideoPlayer替换3.10中的UIVideoPlayer,然后用整合后的cocos2d_libs.xcodeproj就可以了。说白了就是在旧版本中的cocos2d_libs.xcodeproj中的UIVideoPlayer类,参考新的版本的UIVideoPlayer改一下实现方式。

最终解决过程:

1. 修改两个文件 UIVideoPlayer.h和UIVideoPlayer-ios.mm

2. 项目中引入两个库 AVKit.framework和CoreMedia.framework

3. 这次提审不知道ios13是不是还会有别的要适配的地方,目前只遇到了这个问题,等待结果中。。。

4. 以前白嫖了很多人的解决问题的帖子,这次也把自己的体会分享一下,不足之处,请留言指正。

以下两个文件的代码,如需自取

UIVideoPlayer.h

/****************************************************************************
 Copyright (c) 2014-2016 Chukong Technologies Inc.

 http://www.cocos2d-x.org

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 ****************************************************************************/

#ifndef __COCOS2D_UI_VIDEOWEIGTH_H_
#define __COCOS2D_UI_VIDEOWEIGTH_H_

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) && !defined(CC_PLATFORM_OS_TVOS)

#include "ui/UIWidget.h"

/**
 * @addtogroup ui
 * @{
 */

NS_CC_BEGIN
namespace experimental{
    namespace ui{

        /**
         * @class VideoPlayer
         * @brief Displays a video file.
         *
         * @note VideoPlayer displays a video file base on system widget.
         * It's mean VideoPlayer displays a video file above all graphical elements of cocos2d-x.
         * @js NA
         */
        class VideoPlayer : public cocos2d::ui::Widget
        {
        public:
            /**
             * Videoplayer play event type.
             */
            enum class EventType
            {
                PLAYING = 0,
                PAUSED,
                STOPPED,
                COMPLETED,
                ERROR
            };
            
            /**
             * Styles of how the the video player is presented
             * For now only used on iOS to use either MPMovieControlStyleEmbedded (DEFAULT) or
             * MPMovieControlStyleNone (NONE)
             */
            enum class StyleType
            {
                DEFAULT = 0,
                NONE
            };

            /**
             * A callback which will be called after specific VideoPlayer event happens.
             */
            typedef std::function<void(Ref*,VideoPlayer::EventType)> ccVideoPlayerCallback;

            /**
             *Static create method for instancing a VideoPlayer.
             */
            CREATE_FUNC(VideoPlayer);

            /**
             * Sets a file path as a video source for VideoPlayer.
             */
            virtual void setFileName(const
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值