将iOS Web应用程序转换为本地应用程序

3

我主要是一名网站开发者,突然被要求为我们举办的会议制作一个iOS应用程序。

我们已经构建了会议的Web应用程序,并将其托管在我们的Web服务器上。参照这里的教程,我成功地制作了一个非常简单的应用程序,可以在UIWebView中显示内容。

我们的另一位开发人员已经为Android构建了一个应用程序,该应用程序将缓存页面,并检查服务器上的.txt文件以查看内容是否有更改。如果内容有更改,则会获取新的内容。(会议日程非常容易更改)。

我希望在我的iOS应用程序中实现类似的功能。是否有简单的方法来做到这一点?

这是我的ViewController.m代码:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize appView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *path = [NSURL URLWithString:[NSString stringWithFormat:@"http://ict.uiuc.edu/railroad/GLXS/app/index.html"]];
    NSURLRequest *request = [NSURLRequest requestWithURL:path];
    [appView loadRequest:request];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

3
苹果应用商店审批指南2.12规定:不是非常有用、独特,只是将网站捆绑成应用程序或者没有提供任何持久娱乐价值的应用可能会被拒绝。链接 - modus
2
您需要将应用程序发布到App Store吗?使用移动优化的网站来代替“应用程序”有什么问题吗?或者,您可以将此网站的链接保存到设备的主屏幕上,它会像应用程序一样出现。 - Aaron
你需要缓存一些像JS或图片这样的文件吗?还是只有.html页面? - skrew
我担心它不符合审批准则,因为它的实用性值得怀疑。只是尝试做我被分配的任务。所以,似乎这个应用程序将被拒绝。但出于学习目的,@skrew,让我们假设我只需要缓存 .html 页面(尽管页面包含图像)。 - Collin
实用性是主观的。虽然我不是非本地开发的粉丝,但我认为他们更多地指的是一些非常明显的网站外观应用程序。再次强调,这是主观的。在提交之前无法知道苹果是否会批准。 - logixologist
3个回答

3

如果我没错的话,您需要做的就是在远程.txt文件上执行编辑操作时刷新Web视图。在我看来,您可以在应用程序第一次运行时下载该文件,然后设置一个计时器,在时间间隔(比如1分钟或1秒)内检查远程文件属性。 以下是示例代码,如果文件被修改将触发并返回true。

//here is sample code that will return true if file is modified
//url:your remote file url. filePathe: local file that you downloade when you app is run for  first time
+ (BOOL)isServerURL:(NSString *)url NewerThanLocalFile:(NSString *)filePath {

if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {


    NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];

    NSDate *date = [attributes fileModificationDate];

    NSString *lastModifiedString = nil;
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: url] cachePolicy:NSURLCacheStorageAllowed timeoutInterval:2];
    [request setHTTPMethod:@"HEAD"];
    NSHTTPURLResponse *response;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];
    if ([response respondsToSelector:@selector(allHeaderFields)]) {
        lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"];
    }

    NSDate *lastModifiedServer = nil;
    @try {

        //set time format as required
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
        df.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
        df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
        lastModifiedServer = [df dateFromString:lastModifiedString];
    }
    @catch (NSException * e) {
        NSLog(@"Error parsing last modified date: %@ - %@", lastModifiedString, [e description]);
    }

    if ([date laterDate:lastModifiedServer] == lastModifiedServer)
    {
        return YES;
    } else {
        return NO;
    }

} else {
    return YES;
}
}

如果计时器返回 YES,请刷新您的 Web 视图。希望我表达清楚了。

2
你实际上创建了一个非常简单的混合应用程序,即部分本地代码和部分网络内容。有许多框架可以使这种事情变得更加容易。最著名的是PhoneGap,其开源版本为Apache Cordova。您可以使用Cordova来构建您的应用程序,或者您可以查看源代码并在自己的代码中使用相同的技术。
由于您的问题似乎涉及缓存内容,因此您可以查看HTML5的应用程序缓存,它应该可以在有或没有PhoneGap的情况下正常工作。
请参阅如何在PhoneGap中缓存图像和html文件在iPhone Phonegap应用程序上下载图像并本地保存获取更多信息。

1
您还可以定期检查服务器上的 .txt 文件是否已更改,如果是,则使用以下代码重新加载网站。
[appView reload];

或者,您可以在网页视图的角落上放置一个刷新按钮,并且可以按需检查。

请问为什么我被踩了?我的解决方案在这种情况下是正确的,他需要一个快速修复,他的同事开发者也是这样做的,除了这种方法效率低下之外,没有任何问题。 - Venky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接