EasyWeb Iphone 应用开发杂记

由于iphone输入法打入字母网址比较麻烦,所以想到在iphone里做成一个类似网址大全的东西,并且要实现多页框浏览的功能。 这样只能自己实现一个浏览器然后配合这个“网址大全”了。

EasyWeb 分两部分功能 一是用户可维护定制的"网址大全” 二是浏览功能。

EasyWeb暂时支持如下功能: (后面陆续增加)

1)浏览历史记忆

2)手工输入网址

3)  通过上网方案生成网址

3)内嵌多页浏览器

4)内置一套“网址大全“

5)   自定义上网方案 (自己使用时可以跟据需要简化掉一些网址)

6) 维护网址分类 (添加删除网址分类)

7) 维护网址(添加删除具体网址)

8)   同时打开多页  (在使用上网方案时 如果进行网址多选,在内嵌多页浏览器内同时打开多个网址)

 

2010/08/16 开始构想设计

构想设计如上简述

2010/08/17 完成大体原型设计

原型界面如下:

主页 {提供浏览功能   历史记忆功能   维护页入口   上网方案选择入口 }

定制维护页 {维护网址类型 维护网址分类 维护具体网址 维护上网方案}

上网方案页 {选择网站按钮后 在地址栏中生成相应网址}

上网方案选择页

上网方案维护两页{增加 删除}

网址维护两页{显示页 增加页}

分类维护两页{显示页 增加页}

网址类型维护两页{显示页 增加页}

大体共11个页面,页面两页之间还是导航关系。其中网址分类与网址可做成一页 在一个页面由两个滚动条分别包含

 

2010/08/18 上午 完成数据结构组织

分类结构Class

由字典保存分类信息

id:key name:value

项目结构

Item

{id,name,url}

item;

由字典保存分类项信息

Item encode itemValue;

id:key itemValue:value;

 

数据关系由MultiMap保存

Class.id:key Item.id:value

Class.id  Item.id 一对多关系

 

示例:

由一个分类id获取该分类所有网址

NSArray* urls = [Multimap getObject:class.id];      // 返回item.id 集合

for(id web in ruls)

{

   Item i;

   NSValue* value = [itemDic getObject:web];

   [value valueValue:&i];

   NSLog(@"id:%d", i.id);
   NSLog(@"name:%@",i.sName);
          NSLog(@"url:%@",i.sUrl);   
}

 

数据结构组中 使用字典分别保存分类与网址信息  它们之间的数据关系使用MultiMap保存两个id值。

 

2010/08/18下午

着手基本的界面制作 基本上完成网址类型显示 网址分类显示

2010/08/19

完成网站增加界面及将网站信息存储到plist,但发现plist设计存在问题

原有plist设计

网址类型 NSArray(NetType):NetType.plist

网站分类 NSMutableDictionary(WebClass):WebClass.plist

网站信息 NSMutableDictionary(WebNodes):WebSites.plist

数据关系 MyMultiMap(classVsNodesMap):ClassVsSitesMapping.plist 这个需要改成与方案相关的名称系统默认方案

NetType.plist与WebClass.plist 数据结构都没有问题

WebNodes 目前系统是将网站的结构体信息(id,classid,sName,surl) 编码为NSData 以网站id为关键字存储在WebSites字典中然后程序退出时将改动写入WebSites.plist中,由于是NSData 这样该plist就不可能手工编辑。

classVsSitesMap 在每次保存一个站点信息时 都将保存下站点与分类的数据关系 系统将站点 id及分类id编码为NSData

然后存储在classVsSitesMap可重复健值字典中 程序退出时写入ClassVsSitesMapping.plist中,由于是NSData 这样该plist就不可能手工编辑。

 

 

2010/08/20

准备做plist文件。由于上述的两个plist存在编辑问题,所以打算采取生成两种plist文件

一、采用串格式

        0:0:www.163.com:网易 手工制作当会容易,但程序需要格外时间来处理格式串。

二、采用数组存储网站信息

     NSArray* node = [NSArray initWithObject:[NSString:0], [NSString:0], [NSString:"www.163.com"],[NSString:"网易"],nil];

     然后以 id为关键字存储到WebNodes字典中

     这个程序中使用方便 WebSites.plist 也可以手工添加站点信息   缺点是 要占用存储空间及比处理结构体要慢些

三、采用原来的NSData编码 但用程序把一“串格式” 编码为NSData 然后生成.plist  这个好处是执行外部程序生成一次

以后应用真正运行起来由其本人增加。

想到plist制作麻烦,决定用户不能删除已有的网站信息 另外其本身也可以自己定制定方案。

今天(20)计划完成plist文件的制作

 

 

 

 

遗留问题 (2010/08/17)

 *关于内置网址与分类信息是手工写在程序里还是实现界面功能然后手工添加?

     由手工生成网站信息的格式串程序处理成plist文件

     plist文件生成可采用 数组及结构体  数组直接存储在字典中 结构体需要编码为NSData   (2010/08/20)

 *内置的网址与分类信息是否允许用户维护    可以维护(2010/08/31)

 

2010/08/31

从构想设计到今天(2010/08/31)刚好半个月  目前大体功能都已实现 还有不少细节需要修改。

 

补上几天前的记录

2010/08/25 20:30
完成网站信息显示
完成网站分类显示
初步设计方案数据存储结构
完成方案信息显示

方案数据结构设计:
编码 
EncodeMaps
customid: 方案信息字典id 与方案映射字典id
classIdKey: 方案中的分类数组
mMap:方案的分类与网站信息映射数据关系

用字典CustomMapDataDic  关键为customid为key
写其保存为CustomMaps.plist

解码:
将CustomMaps.plist读取到 CustomMapDataDic中
以key遍历使用NSKeyedUnarchiver 解码为 EncodeMap
使用CustomMapInfoDic字典保存 key为 customid

使用时获取customid 集合
取出一个id 访问 CustomMapInfoDic 返回方案的EncodeMap
其中 classIdKey 为分类数组
mMap为分类与网站的数据关系

for(id key in classIdKey)
{
    WebSiteKeys* webNode = [mMap objectForKey key];
}

2010/08/27
测试与调试 方案制定功能

2010/08/28
问题收集
网址类型 增加 删除 没完成
网址类型 显示类型名称时使用row 为 key获取名称
网站分类  增加 删除没完成

维护管理
操作
网址类型      维护管理 - 网址类型   {查看  删除  增加}
网站分类      维护管理 - 网站分类    查看分类列表{分类列表-分类网站信息 {查看该类网站信息   增加该类网站信息  删除该类网站信息  选择网站标签(无意义) }删除分类  增加分类  返回维护管理 }
网站信息       维护管理 - 网站信息    以分类分区显示网站信息   删除网站  返回维护管理  更多{显示分类网站信息}
方案信息      维护管理 - 方案列表   选择方案  方案详细(分区显示网站信息) 制定方案(定位到分类  分类再导航增加网站   选择网站有意义
 

2010/08/28   解码详细 
整理代码数据管理 (从重写初始化部分  及变量改名)
初步完成方案功能

2010/08/31
粗略完成上网功能

整理出未完成功能及问题如下
一 浏览界面未完成项
1.1   地址栏不能同步显示网址
1.2   地址栏没有显示刷新按钮
1.3   地址栏没有显示取消按钮

1.4   地址栏没有显示历名列表按钮
1.5   进前 后退 刷新 停止功能未实现
1.6   导航条未加“新建”页框按钮
1.7   双击导航条 不能“新建”
1.8   删除“页框” 不能动态更新现有页框
1.9   页框没有显示网址相关信息
1.10 页框没有显示加载图标
1.11 页框没有显示已经加载网站图标
1.12 页框没有关闭图标
1.13 激活页框没有动画调整宽度
1.14 页面没有状态栏



二 网站信息及维护需要修正问题
2.1 方案默认设置
2.2 使用方案中其它方案
2.3 方案写文件
2.4 网站制定写文件
2.5 类址类型增加  删除
2.6 网站分类增加  删除
2.7 网站信息删除
2.8 方案信息复重选入
2.9 方案复重选入
2.10 图表背景效果图

 

3) 具体测试与界面美化

基本上24个问题  预计在3-5天内解决  问题解决后 整体界面还需要美化。

问题解决时间表
2010/08/31
页框控件代码重新实现    事件采用协议方式实现
同时解决 1.1 -1.8问题

2010/09/01

解决 1.9 - 2.3

2010/09/02

解决 2.3- 2.10

 

整体的测试需要1 - 2时间

 

 2010-09-07

1.1 - 1.14 问题基本解决,还有历史浏览列表没有加。 地址栏界面还需要修改。
解决地址栏显示网站错乱问题
主要通过
    UIWebViewNavigationTypeLinkClicked,
    UIWebViewNavigationTypeFormSubmitted,
    UIWebViewNavigationTypeBackForward,
    UIWebViewNavigationTypeReload,
    UIWebViewNavigationTypeFormResubmitted,
    UIWebViewNavigationTypeOther
这几个标志 除other外都当做当前新打开连接进行保存  在保存同时需要进行超连接是否带"_blank"标记的处理。
带"_blank"标记检测代码如下:
// 判断是否带_blank标记超连接
-(BOOL) isBlankLink:(UIWebView*) webView HttpRequest:(NSURLRequest*) request
{
    if(webView == nil || request == nil)
    {
        return NO;
    }
   
    NSURL* URL = [request URL];
    NSString* URLString = [URL absoluteString];
   
   
    //NSLog(@"对比当前连接是否带有_blank标记");
    //NSLog(@"--------------------------------当前源网址:%@", URLString);
   
    int aLen = [[webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName(/"a/").length"] intValue];
    for (int n = 0; n < aLen; n ++)
    {
        // 获取href js脚本串
        NSString* html = [NSString stringWithFormat:@"document.getElementsByTagName(/"a/")[%d].href", n];
       
        // 获取href
        NSString* href = [webView stringByEvaluatingJavaScriptFromString:html];
        // NSLog(@"索号:%d 网址:%@", n,href);
       
        if ([URLString isEqualToString:href])
        {
            //NSLog(@"------------------------找到与当前连接相同网址, 开始测试是否带 _blank标记-------------------------");
            html = [NSString stringWithFormat:@"document.getElementsByTagName(/"a/")[%d].target", n];
            NSString* target = [webView stringByEvaluatingJavaScriptFromString:html];
           
            if([target isEqualToString:@"_blank"])
            {
                // NSLog(@"----------------------------------------------找到_blank标记 返回 yes");
               
                return YES;
            }
            else
            {
                // NSLog(@"-----------------------------------------------没有找到_blank标记");
                break;
            }
        }
    }
   
    return NO;
}

如果检测到“_blank标记” 则需要新建一个标签页来打开当前的网页。
这段代码存在效率问题,需要一个直接获取当前超连接是否有_blank标记的方法,不然每次打开网页时都要慢一些。



解决标签页显示网站图标问题
代码如下:
// 自动生成网站图标 传入一个urlrequest 与默认图标 返回 网站图标
-(UIImage*) webIconImage:(NSURLRequest*) request defaultIcon:(NSString*) name
{
    // 获取请求url
    NSURL* URL = [request URL];
   
    // 主机地址
    NSString* house = URL.host;
   
    // 生成图标路径
    NSString* webIconPath = [NSString stringWithFormat:@"http://%@/favicon.ico", house];
   
    // 生成图标资源url
    NSURL* webIconURL = [NSURL URLWithString:webIconPath];
   
    // 获取图标数据
    NSData* webIconData = [NSData dataWithContentsOfURL:webIconURL];
   
    UIImage* webIconImage;
    if(webIconData != nil)
    {
         webIconImage = [UIImage imageWithData:webIconData];
    }
    else
    {
        webIconImage = [UIImage imageNamed:@"name"];
    }
  
    return webIconImage;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值