网名网名关于爱的特殊符号号

IOS欢迎界面Launch Screen动态加载广告
  当我们打开一款应用程序的时候,首先映入眼帘的往往并不是程序的主界面,而是经过精心设计的欢迎界面,这个界面通常会停留几秒钟,然后消失。看似很平常的一个小小的欢迎界面,其实还大有讲究。
一、为什么会出现欢迎界面?
  程序在启动的过程中需要消耗一些时间,那么在加载出现主界面之前,会出现短暂的黑屏,这实在是很糟糕的一件事情,会给用户一个非常不好的体验。为了缓解用户等待过程中心理的不适与烦躁,欢迎界面闪亮登场了!
  用欢迎界面来替代黑屏的等待,可以有效的掩盖耗时阻塞的后台操作,还能向用户展示有效的信息,是非常好的一种过渡方案。但是有的程序把欢迎界面做成了广告版,浪费了用户更多的时间,让用户觉得厌烦,对程序本身功能也失去了兴趣,这种做法实在是很不明智。
二、欢迎界面的种类
  欢迎界面种类有很多,大致分为静态和动态两种。
  静态的欢迎界面通常比较简洁,一般会放置一张很精美的图片,可能是一张公司或者产品的宣传图,也可能是一张广告图,给我印象最深的是某聊天软件在生日当天打开,欢迎界面竟然是一张写着你名字的生日祝福的图片,让人感觉很温暖。
  动态的欢迎界面要更加炫酷精美,样式也更加丰富,有的是联网加载的广告,有的像一本很炫的书,可以滑动翻页,有的是一个小小的游戏,有的是美文配着美妙的音乐,还有的可能是一段有趣的动画。
三、欢迎界面使用LaunchImage
  针对7,苹果提供了LaunchImage来实现欢迎界面,开发的时候只需要将设计好对应尺寸的图片拖到对应的状态的位置即可。
  在IOS7,欢迎界面对应的尺寸分别为:
iphone 竖屏 640*960 640*1136
ipad 竖屏 768*48
ipad 横屏 8*1536
  IOS8出现之后,苹果推出了LaunchScreen.xib来做欢迎界面,如果还想通过LaunchImage来做欢迎界面,完美适配IOS7和IOS8,应该如何来做呢?
  首先,需要把LaunchScreen.xib删掉,否则IOS8时会自动调用它。然后找到Images.xcassets,点击下面的 + 号,选择New Launch Image,然后按照对应的要求放入相应尺寸图片即可,和之前操作完全一样。
四、欢迎界面使用LaunchScreen.xib
  Xcode6/IOS8新添加了许多功能,比如LaunchScreen.xib、Size Classes等。程序启动的时候,会自动调用LaunchScreen.xib,因此可以在这个xib上添加需要显示的控件,并添加约束,进行显示。
  如上图所示,当前欢迎界面包括中间的大标题,下面的公司信息等,和一张图片。因为上面的控件都是在Any w和Any h的情况下添加的约束,所以无论在哪种尺寸的设备上都可以适配。为了保证更完美的效果,xib中得图片我们可以使用Images.xcassets来设置,这样可以在不同设备的时候自动选择相应尺寸的图片,达到更好的效果。
  上面的LaunchScreen.xib是使用Xcode6创建项目自动生成的,如果不想使用自动生成的,也可以换成其他的xib,但是很遗憾,用于做欢迎界面的xib没法与View Controller连线,因此只能显示静态的事先摆好的界面。换xib可以在下图两个地方进行更换。
五、欢迎界面动态加载广告
  有许多应用程序在打开的时候,欢迎界面会加载一张连网获取的广告图片或者显示一组动画,这样的效果是如何做到的呢?下面给大家介绍一种简单的实现加载广告的方式。
  程序运行起来,欢迎界面之后,会进入AppDelegate,因此我们可以在application: didFinishLaunchingWithOptions:添加代码完成想要的效果。连网获取图片可以用第三方SDWebImage实现,所以需要先将第三方文件夹导入。因为显示广告的页面是在欢迎界面基础上显示的,因此可以直接利用LaunchScreen.xib中得view,在上面添加一个UIImageView显示图片,然后将其加在window上,并显示在最上层。广告图片显示之后,再将view移除掉,显示程序的主界面。代码如下所示:
#import &AppDelegate.h& #import &UIImageView+WebCache.h& @interface AppDelegate () @property (strong, nonatomic) UIView *lunchV @end @implementation AppDelegate @synthesize lunchV - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self.window makeKeyAndVisible]; lunchView = [[NSBundle mainBundle ]loadNibNamed:@&LaunchScreen& owner:nil options:nil][0]; lunchView.frame = CGRectMake(0, 0, self.window.screen.bounds.size.width, self.window.screen.bounds.size.height); [self.window addSubview:lunchView]; UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 50, 320, 300)]; NSString *str = @&/images/temp/logo.gif&; [imageV sd_setImageWithURL:[NSURL URLWithString:str] placeholderImage:[UIImage imageNamed:@&default1.jpg&]]; [lunchView addSubview:imageV]; [self.window bringSubviewToFront:lunchView]; [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(removeLun) userInfo:nil repeats:NO]; return YES; } -(void)removeLun { [lunchView removeFromSuperview]; }2920人阅读
cocos2d-x(39)
本文整理来自互联网~
会默认读取Resources内的Default.png作为开始画面
icon也是同样的自动读取Icon.png和Icon@2x.png(Retina模式)等
因此你只用替换这些文件即可
不想使用开始画面删除Default.png即可
同时将你的模拟器中的本应用删除 并在xcode内clean一下清除内存再重新运行程序 否则Default.png还有可能显示
你可以认为你需要为启动画面编写代码,然而Apple 让你可以非常简单地在Xcode中完成。不需要编写代码,你仅需要在Xcode中进行一些配置。&1.什么是启动画面(Splash Screen)?&启动画面是你在启动App的时候看到的第一个界面,通常,启动画面是覆盖整个屏幕的一张图片,在主屏幕装在完后隐藏。&启动画面的主要目的是让用户知道你的App正在装载,并且对用户介绍你的品牌。启动画面对哪些需要较长时间启动的Apps尤其重要。一般而言,启动画面是为了给用户更好的体验。&2.在你的App中添加启动画面&前面提到过,显示启动画面并不需要编写任何代码。iOS提供了一个内置的功能 - 启动图片。&在用户打开App时自动显示该图片,在App启动完成之后该图片自动消失。你可以在Xcode中进行简单设置启动画面,Xcode就可以负责后续事情了。&3.准备你的启动画面&我们知道iPhone 4/4S 支持更高的分辨率(也就是所谓的视网膜显示器 - Retina Display). 为了同时支持2种分辨率,我们需要准备2个版本的启动画面:&320 * 480 &(for iPhone 2G / 3G / 3GS)&640 * 960 &(for iPhone 4 / 4S)&我们这里演示如何为iPhone A pp 添加启动画面,针对iPad App 的操作,请参考 App 的 iOS Human Interface Guideline 文档 - 关于启动图像大小和命名规范。&启动图像必须为PNG 格式。默认情况下,你可将低分辨率图像文件命名为 Default.png,对于高分辨率的图像,用于Retina 图像文件命名为 Default@2x.png, @2x是iOS 中一种标准的分辨率修饰符。 所有用于在Retina 屏幕显示的图像都应该采用@2 x字符串。&你也可以不用Default 作为启动图像文件名,使用其它你喜欢的文件名,启动图像文件定义在App 的 Info.plist 文件中,添加一个新的属性命名为 - Launch image,并指定你偏爱的文件名(如MyLaunchImage).&上述操作指示iOS使用M yLaunchImage.png 和 MyLaunchImage@2x.png 文件作为启动画面。&你可以从附件中下载启动画面&4.在Xcode中添加你的启动画面&在准备好启动图像之后,回到Xcode,打开你的Xcode项目,我们继续使用Simple Table项目,右击Simple Table 项目,选择Add Files to SimpleTable, 同时添加Default.png 和 Default@2x.png到项目中。&在你完成上述操作之后,你会在项目中看到这两个文件,同时Xcode 自动识别文件作为启动画面。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:228120次
积分:3553
积分:3553
排名:第8648名
原创:113篇
转载:121篇
评论:20条
(6)(6)(3)(5)(1)(3)(5)(7)(1)(15)(1)(3)(1)(2)(3)(2)(2)(1)(3)(1)(3)(8)(2)(2)(6)(3)(6)(4)(12)(13)(22)(10)(8)(2)(5)(21)(15)(16)(7)ios开发愤怒的小鸟的Lua语言:Wax框架详解(二),IOS教程,IOS案例,IOS实例
本站中文域名:、 
        
     
 |  |  |  |  
     |     |     |   
您的位置: &&
&& ios开发愤怒的小鸟的Lua语言:Wax框架详解(二)
ios开发愤怒的小鸟的Lua语言:Wax框架详解(二)
  在《开发奋怒的小鸟的Lua语言:Wax框架详解》中介绍了Wax及其
长处&。在本文中我们首先为大家
预备了Wax框架的下载包,您
可以把Wax下载下来,与我们一同
实现用Wax构建一个
利用程序的过程&。
利用程序显示Twitter上的目前趋向话题列表,
可以用按钮来更新内容&。当
实现整个过程之后没准一个创意就能让你开发出自己的《愤慨的小鸟》&。最终的
  第一步:
综合AppDelegate.lua
  假如你看一下目前的AppDelegate.lua,会
留神到几个方面&。首先,你会
留神到这个Lua文件的第一行&。这一行是Objective-C类申明&。我们
缔造了一个名为“AppDelegate”的类,它
相符“UIApplocationDelegate”
协定&。接下来,你会看到文件中唯一的一个
步骤:“applicationDidFinishLaunching”&。每当
利用程序启动,就调用这个有名的
利用程序现在
可以在屏幕上显示内容&。“applicationDidFinishLaunching”里面的代码
根本上不需求加以
构建了一个蓝色背景的新窗口,
而后将一些白色文本放在上面&。不过,我们需求的是一个Twitter客户程序,而不是“Hello Lua!”屏幕&。
缔造UITableViewController
  第二步:
相熟的UITableViewController
  在名为“TwitterViewController.lua”的脚本目录中
缔造一个新文件&。假如你记性很好,会记得为了申明新的Objective-C类,我们需求
使用waxClass函数&。假如你记性超好,会记得waxClass工作起来像这样:waxClass{"CLASS&NAME",&"PARENT_CLASS"}&&
  我们需求
扩大UITableViewController的一个类,所以它看起来像这样:waxClass{"TwitterViewController",&UITableViewController}&&
  我们已定义了类,现在
解决初始化&。在我们的“init”
步骤中,我们把表设成“grouped”,而不是默许状况下的“plain”&。由于我们还要显示趋向表,所以也有必要对
包容全部趋向的Lua表进行初始化:function&init(self)&&&&&&self.super:initWithStyle(UITableViewStyleGrouped)&&&&&&self.trends&=&{}&&&&&&&&&return&self&&end&
根本上不需求加以
  第三步:
  我们已有了一张分组表,就需求一个
题目&。我们用“viewDidLoad:”
步骤来实现这一步&。function&viewDidLoad(self)&&&&&&&&&&&&self:setTitle("My&First&Wax&Application")&&&&&&&&&&&&self:tableView():setAllowsSelection(false)&&&&end&&
彻底不需求加以
注明&。我们
题目放到屏幕顶部的那个条上,
预防消费者
取舍表里面的任何行&。我们不想消费者
取舍任何行,是由于我们不想
解决这个操作&。
可以在苹果的UITableViewController
注明文档页面上看到,你能调用哪些
惟独记住:你得
使用“:property()”和“:setProperty(value)”
步骤,而不是
使用属性&。按Xcode左上角的“Run”,
利用程序看起来应该像这样:
  第四步:UITableViewController数据
  我们的
可以启动,这很好,但我们想要显示一些数据&。为了显示这些数据,全部UITableViewController必须
步骤,告诉
设施显示什么数据&。其中第一个
步骤是“numberOfSectionsInTableView:”,它会返回将在表中显示的群组数量&。对该
利用程序来说,这一步很方便,由于我们
惟独求一个表段,即
占有目前趋向的那个表段&。function&numberOfSectionsInTableView(self,&tableView)&&&&&&&&&&return&1&&end&&
  是否很方便?现在我们得
施行“tableView_numberOfRowsInSection”
步骤,它告诉
设施某个特定的分组会有多少行&。对该
利用程序来说,这同样很方便,由于我们惟独一个表段&。记得我们如何用“init”
步骤对Lua表进行初始化吗?
惟独计数该表中的表项数量,就晓得该表需求显示多少行:function&tableView_numberOfRowsInSection(self,&tableView,&section)&&&&&&&&&&return&#self.trends&&end&&
使用Lua简写
步骤来计数表中的表项数量&。假如你不
相熟Lua表,下面有几个要点:
  1. 大多数语言中被称为词典的东西在Lua中被称为表&。
  2. 大多数语言中被称为数组的东西被称为带有序数字键的表&。
  3. “数组”
使用从1开始的索引,而
其余每种语言
使用从0开始的索引&。
  接下来是“tableView_titleForHeaderInSection”
设施显示什么作为某群组的
惟独返回某个指定群组的字符串,
题目之后会神秘地浮现在表行上方:function&tableView_titleForHeaderInSection(self,&tableView,&section)&&&&&&&&&&&&&&&if&section&==&0&then&&&&&&&&&&&&&&&&&&&return&"Currently&Trending&Topics"&&&end&&&&&&&&&&&&&&&&&&&&return&nil&&&end&&&
方便&。现在我们
惟独往表格填充从Twitter的服务器取来的数据&。假如你
相熟Objective-C中的UITableViewControllers,就会
意识这下一个
步骤:function&tableView_cellForRowAtIndexPath(self,&tableView,&indexPath)&&local&identifier&=&"TwitterTableViewControllerCell"&&local&cell&=&tableView:dequeueReusableCellWithIdentifier(identifier)&or&&&&&&& UITableViewCell:initWithStyle_reuseIdentifier(UITableViewCellStyleDefault,&identifier)&&local&object&=&self.trends[indexPath:row()&+&1]&--&必须是+1,由于Lua数组从1开始&&cell:textLabel():setText(object)&&&&&&&&&&return&cell&&end&&
步骤要复杂丝毫&。首先,我们定义了对同一
品种型,但可能有不同内容的全部表格单元(cell)来说很独特的标识符&。这种状况下,我们称之为“TwitterTableViewControllerCell”&。接下来,我们
使用Lua简写
获得UITableViewCell的实例&。
留神夹在这两个
步骤调用中间的“or”&。假如第一个
步骤调用的
后果不是false或nil, “cell”就被设成第一个
步骤调用的值&。不然,“cell”会被设成是第二个
步骤调用的
后果&。我们这么做是为了
节俭内存&。这样一来,
惟独为屏幕上10个左右的表格单元
调配内存,而不是为数据源里面可能
占有的数千个表格单元
调配内存&。固然,我们不会有数千行要显示,但这仍是个有必要养成的好习惯&。接下来,我们把表格单元的内容设成从self.trends“数组”的
部分猎取的趋向&。我们晓得,该索引
向来不会超出self.trends的
规模,由于我们通过
步骤“tableView_numberOfRowsInSection”,将数组大小告诉给了
设施&。最终,我们返回刚
缔造的表格单元&。假如你现在按“Run”,它应该看起来像这样:
  在《开发奋怒的小鸟的Lua语言:Wax框架详解》中介绍了Wax及其
长处&。在本文中我们首先为大家
预备了Wax框架的下载包,您
可以把Wax下载下来,与我们一同
实现用Wax构建一个
利用程序的过程&。
利用程序显示Twitter上的目前趋向话题列表,
可以用按钮来更新内容&。当
实现整个过程之后没准一个创意就能让你开发出自己的《愤慨的小鸟》&。最终的
  第一步:
综合AppDelegate.lua
  假如你看一下目前的AppDelegate.lua,会
留神到几个方面&。首先,你会
留神到这个Lua文件的第一行&。这一行是Objective-C类申明&。我们
缔造了一个名为“AppDelegate”的类,它
相符“UIApplocationDelegate”
协定&。接下来,你会看到文件中唯一的一个
步骤:“applicationDidFinishLaunching”&。每当
利用程序启动,就调用这个有名的
利用程序现在
可以在屏幕上显示内容&。“applicationDidFinishLaunching”里面的代码
根本上不需求加以
构建了一个蓝色背景的新窗口,
而后将一些白色文本放在上面&。不过,我们需求的是一个Twitter客户程序,而不是“Hello Lua!”屏幕&。
缔造UITableViewController
  第二步:
相熟的UITableViewController
  在名为“TwitterViewController.lua”的脚本目录中
缔造一个新文件&。假如你记性很好,会记得为了申明新的Objective-C类,我们需求
使用waxClass函数&。假如你记性超好,会记得waxClass工作起来像这样:waxClass{"CLASS&NAME",&"PARENT_CLASS"}&&
  我们需求
扩大UITableViewController的一个类,所以它看起来像这样:waxClass{"TwitterViewController",&UITableViewController}&&
  我们已定义了类,现在
解决初始化&。在我们的“init”
步骤中,我们把表设成“grouped”,而不是默许状况下的“plain”&。由于我们还要显示趋向表,所以也有必要对
包容全部趋向的Lua表进行初始化:function&init(self)&&&&&&self.super:initWithStyle(UITableViewStyleGrouped)&&&&&&self.trends&=&{}&&&&&&&&&return&self&&end&
根本上不需求加以
  第三步:
  我们已有了一张分组表,就需求一个
题目&。我们用“viewDidLoad:”
步骤来实现这一步&。function&viewDidLoad(self)&&&&&&&&&&&&self:setTitle("My&First&Wax&Application")&&&&&&&&&&&&self:tableView():setAllowsSelection(false)&&&&end&&
彻底不需求加以
注明&。我们
题目放到屏幕顶部的那个条上,
预防消费者
取舍表里面的任何行&。我们不想消费者
取舍任何行,是由于我们不想
解决这个操作&。
可以在苹果的UITableViewController
注明文档页面上看到,你能调用哪些
惟独记住:你得
使用“:property()”和“:setProperty(value)”
步骤,而不是
使用属性&。按Xcode左上角的“Run”,
利用程序看起来应该像这样:
  第四步:UITableViewController数据
  我们的
可以启动,这很好,但我们想要显示一些数据&。为了显示这些数据,全部UITableViewController必须
步骤,告诉
设施显示什么数据&。其中第一个
步骤是“numberOfSectionsInTableView:”,它会返回将在表中显示的群组数量&。对该
利用程序来说,这一步很方便,由于我们
惟独求一个表段,即
占有目前趋向的那个表段&。function&numberOfSectionsInTableView(self,&tableView)&&&&&&&&&&return&1&&end&&
  是否很方便?现在我们得
施行“tableView_numberOfRowsInSection”
步骤,它告诉
设施某个特定的分组会有多少行&。对该
利用程序来说,这同样很方便,由于我们惟独一个表段&。记得我们如何用“init”
步骤对Lua表进行初始化吗?
惟独计数该表中的表项数量,就晓得该表需求显示多少行:function&tableView_numberOfRowsInSection(self,&tableView,&section)&&&&&&&&&&return&#self.trends&&end&&
使用Lua简写
步骤来计数表中的表项数量&。假如你不
相熟Lua表,下面有几个要点:
  1. 大多数语言中被称为词典的东西在Lua中被称为表&。
  2. 大多数语言中被称为数组的东西被称为带有序数字键的表&。
  3. “数组”
使用从1开始的索引,而
其余每种语言
使用从0开始的索引&。
  接下来是“tableView_titleForHeaderInSection”
设施显示什么作为某群组的
惟独返回某个指定群组的字符串,
题目之后会神秘地浮现在表行上方:function&tableView_titleForHeaderInSection(self,&tableView,&section)&&&&&&&&&&&&&&&if&section&==&0&then&&&&&&&&&&&&&&&&&&&return&"Currently&Trending&Topics"&&&end&&&&&&&&&&&&&&&&&&&&return&nil&&&end&&&
方便&。现在我们
惟独往表格填充从Twitter的服务器取来的数据&。假如你
相熟Objective-C中的UITableViewControllers,就会
意识这下一个
步骤:function&tableView_cellForRowAtIndexPath(self,&tableView,&indexPath)&&local&identifier&=&"TwitterTableViewControllerCell"&&local&cell&=&tableView:dequeueReusableCellWithIdentifier(identifier)&or&&&&&&& UITableViewCell:initWithStyle_reuseIdentifier(UITableViewCellStyleDefault,&identifier)&&local&object&=&self.trends[indexPath:row()&+&1]&--&必须是+1,由于Lua数组从1开始&&cell:textLabel():setText(object)&&&&&&&&&&return&cell&&end&&
步骤要复杂丝毫&。首先,我们定义了对同一
品种型,但可能有不同内容的全部表格单元(cell)来说很独特的标识符&。这种状况下,我们称之为“TwitterTableViewControllerCell”&。接下来,我们
使用Lua简写
获得UITableViewCell的实例&。
留神夹在这两个
步骤调用中间的“or”&。假如第一个
步骤调用的
后果不是false或nil, “cell”就被设成第一个
步骤调用的值&。不然,“cell”会被设成是第二个
步骤调用的
后果&。我们这么做是为了
节俭内存&。这样一来,
惟独为屏幕上10个左右的表格单元
调配内存,而不是为数据源里面可能
占有的数千个表格单元
调配内存&。固然,我们不会有数千行要显示,但这仍是个有必要养成的好习惯&。接下来,我们把表格单元的内容设成从self.trends“数组”的
部分猎取的趋向&。我们晓得,该索引
向来不会超出self.trends的
规模,由于我们通过
步骤“tableView_numberOfRowsInSection”,将数组大小告诉给了
设施&。最终,我们返回刚
缔造的表格单元&。假如你现在按“Run”,它应该看起来像这样:
Google搜索中
搜狗搜索中
在线教程导航
数据库开发
产品库推荐
| 站长工具:
All Rights Reserved.
珠江路在线版权所有
苏ICP备号 中文域名:
 |  | 一种基于Lua的iOS客户端功能动态更新的方法
一种基于Lua的iOS客户端功能动态更新的方法
【专利摘要】本发明公开了一种基于Lua的iOS客户端功能动态更新的方法,包括以下步骤:A、将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户端App代码模块的版本号;B、客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号下载需要更新的Lua脚本业务逻辑代码;C、当客户端执行到App代码模块时,通过LuaCAPI动态地加载已经下载好的Lua脚本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器和桥接器来解析执行所述Lua脚本业务逻辑代码,以达到动态更新的目的。
【专利说明】-种基于Lua的iOS客户端功能动态更新的方法
【技术领域】
[0001] 本发明涉及i〇S客户端,尤其是一种基于Lua的iOS客户端功能动态更新的方法。
【背景技术】
[0002] 对于一个已经上线苹果商店的App,当开发者需要对客户端进行更新时,最传统的 做法是将重新编译生成的完整的App提交到苹果商店,等待苹果商店的审核,当审核通过 后,用户可以重新下载安装App以达到更新的目的。
[0003] 由于iOS平台限制了不允许以动态的方式加载由原生代码编译生成的可执行程 序,意味着开发者不可以以动态链接库的方式来组织App的软件架构,也就意味着不可以 通过单独更新动态链接库来完成对客户端App的更新。
[0004] 如果采用传统的方式更新客户端,由于从提交给苹果商店审核到审核通过往往需 要耗费较长的等待时间,导致我们的更新版本不能迅速地传递到客户的移动设备上,用户 也需要重新下载安装整个客户端App。
[0005] -种与本发明相近的实现方案是基于Javascript脚本语言和内置于iOS的 WebKit框架的Web App,通过WebKit下载和解析执行Javascript脚本代码,同样可以达到 动态更新客户端功能的目的。
[0006] 如果客户端是做成基于Javascript和WebKit的Web App的方式,更新客户端 不需要经过审核,非常便捷,用户也无需重新下载安装整个App,但Web App的运行依赖于 WebKit,受Javascript解析库的执行性能的影响,使得用户体验与原生App相比存在一定 差距。
[0007] 名词解释: Lua :由标准C编写而成的脚本语言,在所有操作系统和平台上都可以编译,运行;Lua 是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,通过Lua提供的 C API完成C/C++代码两种语言之间的通信的; iOS :苹果移动设备操作系统; App :应用软件; JavaScript :是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时 也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML (标准通用标记语言的子集) 网页添加动态功能,比如响应用户的各种操作; WebKit是开源的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这 个框架来开发的。WebKit还支持移动设备和手机,包括iPhone和Android手机都是使用 WebKit做为浏览器的核心。
【发明内容】
[0008] 针对上述缺点,本发明提出一种基于Lua的iOS客户端功能动态更新的方法,既 可以达到客户端在无需提交审核的情况下及时更新的目的,用户也无需重新下载安装一次 App,同时能够保持良好的用户体验。
[0009] 本发明采用的技术方案是: 一种基于Lua的iOS客户端功能动态更新的方法,包括以下步骤: A、 将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配 置相关客户端App代码模块的版本号; B、 客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号 下载需要更新的Lua脚本业务逻辑代码; C、 当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚 本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器来解析执行所述Lua脚本 业务逻辑代码,以达到动态更新的目的。
[0010] 作为本方案的进一步改进,其还包括一桥接器,该桥接器用于转换Lua解析器不 能解析的代码。
[0011] 具体的,所述桥接器包括标识Ob ject-c类对象和实例对象的userdata结构,该结 构作为Lua中的userdata数据类型存在,该结构中存放着指向Object-C对象的指针和其 他标识信息,与对象相关的操作基本上在这个结构的基础上完成。
[0012] 进一步的,所述桥接器将与Object-C对象对应的userdata结构以key-value对 的方式存放在两个映射表中,其中key为userdata结构中的Object-C对象的指针,value 为userdata结构。
[0013] 所述两个映射表中,其中一个表是弱表,存储了在Lua层面创建的0bject-c对象 的弱引用;另一个表是用于保存在桥接器层面创建的Object-C对象,是一个强引用表。
[0014] 其中,所述桥接器包括Object-C类对象的创建、为一个类注册新方法以及对方法 的调用。
[0015] 进一步的,所述0bject-C类对象的创建包括:在Lua元函数中通过定义的类名称 字符串和〇bject-C的运行时API创建一个类,并构造 Lua可以识别的userdata类型的结 构,再将该userdata结构放入上述的两个映射表中。
[0016] 上述为一个类注册新方法的过程为:通过Object-C的运行时API给一个类注册新 的方法,该运行时API为class_addMethod,该class_addMethod接收一个IMP类型的函数 指针,该函数指针指向这个新方法的实现。
[0017] 所述方法调用的过程为:在桥接器的元方法index里将方法的调用作为一个闭包 压入Lua当前维护的堆栈中,在元方法newindex中进行方法的覆盖。
[0018] 所述方法调用在闭包中是完成〇b ject-c层面的事情,先从Lua中获取当前调用的 方法的名称,由方法名称通过〇bject-C的运行时API_sel_getUid获取到已注册的方法名 称对应的方法标识-SEL,再根据方法标识由0bject-C层面的API生成NSMethodSignature 对象,然后由NSMethodSignature对象构造 NSInvocation对象,最后由NSInvocation对象 完成方法的调用。
[0019] 本发明的有益效果: 本发明可以快速地迭代更新客户端,用户无需重新下载安装App,在大多数情况下,更 新脚本量不会很大,更新过程不会影响用户的使用体验,最重要是Lua脚本解析器具有优 秀的性能,使得客户端App能够保持良好的用户体验。
【专利附图】
【附图说明】
[0020] 下面结合附图对本发明的【具体实施方式】做进一步的说明。
[0021] 图1是本发明的系统架构图; 图2是本发明的动态更新方法流程图。
【具体实施方式】
[0022] 本技术方案基于以下技术基础: 1. Lua的设计理念是可以使它粘合其他的开发语言,它提供了一系列的Lua C API,根 据其规范,我们可以编写一系列的元函数,作为Lua与其他语言编写的应用程序的粘合代 码。
[0023] 2. Object-C作为一种动态语言,提供了运行时丰富的API,提供了根据类名称来 动态反射类对象、根据方法名称来动态绑定方法等特性。
[0024] 3. Object-C可以方便地于C混合编程,为粘合代码的编写提供支持。
[0025] 如图1-图2所示,为本发明的一种基于Lua的iOS客户端功能动态更新的系统及 方法,该方法包括以下步骤: A、 将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配 置相关客户端App代码模块的版本号; B、 客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号 下载需要更新的Lua脚本业务逻辑代码; C、 当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚 本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器和桥接器来解析执行所述 Lua脚本业务逻辑代码,该桥接器用于转换Lua解析器不能解析的代码,以达到动态更新的 目的。
[0026] 下面针对上述步骤C展开阐述其实现方式: 桥接器主要维护了标识〇b ject-C类对象和实例对象的userdata结构,该结构作为Lua 中的userdata数据类型存在。该结构中存放着指向Object-C对象的指针和其他标识信息, 与对象相关的操作基本上都是在这个结构的基础上完成。
[0027] 桥接器将上述与0bject-C对象对应的userdata结构以key-value对的方式存放 在两个表中,其中key为userdata结构中的0bject-C对象的指针,value为userdata结 构。其中一个表是弱表,存储了在Lua层面创建的0bject-C对象的弱引用,当对象不再使 用时会调用桥接器编写的_gc这个元方法来销毁对象。另一个表是用于保存在桥接器层 面创建的Object-C对象,是一个强引用表,需要手动管理内存,框架运行时通过一个定时 器不停地轮询这个表中的对象的引用计数,如果小于2,就会销毁对象。
[0028] 如前面所述,我们可以编写一系列的元函数,作为Lua与Object-C的粘合代码, 其中最核心的是在粘合代码中实现Object-C类、对象的创建以及对方法的调用。
[bject-C类对象的创建: 为了创建Object-C类对象,可以在Lua元函数中通过定义的类名称字符串和Object-C 的运行时API(objc_getClass)创建一个类,并构造 Lua可以识别的userdata类型的结构, 再将该userdata结构放入上述的两个映射表中。
[0030] 2.为一个类注册新方法 通过〇bject-C的运行时API (class_addMethod)给一个类注册新的方法,class_ addMethod接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。在Lua和 Ob ject-C的桥接器中,MP函数包含了用户在Lua层面写的方法,也包括这个方法的参数和 返回值在ObjC与Lua中的相互转换。也就是当调用一个Lua写的方法时会先把参数转化 为Lua可识别的数据类型,然后由Lua C API中的lua_pcall函数调用Lua方法,执行完成 后再把返回结果转换成ObjC类型。
[0031] 3.方法的调用 在桥接器的元方法_index里将方法的调用作为一个闭包(closure)压入Lua当前维 护的堆栈中,在元方法_newindex中进行方法的override。在closure中主要是完成ObjC 层面的事情,先从Lua中获取当前调用的方法的名称,由方法名称通过0bject-C的运行 时API (Sel_getUid)获取到已注册的方法名称对应的方法标识(SEL),再根据方法标识由 ObjC层面的API生成NSMethodSignature(NSMethodSignature存储了该方法的参数类型、 数量和返回值类型)。然后由NSMethodSignature构造 NSInvocation,最后由NSInvocation 完成方法的调用。
[0032] 以上所述仅为本发明的优先实施方式,本发明并不限定于上述实施方式,只要以 基本相同手段实现本发明目的的技术方案都属于本发明的保护范围之内。
【权利要求】
1. 一种基于Lua的iOS客户端功能动态更新的方法,其特征在于包括以下步骤:
A、 将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配 置相关客户端App代码模块的版本号;
B、 客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号 下载需要更新的Lua脚本业务逻辑代码;
C、 当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚 本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器来解析执行所述Lua脚本 业务逻辑代码,以达到动态更新的目的。
2. 根据权利要求1所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:其还包括一桥接器,该桥接器用于转换Lua解析器不能解析的代码。
3. 根据权利要求2所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述桥接器包括标识〇bject-C类对象和实例对象的userdata结构,该结构作为Lua 中的userdata数据类型存在,该结构中存放着指向Ob ject-C对象的指针和其他标识信息, 与对象相关的操作基本上在这个结构的基础上完成。
4. 根据权利要求3所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述桥接器将与〇b ject-C对象对应的userdata结构以key-value对的方式存放在两 个映射表中,其中key为userdata结构中的Ob ject-C对象的指针,value为userdata结 构。
5. 根据权利要求4所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述两个映射表中,其中一个表是弱表,存储了在Lua层面创建的Object-C对象的弱 引用;另一个表是用于保存在桥接器层面创建的〇b ject-C对象,是一个强引用表。
6. 根据权利要求5所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述桥接器包括Object-C类对象的创建、为一个类注册新方法以及对方法的调用。
7. 根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征 在于:所述Object-C类对象的创建包括:在Lua元函数中通过定义的类名称字符串和 Object-C的运行时API创建一个类,并构造 Lua可以识别的userdata类型的结构,再将该 userdata结构放入上述的两个映射表中。
8. 根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:上述为一个类注册新方法的过程为:通过〇b ject-C的运行时API给一个类注册新的 方法,该运行时API为class_addMethod,该class_addMethod接收一个IMP类型的函数指 针,该函数指针指向这个新方法的实现。
9. 根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述方法调用的过程为:在桥接器的元方法index里将方法的调用作为一个闭包压入 Lua当前维护的堆栈中,在元方法newindex中进行方法的覆盖。
10. 根据权利要求9所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征 在于:所述方法调用在闭包中是完成Object-C层面的事情,先从Lua中获取当前调用的 方法的名称,由方法名称通过〇bject-C的运行时API_sel_getUid获取到已注册的方法名 称对应的方法标识-SEL,再根据方法标识由Object-C层面的API生成NSMethodSignature 对象,然后由NSMethodSignature对象构造 NSInvocation对象,最后由NSInvocation对象 完成方法的调用。
【文档编号】G06F9/445GKSQ
【公开日】日
申请日期:日
优先权日:日
【发明者】余敬龙
申请人:广东能龙教育股份有限公司

我要回帖

更多关于 网名关于爱的特殊符号 的文章

 

随机推荐