工作日志 时间:两周内完成
1,即时通信 (接入环信)
2,推送 (个推、极光)
3,页面缓存 和 混合开发框架的集成
4,将1,2,3 集成到一个demo 里
第一天 3-14
目标: 了解 环信 、 极光 、混合开发框架
环信: 支持离线推送 单聊 群聊 实时音视频
基础定价方案: 1个 2个 坐席 免费
3个坐席 4500/年
4个坐席 6000/年
注册后一个月内 不限坐席,不限功能 免费
极光: 推送 IM 聊天
基础定价方案: 免费用户 VIP用户
共享 独享
API开放部分 API全部开放
推送消息/通知
推送历史
推送API
最大并发数 高峰期有资源瓶颈 无限制
推送速度 二十万条/秒(共享) 二十万条/秒(独享)
推送条数 无限制 无限制
按标签推送
用户分群推送
富媒体(预加载)
专享高速推送通道
子账号管理
更多Push API调用次数
离线保存消息条数 5条 最高50条
数据统计与报表
推送数量
用户打开次数
用户使用时长
新增用户
在线用户
活跃用户
消息送达统计API
Device API
在线设备查询API
数据报表统计API
通知是否打开
技术支持
网站问答
邮件支持
VIP技术支持
解决方案咨询
400电话支持
1对1在线支持
页面缓存 混合开发框架
http://www.cnblogs.com/wendingding/p/3950198.html
混合开发框架
1,hybrid 框架
Native
js调用Native中的代码
Schema:WebView拦截页面跳转
2,Cordova
3,PhoneGap
调查结果 一般用PhoneGap
影响及注意点:
无法通过审核的原因
首先,苹果不会因为App使用的用户界面基于HTML而去拒绝一个应用。实际上,许多苹果自己的App或者广告平台都基于HTML、CSS和JavaScript,比如Apple Store里的iAd广告平台就是其中一个。除了苹果自己的应用外,还有LinkedIn,Wikipedia等等。当然,当中不是所有App都用PhoneGap,但其用户界面都基于HTML,所以就排除HTML为罪魁祸首这一说。
1)苹果会拒绝没有如下特征的应用:
能给用户带来应用体验而非网页体验;
在iOS生态系统中,使用起来轻松自如;
能与移动端Web体验区分开。
这几条对所有应用都适用,并不仅仅是UI基于HTML开发的应用,如果不知道苹果的具体审核标准是什么,记住一点就可以,所有标准都和用户体验有关。在苹果的“iOS User Interface Guidelines”(iOS UI设计说明)中就有大量关于哪些能通过哪些无法通过的详细信息,在UI guidelines中,苹果尤其强调“基于Web的设计”这个部分:
如果应用是基于Web的设计,建议三思而行
如果基于Web,建议你确保App带给用户的是iOS应用体验,而不是Web体验。记住,用户可以通过Safari访问你的网站。
图片来源:lukor
在利用HTML及与之相关的技术开发应用时,一定要仔细阅读完整的“iOS User Interface Guidelines”。除了iOS User Interface Guidelines,苹果的“App Store Review Guidelines”对于如何通过App审查也有相关说明,当中就有许多有关基于HTML开发的App可能被拒绝的情况,值得注意的是如下几条:
2.12:不是特别有用的,独特的应用,只是简单与网站捆绑后作为App的应用,无法提供持续娱乐价值的应用可能会被拒绝。
10.3:没有正确使用系统所提供的选项(如按钮,图标)的应用以及与Apple iOS Human Interface Guidelines的规定描述不符的应用可能会被拒绝。
12.3:只是简单的web剪接,内容聚合或者链接搜集,这类应用可能会被拒绝。
2)出现这些迹象,应用也有可能被拒绝
如果你的应用只是PhoneGap包装下的网站,可能被拒绝。当然也有例外,但千万不要抱侥幸心理。
如果你的应用需要用户缩放页面才能查阅内容,就有可能被拒绝。应用要有应用的感觉,要给人直观性,不要让用户去找功能,不要让用户返回上一个导航去寻找有用的东西。
如果应用看上去就像加了超链接的文版,没有本地化风格,也会被拒绝。
注意你应用的反应时间,这些时间与用户操作处理时间以及与对服务器的反应时间都相关,苹果不喜欢慢的应用或者没有反应的App。同样,如果用户按了某个按钮,结果等了好几秒钟才有反应,也有可能被拒绝。
苹果的判断界限很多时候很模糊,尤其是对那些已经经过评估的独立开发者开发的应用更是如此。他们对每个应用都会进行优点,功能,用户体验评估。另外iOS User Interface Guidelines以及App Store Review Guidelines是动态文件,可能会随操作系统的变化而变化,或根据新的应用设计带来的新问题而改变,所以要记住定期阅读这些文件。
被拒绝了该怎么做?
前面提到PhoneGap有这么多功能,但它无法使你免于应用审核。由于PhoneGap的用户界面是基于web技术,不太可能立即被接受。在开发过程中,设计师或开发者一定要注意,UI/UX设计一定要与操作平台或生态系统的要求相符。当你在设计或开发一个PhoneGap应用的时候,要思考的是如何让应用看上去更加本地化,如何更有移动应用的感觉而不是网页感觉,核心问题就是“用户体验”是否好。
1)做应用的时候,要思考下面几个问题:
应用的UI界面范例与平台相符吗?
应用给人的视觉效果如何?
应用看上去像一个网页吗?界面有利于触屏操作吗?
下面以Fresh Food Finder(App Store里的PhoneGap应用)为例,我们将检验两个视觉效果。下面两张图是同一个应用,均由PhoneGap模拟器捕捉。
图片来源:Adobe
左图有HTML内容但没有CSS风格,如果比较视觉效果,左边界面看起来就像网页,而右边的看上去则非常有应用的感觉,顶部有导航元素,通过右边箭头还能继续查看下一级内容,每一条都有UI元素,促使用户继续浏览内容。
图片来源:Adobe
看上图,有什么问题呢?
首先,上图是一个经过包装的网站,苹果讨厌的就是把网站用本地化的外壳伪装起来,这个外壳是空的,没有任何逻辑可言,如果掉线,伪装就会失败,与移动端的Web体验没什么差别,也没有增加任何价值。
其二,用户界面没有优化移动体验,用户需要缩放等操作来阅读内容,并且,导航不仅与内容没有明确的区分开,也不利于触屏操作。开发应用的时候,要让用户操作起来有熟悉的感觉,当然,你无须模仿每个本地应用的UI风格,但用户互动范例应该相似,UI要够直观,清爽。想要理解什么叫“有App感觉的应用”,就多看看其它公诸于众的应用或者已经通过苹果审核的设计。
现在国外有许多比较应用UI的网站,进去看看对UI设计会有很大帮助。例如:
Mobile partners
Inspired UI
Pttrns
许多工具及框架都能帮助你将HTML体验打造得更加本地化,点击链接可进入下载。例如:
Twitter Bootstrap
iUI
jQuery Mobile
Sencha Touch
Kendo UI
app-UI
Zurb Foundation
Moobile
Chocolate Chip UI
Dojo Toolkit
jqMobi
图片来源:Mobile-Patterns
2)交互性与性能注意事项
(1)优化视觉脱节环节:如果用户必须通过HTML链接来下载一个单独的页面,会带来视觉上的脱节,在这个环节需要进行优化。苹果貌似更青睐那些给人感觉比较统一的应用,能为用户带来无缝体验的应用。在异步下载数据或者动态更新内容的时候可以采用单页面架构,总的来说就是要让页面之间的衔接更快更不容易让人察觉。
(2)优化数据获取过程:你还需要在应用内及应用外优化数据获取过程。数据交换尽量最小化,只有在需要的时候才传输数据,最好采用轻量级数据交换格式,这样就会缓解数据传输延迟现象,让你的应用变得更快。
(3)应用内操作过渡要连贯:尤其要注意这条,如果你的应用出现闪烁,不连贯的情况,那你就需要重新访问应用,试试自己是如何在屏幕上移动应用内的按钮或者设置的。去查找一些技术,让GPU为只是使用CSS的HTML DOM元素服务,许多情况下,这些技术能改变整个应用性能。
(4)进度条与旋转指针:另外在处理一些需要时间的事情时,比如与服务器交换数据,可以增加一些简单标志,比如进度条或者旋转指针,可以让你的应用感觉更快更加本地化。
总的来讲,注意你的用户体验设计,苹果的审核程序也并非一成不变的,还得看你是什么应用。千万不要认为用了PhoneGap跨平台开发工具就能免除审核这一步。苹果相当注重应用的品质及用户体验,如果表现不好,出现漏洞,或者审美达不到他们标准,也会被拒绝,苹果对自己的生态系统要求比较高,但记住一点,越注重用户体验,通过的几率就越高。
http://www.csdn.net/article/2012-11-04/2811382-phonegap-rejection-apple
问题:
苹果的根证书 2016-2-14 更新了 需要更新 否则 开发者证书 无效
第二天 3-15
目标: 集成极光推送 了解环信
问题: 0/0 消息发不出去
原因: 开发者证书的问题? 接收不到消息
解决: 还是证书的问题
做了 本地通知 测试 可用 第三方的问题 需要解决
了解环信
问题待解决: 极光推送 和 环信 都需要开发者证书和推送证书 需要尽快解决 但是可以先做着
问题待解决: 极光推送 的 开发者证书的问题 开发证书 和 生产证书
3-16
证书配置完成 开发环境(调试模式)需要联机
生产模式 装好应用 即可离线推送 (后台发送,手机有网)
今日计划: 环信的集成开发
1,仍需要配置推送证书
2,按照开发文档 一步一步集成
Bundle Identtifier 是统一的
推送证书 可以是 一个
问题:
但是 做app 的Bundle Identtifier 只有一个 再造环境需要 重新申请
环信里 嵌套 极光推送 失败 Bundle Identtifier 不可用
措施: 反向嵌套 及 先极光推送 后封装环信
3-17
选择环信 2.2.0 版本 重新集成
原因:3.1.0最新版 集成文档没有推出 一直报错
决定集成2.2.0 版本
将第三方调用
功能: 注册
登录
自动登录
自动连接
第三方实现的思想:
使用环信的思想
所有的网络请求 [EaseMob sharedInstance].chatManager "聊天管理器"
结果(自动登录、自动连接)- 通过代理来回调
调用chatManager “聊天管理器”的
【- (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;】
[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];
下午:
功能: 添加好友
自动获取好友列表
好友同意后刷新通讯录
接收好友的请求
删除好友
监听被好友删除
退出登录
自动登录 方法的代理 调用: 全部调用 只要实现了这个方法 就调用
环信要求代理 用过之后 dealloc 代理方法
总结: 添加聊天管理器的代理时,在控制器被dealloc的时候是,应该移除代理
添加好友的代理方法,最好放在Conversation的控制器实现
即使没有联网 也有好友 说明 环信 将好友列表 保存到本地db数据库
数据库: SQlite
// 获取好友列表数据
/* 注意
* 1.好友列表buddyList需要在自动登录成功后才有值
* 2.buddyList的数据是从 本地数据库获取
* 3.如果要从服务器获取好友列表 调用chatManger下面的方法
【-(void *)asyncFetchBuddyListWithCompletion:onQueue:】;
* 4.如果当前有添加好友请求,环信的SDK内部会往数据库的buddy表添加好友记录
* 5.如果程序删除或者用户第一次登录,buddyList表是没记录,
解决方案
1》要从服务器获取好友列表记录
2》用户第一次登录后,自动从服务器获取好友列表
*/
3-18
问题: 1,pch 文件 连接错误
2,点击发送崩溃 ?
3.点击好友崩溃
4.语音发送不出 (发不出,收不到 未解决)
解决: 1,重置 创建后 重写路径
2,没有向通讯录控制器 传递一个 buddy的值 找不到好友属性所以崩溃
3,返回tableView 数据源方法时 崩溃 修改了indexPath.row 方法
4,监听点击方法 调试
环信的集成继续
功能 :
上午:
聊天界面工具条排版
聊天接收方的cell排版
聊天发送方的cell的排版
发送聊天信息
下午:
加载本地聊天记录
监听消息回复
调整输入框
发送语音
播放语音
3-19
推送demo 已完成
集成环信demo 已完成
页面缓存 和 混合开发框架
#pragma mark 测试时衍生出来的问题 待解决
推送证书的时效性 和 bundle ID 的时效性
Please verify that your device’s clock is properly set, and that your signing certificate is not expired. (0xE8008018).
The identity used to sign the executable is no longer valid.
请确认您的设备的时钟设置正确,并且您的签名证书未过期。(0xE8008018)。
用来签署可执行的身份不再有效。
页面缓存机制: 可以用第三方AFNnetworking 网络处理框架 进行页面缓存
NSURLConnection/AFN 缓存机制
NSURLConnection 苹果自带的缓存机制
NSURLCache * cache = [[NSURLCachealloc] initWithMemoryCapacity:5 * 1024 * 1024
diskCapacity:25 * 1024 * 1024
diskPath:nil];
[NSURLCachesetSharedURLCache:cache];
1. URL缓存基本概念
NSURLCache 提供了内存与磁盘的缓存机制。
任何通过NSURLConnection 加载的请求都会 NSURLCache 处理,因为 AFNetworking 使用了NSURLConnection ,所以也会被处理。
当完成数据的请求后,缓存的相应被保存在本地(沙盒目录为Library/Cache/<boundleId>目录下,每一个不同的请求会生成一个文件夹,保存的文件为NSData文件。)当下一次同样的请求时,直接从缓存中获取即可。
因此网络缓存减少了与服务器的负担,并提高应用程序更好的体验。
二 :设置NSURLCache
1. 使用URL缓存首先要使NSURLCache进行初始化。URL 缓存默认大小为Memory 4 * 1024 * 1024 btye Disk 20 * 1024 * 1024byts
2. 在首次使用URL换粗之前就初始化NSURLCache,这样才能使用URL缓存,因此通常情况下在application: didFinishLaunchingWithOptions--- 初始化,这样这个程序所有的NSMutableRequest 都能使用URL缓存。当然,你也写在自己网络请求的 单例初始化里
NSURLCache * cache = [[NSURLCachealloc] initWithMemoryCapacity:5 * 1024 * 1024
diskCapacity:25 * 1024 * 1024
diskPath:nil];
[NSURLCachesetSharedURLCache:cache];
三 : 设置NSMutableURLRequest的requestsetCachePolicy即缓存策略
NSURLRequestUseProtocolCachePolicy= 0,默认缓存策略。具体工作:如果一个NSCachedURLResponse对于请求并不存在,数据将会从源端获取。如果请求拥有一个缓存的响应,那么URL加载系统会检查这个响应来决定,如果它指定内容必须重新生效的话,将建立一个连向源端的连接来查看内容是否发生变化。假如内容没有变化,那么响应就从本地缓存返回数据。如果内容变化了,那么数据将从源端获取。
NSURLRequestReloadIgnoringLocalCacheData = 1,URL应该加载源端数据,不使用本地缓存数据
NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,本地缓存数据、代理和其他中介都要忽视他们的缓存,直接加载源数据
NSURLRequestReloadIgnoringCacheData =NSURLRequestReloadIgnoringLocalCacheData, 两个的设置相同
NSURLRequestReturnCacheDataElseLoad = 2,指定已存的缓存数据应该用来响应请求,不管它的生命时长和过期时间。如果在缓存中没有已存数据来响应请求的话,数据从源端加载。
NSURLRequestReturnCacheDataDontLoad = 3,指定已存的缓存数据用来满足请求,不管生命时长和过期时间。如果在缓存中没有已存数据来响应URL加载请求的话,不去尝试从源段加载数据,此时认为加载请求失败。这个常量指定了一个类似于离线模式的行为
NSURLRequestReloadRevalidatingCacheData = 5指定如果已存的缓存数据被提供它的源段确认为有效则允许使用缓存数据响应请求,否则从源段加载数据。
只有响应http和https的请求会被缓存。ftp和文件协议当被缓存策略允许的时候尝试接入源段。自定义的NSURLProtocol类能够保护缓存,如果它们被选择使用的话。
示例:
NSMutableURLRequest * request =[NSMutableURLRequest requestWithURL:[NSURLURLWithString:@"http://www.sina.com"]];
[requestsetCachePolicy:NSURLRequestReturnCacheDataDontLoad];
四 :URL缓存的使用
1 获取缓存
NSCachedURLResponse * response =[cache cachedResponseForRequest:request];
if (response != nil) {
NSLog(@"有缓存");
[requestsetCachePolicy:NSURLRequestReturnCacheDataDontLoad];
}else{
NSLog(@"没有缓存");
}
2. 获得缓存就可以赋值更新UI了。
根据内存分析
打开36M 打开网页 内存 上升 64
返回 还有 45
占用内存分析 已经完成
测试网络关闭 页面可以打开 缓存完成
页面可以缓存 缓存完成
通过抓包技术 获取 网页数据
3-21 星期一 晴
本周任务 将三个Demo 合并到一款 demo里 并使用第三方混合开发框架
facebook/react-native 框架
Cordova 是驱动PhoneGap的核心引擎
提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。
需要用终端安装
国内的:
JSPatch框架
apiclound
Wex5
风险
JSPatch让脚本语言获得调用所有原生OC方法的能力,不像web前端把能力局限在浏览器,使用上会有一些安全风险:
1.若在网络传输过程中下发明文JS,可能会被中间人篡改JS脚本,执行任意方法,盗取APP里的相关信息。可以对传输过程进行加密,或用直接使用https解决。
2.若下载完后的JS保存在本地没有加密,在未越狱的机器上用户也可以手动替换或篡改脚本。这点危害没有第一点大,因为操作者是手机拥有者,不存在APP内相关信息被盗用的风险。若要避免用户修改代码影响APP运行,可以选择简单的加密存储。
试用三种 框架
React 的核心思想是: 封装组件
各个组件维护自己的状态和UI ,当状态变更,自动重新渲染整个组件
react-native
解决:终端—> npm install react-native Xcode 添加依赖Link Binary with Library —>Add Other —> node_modules__>react-native —> React—>Base—>RCTRootView.m
brew uninstall --force watchman
brew install --HEAD watchman
重新安装watchman 试试
Node.js
Node.js was installed at
/usr/local/bin/node
npm was installed at
/usr/local/bin/npm
Make sure that /usr/local/bin is in your $PATH.
下载测试demo 开始使用 学习
3-22 新建一个react-native 应用
原因: 创建完成后 有安卓程序 没有ios程序
解决: 需要升级 node。js 最新版
bad external relocation length
解决: 不用命令行 官网下载最新 安装覆盖
Node.js was installed at
/usr/local/bin/node
npm was installed at
/usr/local/bin/npm
Make sure that /usr/local/bin is in your $PATH.
下载测试 (OK)
创建测试 (OK)
cd 项目
npm install
运行后出现红色屏幕 JSC profiler is not supported.
解决:
$工程目录/node_modules/react-deep-force-update/
1
目录下面删除
.babelrc
1
注意:该文件是隐藏文件,如果你已经运行工程,请先关闭 React Packager,否则无效。
在原生app中 添加RN
将四个demo 结合起来
3-23
目标 将四个demo 集成
问题: RN 报错 每次连接WiFi 地址都会变 8081端口服务器问题
解决: 需要服务器(电脑) 一直打开 并确保联网状态下
极光推送: bundle ID 只能唯一
可放在 最后集成
RN报错问题。。。 也需要最后集成
RN : 一种用纯RN 做app 需要用 js
另一种 原生加RN (需要保证RN后台服务器 一直开着 并安装配置环境)
RN 解决:
brew uninstall --force watchman
brew install --HEAD watchman
重新安装watchman 试试
Connection to localhost port 8081 [tcp/sunproxyadmin] succeeded!
Port 8081 already in use, packager is either not running or not running correctly
Command /bin/sh failed with exit code 2 (待解决)
环信的prch文件地址 导入问题
问题:
/Users/zhangyuanhai/Desktop/HYDemo/<command line>:3:10: '/Users/zhangyuanhai/Desktop/HYDemo/HYDemo/PrefixHeader.pch' file not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$(SRCROOT)/HYDemo/PrefixHeader.pch
3-24
组合
问题: 推送 RN 集成
RN 需要有固定的IP 及 服务器 最后添加 (需要讨论)
IP 每天WIFI连上会 变更IP 地址 问题
完成进度:
环信+缓存框架+视频
3-25
添加推送 完善App测试demo
视频添加评论(需要后台接口)先做聊天测试评论
RN 框架需要讨论
让人欲哭无泪的bug
libopencore-amrnb.a(wrapper.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
解决: 第三方环信的功能不支持 bitcode Xcode里找到 关掉写成NO
Port 8081 already in use,packager is either note running or not running correctly
command /bin/sh failed with exit code 2
解决: 重新电脑了 清空配置
1,终端—> npm install react-native
2,npm install -g react-native
3-26
继续完善功能 继续添加混合开发框架
换一种方式 使用
pod init
修改 Podfile 文件 CocoaPods
pod 'React', '0.13.0-rc'
pod "React/RCTText"
pod "React/RCTActionSheet"
pod "React/RCTGeolocation"
pod "React/RCTImage"
pod "React/RCTLinkingIOS"
pod "React/RCTNetwork"
pod "React/RCTSettings"
pod "React/RCTVibration"
pod "React/RCTWebSocket"
安装 pod install
安装完成后 出错二个错误
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_RCTRootView", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
无法解决的问题 (待解决)
换一种思路 安装
3-28
index.ios.jsbundle 该怎么用? 里面写什么?
做评论:
向系统的一个ID 发消息
每个用户都在向系统发
评论是相互可见的
用户之间的互动回复 需要@
初步方案:
在用户评论的 右侧 cell 添加回复
点击回复 就做@操作
文字即可
可移植性
3-29 讨论
页面优化---
混合开发
页面缓存
UI方案
MVC MVVM
依赖注入
代码优化
视频
第三方集成 登录 支付
----具体做App
3-30
今日目标:
设计模式 深入了解
页面优化
UI方案
考虑:
在原先的基础上 添加内容
添加视频?
发表文章?
聊天?
群组?
直播?
第一版的设计方案:
先把微信端的内容做出来 然后添加新内容
3-31
测试两套H5 和 OC的 交互
标题 文字 排版测试
关于视频 可以参考 土豆视频app 的设计
有没有app 判断手机联网状态 发送推送的 , 比如刚连上wifi的情况下 会推送
4-1 设计模式 考虑
MVC Model-View-Controller
MVC是将Model, View和Controller分离,让彼此的职责(responsibility)能够明确的分开,这样不论是改M, V还是C,都可以确保另外两层可不用做任何修改,同时这样的分层也可以加强程式的可测试性(testability),View和Model基本上是相关的,但它们并不会有直接的相依关系,而是由Controller去决定Model产生的资料,然后丢给View去做呈现,也就是说,Controller是Model和View之间的协调者(coordinator),View和Model不能直接沟通,以确保责任的分离。而Controller可以只是一个系结Model和View的小类别,也可以是大到包含Workflow, Enterprise Services或是做为外部系统的Proxy Services等的逻辑系统,MVC各元件是可以分离的组件,也可以是分离的系统(当然要设计一些机制在相互沟通)。
MVVM,MVVM的架构一样是M, V分离,但中间是以VM (ViewModel)来串接,这个ViewModel比较像是View的一个代理程式,它负责直接对Model做沟通,而View可以透过一些机制(ex: Events, Two-way Databindings, ...)来和ViewModel沟通以取得资料或将资料抛给Model做存取等工作,ViewModel也可以作为和外部系统的代理程式,例如Web Service或是REST Service或是Enterprise Services等等,不过它和MVC不同的地方,就是ViewModel和View的黏合度比较高,因为View必须要透过ViewModel才可以取得Model,而ViewModel又必须要处理来自View的通知讯息,所以虽然职责一样分明,但是却不像MVC那样可以扩展到整个系统元件都能用。如果MVVM要和MVP比较的话,MVVM会比MVP更灵活一点。
MVP,MVP一样也是职责分明,且Model与View分离的架构,但是这个P (Presenter)和ViewModel就很类似,不过就如同Presenter (主持人)这个字所代表的意义,所有主控View呈现的工作,都是由Presenter来做,而View本身只是Presenter所要使用的舞台而已,所以View原则上会相依于Presenter,但是为了要做到关注点分离(SoC原则),所以在View和Presenter间都会加入一个介面(ex: IView),然后以IoC的方式将View注射到Presenter中,而Presenter就使用介面所定义的方法去操控,而View就透过介面所定义的方法去呈现介面即可。但也因为受限于介面,所以Presenter只能依介面定义的动作去回应与处理,而不能再做更多的延伸功能,除非更改View的介面。
上面各个架构的讨论,我们可以得到以下的结果:
MVC 架构适合于大型系统,它可以分层且可以在实体层面切割为不同的机器或服务,只要彼此间具有适当的通讯协定即可。
MVVM 架构适合像XAML 这种与程式码无关(code ignorance) 的使用者介面设计,只要View 中下特定的指令与ViewModel 串接,就可以享有ViewModel 沟通的功能,而ViewModel 只需做一些特别的介面实作,即可平顺的和View 沟通。
MVP 架构适合集中由程式码决定View 动作的应用程式,而View 只需要实作特定的介面即可,不需要太复杂的工作,但Presenter 则可能会受限于View 介面的动作,而无法做更进一步对View 的控制。
最后我想提的是,MVC的包容度比MVVM和MVP要来的高,在MVC的V层,可以再进一步的包含MVVM或MVP的实作,而C层也可以使用MVP (V是输出的资料)来进一步切割资料的流动与输出,M层则可以类似MVVM的架构,当V (元件)有资料的异动时,VM即可自动侦测到并更新Model (资料库)。当然,要用什么样的架构去设计,端看当时的系统环境与需求来决定,而不是只想着要用同一种架构去做所有的系统。
MVC 依然是主流 MVC中也可以用MVVM 也包含MVP
版本更新迭代
产品设计,功能需求 下载其他电影类app 体验
片刻、豆瓣、影评剧透、影评视频合集、四款参考方案
进行总结:
功能问题 功能少 花样少 留不住用户
需要社交 社区 文艺 圈子
不要加广告条 网络资源加载要快
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探