先容我用文字吐槽下我们哩得(Leader :领导)
作为一个iOS开发,项目已经写了一年,真尼玛感觉蛋疼,好无语有没有,好想吐槽项目经理,产品经理,高高在上的老总!想啥呢,都一年了,就算项目某些功能没定下来,咱们就不能拐个歪想别的吗?
这个项目我们iOS和Android只是简单的外壳,里面大部分功能是H5来写的,iOS和Android做了离线缓存、清除缓存、调用相机相册、联系人(系统都有我们写)、与h5的交互、分享、推送等,因为我们写的不多,基本都是在等前端那边。
问:为什么你们写这么少,答:项目经理开会时明确表明,功能能由前端做就用前端! 我们自然很开心,但是进度真的很慢
海燕呐,你就上点心吧!这都多久了,给大伙紧紧发条吧~~~这样项目做下来真的很累,心累啊!
本人程序员,话也不多!接着记录下自己遇到的问题吧,虽不是什么大问题,好记性真不如烂笔头,况且我记性真不好!
上面也说到了我大概都写了什么功能一个一个记录吧
在做离线缓存的时候用的是NSURLProtocol,当时想着uiwebview加载的就是URL,应该不难吧,但是,我在这鼓弄了好几周!原因是H5这框架,在每个路由后面都加了版本号与时间戳,版本号应该是框架的版本号,但是你为什么加时间戳呢,我翻看了框架的代码,发现代码注释上的意思是框架带缓存,应该是只支持在线缓存,离线缓存没有。加时间戳可能是为了缓存吧,但是当时我做缓存的时候不知道,亲眼看着缓存文件都在,缓存也成功了,但是断网死活不出来,度娘快问烂了,别人的代码也看了很多遍,感觉就是没问题。最后问了技术总监,说你看看断网下拿缓存文件的路径对不对,也试了,没问题!,额~~基本想放弃了,但实在没招了,也不能不做缓存啊,开始看H5框架,发现了时间戳与版本号,试着把.CSS .JS等后面的全部截掉,然后。。然后。。然后缓存界面出来了,我擦,当时把我激动的不要不要的!真的很激动。事后总结了下,是我意志不坚定,心不在焉,做事坚持不住!其实这个问题不是很难,重点是发现问题所在,当时要是多看几眼控制台打印的东西,就不用花费这么多时间了。但现在缓存还是有点问题,缓存就是把你浏览过的保存下来,但是我在断网前没做过某个操作,在断网的时候我要做这个操作就会行不通,测试提了这个问题,我还不确定怎么弄!
清除缓存这个基本不用说了吧,就是把存缓存文件的文件夹清空就OK了,我缓存做的是缓存整个工程,没单单缓存图片或是别的!缓存文件过期时间,我是清除缓存的时候保存个时间,当时间>24小时就调用清除缓存。恩~~~ 大概就这样。这里记录下,H5开发的时候会用到本地存储一些东西,一些小数据!好像是用的storage,然后缓存的时候会把storage这个文件也保存到了caches文件夹里,记住,storage文件不能删除,反正我删除后发现,再次打开应用,引导页出来了,登录状态也改为了未登录!
调系统的功能网上一大堆,这里无非就是用到了交互,给H5开个接口,他们调用就OK了,我在接口里面把要实现的东西写好。
交互用的就是JavaScriptCore,添加系统库,实现JSExport协议的协议,然后写接口,你写好的接口名和H5写的接口名要丝毫不差,不然就调用失败,定对象,搭桥!我就不想多写了,网上写的比我详细多了,就算我写了也是吧 别人的搬过来的,毕竟口才不好,
分享没什么好说的,有demo,集成跟着一步步走OK了,
推送用的是极光,这里需要记录下,这是应用未打开的处理方法,创建个通知中心,在需要实现的controller接收这个通知,然后跳转到相应页面
didFinishLaunchindidFinishLaunchingWithO
if (launchOptions) {
NSDictionary * remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//这个判断是在程序没有运行的情况下收到通知,点击通知跳转页面
if (remoteNotification) {
NSLog(@"appdelegate未打开应用推送消息==== %@",remoteNotification);
//创建一个消息对象
NSNotification * notice = [NSNotification notificationWithName:@"RootViewController" object:nil userInfo:remoteNotification];
//发送消息
[[NSNotificationCenter defaultCenter]postNotification:notice];
}
}
//添加当前类对象为一个观察者,接收应用未打开情况下收到的通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(notice:)
name:@"RootViewController"
object:nil];
-(void)notice:(NSNotification *)sender{
NSLog(@"未打开应用收到的推送消息:%@",sender);
NSString *urlSs = [sender.userInfo objectForKey:@"url"];
ViewController *vi1 = [[ViewController alloc]init];
vi1.urlString = urlSs;
[self presentViewController:vi1 animated:YES completion:nil];
}
一种应用已经打开,但是在后台运行
一种正在使用应用时收到推送消息,用提醒框来做的
//极光消息接收方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[JPUSHService handleRemoteNotification:userInfo];
NSLog(@"收到通知:%@", [self logDic:userInfo]);
[application setApplicationIconBadgeNumber:0];
if (application.applicationState == UIApplicationStateActive) {
NSString *alertStr = [userInfo objectForKey:@"url"];
//APP正在运行时,推送过来消息的处理
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:alertStr
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"查看消息",nil];
[alert show];
} else if (application.applicationState == UIApplicationStateInactive ) {
//APP在后台运行,推送过来消息的处理
[self goToMssageViewController:userInfo];
}
}
- (void)goToMssageViewController:(NSDictionary *)dic{
NSString *urlS = [dic objectForKey:@"url"];
ViewController *vi = [[ViewController alloc]init];
vi.urlString = urlS;
[self.window.rootViewController presentViewController:vi animated:YES completion:nil];
}
极光推送基本就是这三种情况,我简单试了下,可行!
还有些问题就是H5与我们配合写的了,像web页面,解决了键盘遮挡输入框问题,但是键盘弹出来,导航栏也跟着页面往上跑了,想要的效果就是键盘弹出来,导航栏不动,也要解决键盘遮挡输入框的问题,Android是解决了,但是iOS怎么滴都不行,H5的方法在iOS上不能用,目前还在解决中
webview加载一个百度网址,在uiwebview上写一个按钮,按钮放在任意位置,按钮点击事件里面写上self.webview reload; 第一次加载时,断网加载,走错误代理方法,页面显示白屏和按钮,这时候吧网络打开,确定为有网状态,点击按钮,重新加载。。。。。。,webview会吧百度网址加载出来吗?答案是不会,webview不知道要load什么URL。这是问题就是你在断网情况下运行工程,然后重新加载webview失败的问题,不遇到这问题真的以为会重新加载成功
本人也是正在学习阶段的iOS开发工程师,意在记录自己所遇到的问题,当然如果能帮助到大家我也非常高兴,文采有限。。。。不喜勿喷,谢谢!