Egret社区

发布ios Native项目

2019-12-16 10:45
2112
通过Egret引擎制作的游戏,可以发布到多个平台。具体如图:
图片 1.png
发布前的准备工作:
工于利其事必先利器,首先我们需要看下需要哪些环境。
  • 安装最新版的Launcher
  • 引擎版本需要在5.1.6及以上;
  • Xcode(建议9.0及以上);

发布项目
  • 在launcher的项目面板找到需要发布iOS工程的Egret项目,点击发布设置
    p2.png
  • 点击左侧的iOS按钮,在右侧页面中,输入应用名称、应用包名,点击确定。

p3.png
file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/p3.png?lastModify=1576464120
  • 如果勾选使用Hybrid方案,该项目会使用 iOS 系统的 webview 来运行游戏

Native项目
用Xcode打开发布好的ios项目。
p4.png
file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/p4.png?lastModify=1576464120
launcher创建的默认工程会将游戏资源放到assets/game目录下,这时会从assets目录加载游戏。如果不需要将游戏放到应用里,请删除assets/game目录。
打开AppDelegate.mm文件,在(BOOL)applicationUIApplication *)application didFinishLaunchingWithOptionsNSDictionary *)launchOptions 函数中,你会看到以下设置。
在ios原生项目中的一些设置设置游戏地址

  1. NSString* gameUrl = @"http://175.24.139.24/mygame/game/index.html";

  2. ...

  3. [_native startGame:gameUrl];<b>设置一些调试以及其他参数</b>    //实例化一个原生对象
  4.     _native = [[EgretNativeIOS alloc] init];
  5.     //设置一些配置参数
  6.     _native.config.showFPS = true;//控制FPS面板的显示
  7.     _native.config.fpsLogTime = 30;//控制log在屏幕上的显示时间 -1 永久显示
  8.     _native.config.disableNativeRender = false;//是否禁用核心渲染驱动
  9.     _native.config.clearCache = false;//是否清理缓存
复制代码

属性说明:
  • showFPS 是否显示fps面板
  • fpsLogTime log在屏幕上停留时间,单位是秒,-1为永久显示
  • disableNativeRender 是否禁用原生渲染加速
  • clearCache 是否清理缓存,设置为true时每次启动都会清理缓存,方便调试
  • loadingTimeout 加载index的超时时间。默认为0,不设置超时
  • preloadPath 设置预加载目录,详见“热更新方案说明”
  • immersiveMode 开启沉浸模式,默认不占用安全区(刘海区域)。(0.1.16添加,部分机型需要用户手动在设置中开启”应用全屏显示”)
  • useCutout 占用安全区。(0.1.16添加,如果没有开启沉浸模式,该设置无效;部分机型横屏模式不能占用安全区)

其他设置
解决国行手机首次启动需要请求网络权限的问题
  • 模版中通过[_native setNetworkStatusChangeCallback:]监听网络状态,有网络连接时才启动游戏。
    1. //解决国行手机首次启动需要请求网络权限的问题。
    2.     NSString* networkState = [_native getNetworkState];
    3.     if ([networkState isEqualToString:@"NotReachable"]) {
    4.         __block EgretNativeIOS* native = _native;
    5.       //通过[_native setNetworkStatusChangeCallback:]监听网络状态,有网络连接时才启动游戏。
    6.         [_native setNetworkStatusChangeCallback:^(NSString* state) {
    7.             if (![state isEqualToString:@"NotReachable"]) {
    8.                 dispatch_async(dispatch_get_main_queue(), ^{
    9.                     [native startGame:gameUrl];
    10.                 });
    11.             }
    12.         }];
    复制代码

    • 访问相册权限的问题
      info-plist.jpg
      • 为了支持保存截图到本地的功能,模版中默认注册了访问相册的权限,如不需要可以从info.plist中删除。
      • 模版中默认加入的权限并无对应的文字,若要发布至AppStore中,必须在权限后添加任意提醒用户的文字才能通过审核,如“允许Egret Native访问您的相册?”

      file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/info-plist.jpg?lastModify=1576464120
      • Privacy - Photo Library Usage Description是IOS11.0版本之前的相册读写权限
      • Privacy - Photo Library Additions Usage Description是IOS11.0版本之后的相册写权限,读权限系统已经默认开放

      • 没加文字之前与添加文字之后

      file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/PhotoAlbumPrivacy.png?lastModify=1576464120file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/PhotoAdditionPrivacy.png?lastModify=1576464120
            PhotoAdditionPrivacy.png PhotoAlbumPrivacy.png PhotoAdditionPrivacyWithString.png PhotoAlbumPrivacyWithString.png
      file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/PhotoAlbumPrivacyWithString.png?lastModify=1576464120file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/PhotoAdditionPrivacyWithString.png?lastModify=1576464120



js与Native通信 js通信.png
file:///Users/wangqianqian/Desktop/2019-12/%E6%96%87%E6%A1%A3/img/js%E9%80%9A%E4%BF%A1.png?lastModify=1576464120
注册js中可以调用的函数A
  1. [_native setExternalInterface:@"A" Callback:^(NSString* message) {
  2.          NSString* str = @"Native get message: ---------";
  3.          str = [str stringByAppendingString:message];
  4.          NSLog(@"%@", str);
  5.     }];
复制代码

在TS中调用函数A
  1. //在js中调用native的函数
  2. egret.ExternalInterface.call("A","测试js与原生通信,这是js发给原生的消息");
复制代码

注册Native中可以调用的函数B
  1. egret.ExternalInterface.addCallback("B",(str:string)=>{
  2.          console.log("js中注册,原生中调用"+ str );         
  3. })
复制代码

在Native中调用函数B
  1. [support callExternalInterface:@"B" Value:str];<blockquote><div align="left">只有通过setExternalInterface注册的原生函数,才能在JS中通过call调用。只有通过addCallback注册的JS函数,才能在原生中通过callExternalInterface调用。</div>
复制代码

通信实例应用---运行时error事件与state事件处理方法
在Js中程序加载进行到哪一步,如何在Native中获取,那么我们就需要利用js与原生通信的方式进行了。
  • runtime运行中各个事件的说明
    HTML5项目运行,首先加载HTML,然后是JS,最后JS运行。每一步都有两个状态,成功(onState)或者失败(onError)

[td]
流程
事件消息
事件类型
事件意义
index加载{"error":"load"}
onError
index加载失败
{"state”:”starting”}
onState
index加载成功
js加载{"error":"start"}
onError
js加载失败
{"state”:”running”}
onState
js加载成功
js运行中{"error”:”stopRunning”}
onError
js崩溃
2.监听error事件和state事件的方法 const static NSString* appError = @"error";
  1. // 加载首页失败
  2. const static NSString* errorIndexLoadFailed = @"load";
  3. // 启动引擎失败
  4. const static NSString* errorJSLoadFailed = @"start";
  5. // 引擎停止运行
  6. const static NSString* errorJSCorrupted = @"stopRunning";
  7. const static NSString* appState = @"state";
  8. // 正在启动引擎
  9. const static NSString* stateEngineStarted = @"starting";
  10. // 引擎正在运行
  11. const static NSString* stateEngineRunning = @"running";
复制代码

注册对error事件的监听,在函数setExternalInterfaces中:
  1. <blockquote>- (void)setExternalInterfaces {
复制代码

注册对state事件的监听,在函数setExternalInterfaces中:
  1. <blockquote>- (void)setExternalInterfaces {
复制代码

在Native中注册了 onState函数与onError函数,在js中调用,这些不需要我们手动去写,引擎已经在runtime中调用好了。
3. 处理具体事件
  • 处理具体error事件

  1. <blockquote>// according to the error msg, do different action
复制代码

  • 处理具体state事件

  1. <blockquote>// according to the state msg, do different action
复制代码



添加Loading界面
在游戏启动的时候,我们很多时候会展示自己公司的logo或者产品的logo或者其他。也就是一张图片。
打开Loading界面
当app启动之后需要显示Loading界面,在AppDelegate的didFinishLaunchingWithOptions函数中调用函数showLoadingView
  1. <blockquote>@implementation AppDelegate {
复制代码

关闭Loading界面
收到{"state”:”running”}消息后,调用函数hideLoadingView
  1. <blockquote>// according to the state msg, do different action
复制代码
  1. - (void)hideLoadingView {
  2.     [_imageView removeFromSuperview];
  3. }
复制代码

OK,学习笔记先到这里。



分享到 :
0 人收藏

2 个回复

倒序浏览
nofastfat  圆转纯熟 | 2019-12-18 14:21:50
这样打的ios包,可以直接上app store吗
fhbdesrhrth  圆转纯熟 | 2019-12-23 12:08:47
啥时候把runtime开源一下呀,你们这一堆坑别人还没法填
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部