iOS程序员混合开发问题记录

作为一名iOS开发者,项目采用H5内核,遇到离线缓存、清除缓存、与H5交互等问题。离线缓存通过NSURLProtocol实现,因H5框架版本和时间戳导致困扰,最终找到解决方案。分享了与H5配合时的键盘遮挡输入框、通知推送、分享功能的集成经验,以及遇到的网络状态变化下Webview加载问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先容我用文字吐槽下我们哩得(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开发工程师,意在记录自己所遇到的问题,当然如果能帮助到大家我也非常高兴,文采有限。。。。不喜勿喷,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值