【发布时间】:2012-10-12 18:50:50
【问题描述】:
是否可以在每次更改appStore时无需提交应用程序来更新phonegap中WWW文件夹的内容? 有什么法律问题吗?
【问题讨论】:
是否可以在每次更改appStore时无需提交应用程序来更新phonegap中WWW文件夹的内容? 有什么法律问题吗?
【问题讨论】:
简短的回答 - 是的,你可以 - 但你需要重新定位 www 才能写信。
长答案 - 收紧你的短裤朝圣者,这可能会变得颠簸......
因此,当您打包应用程序时,应用程序包包含您的 www 目录以及 PG 自包含 Web 应用程序的所有各种和杂项部分。应用程序包中的所有内容都是静态的 - 因此无法写入。但是,您可以为您的应用程序写入 NSDocumentDirectory - 它是私有的沙盒存储区域。
第一步是(在启动时)将您的 www 文件夹复制到 NSDocumentDirectory。
其次,您需要重写 CDVCommandDelegateImpl pathForResource 方法,以便将 PG 指向新的 www 位置。
此时,您的应用应该像包含在应用程序包中时那样运行。一个值得注意的例外是现在可以修改每个文件。
我的应用是可以包含附加内容的基础产品。如果我包含所有附加内容,则该应用程序的大小将达到数百 MB。因此,我将基本应用程序包含在单个(示例)数据包中,并且当用户需要扩展产品时,他们会选择额外的数据包,这些数据包会被下载、提取并复制到 www 文件夹的相应子目录中,因为它存在于NSDocumentDirectory。
作为奖励,如果我发现 HTML 中的错误 - 或想要添加功能,我可以这样做而无需重新提交应用程序。我需要重新提交应用程序的唯一原因是是否存在 Objective-C 错误修复。
【讨论】:
这只是添加到迈克尔的答案中。
1) 将您的 www 文件夹复制到 NSDocumentDirectory: - 对于 phonegap ios,将其添加到 /ProjectName/Classes/AppDelegate.m
- (BOOL)应用程序:(UIApplication*)应用程序didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { CGRect screenBounds = [[UIScreen mainScreen] bounds]; self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease]; self.window.autoresizesSubviews = YES; self.viewController = [[[MainViewController alloc] init] autorelease]; //self.viewController.useSplashScreen = YES; // 通过在 config.xml 中设置标签来设置应用的起始页。 // 如有必要,取消注释下面的行以覆盖它。 // self.viewController.startPage = @"index.html"; // 注意:要自定义视图的帧大小(默认为全屏),覆盖 // [self.viewController viewWillAppear:] 在你的视图控制器中。 self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; if ([[NSUserDefaults standardUserDefaults] boolForKey:@"AppFirstLaunch"]) { NSLog(@"应用已经启动!"); } 别的 { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"AppFirstLaunch"]; [[NSUserDefaults standardUserDefaults] 同步]; NSLog(@"App首次上线!"); 布尔成功1; NSError *error1; NSFileManager *fileManager1 = [NSFileManager defaultManager]; fileManager1.delegate = 自我; NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory1 = [paths1 objectAtIndex:0]; NSString *writableDBPath1 = [documentsDirectory1 stringByAppendingPathComponent:@"/www"]; 成功1 = [fileManager1 fileExistsAtPath:writableDBPath1]; 如果(成功1) { NSString *defaultDBPath1 = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"www"]; NSLog(@"默认成功/AppDelegate路径%@",defaultDBPath1); success1 = [fileManager1 copyItemAtPath:defaultDBPath1 toPath:writableDBPath1 error:&error1]; } 别的 { if (![[NSFileManager defaultManager] fileExistsAtPath:writableDBPath1]) [[NSFileManager defaultManager] createDirectoryAtPath:writableDBPath1 withIntermediateDirectories:NO attributes:nil error:&error1]; } } 返回是; }2) 要覆盖默认路径(原设置为 www 文件夹),请在 CordovaLib/Classes/CDVCommandDelegateImpl.m 中替换函数主体:
-(NSString*) pathForResource:(NSString*)resourcepath
与:
其他参考资料:
【讨论】:
好吧,由于 Phonegap 使用 WebView,您可以将部分代码存储在 localstorage 和 eval 中,并且每次用户可以访问互联网时,您都可以从您的服务器下载更新的部分代码并放置他们又在localstorage。
至于文件,打包后无法替换。
虽然这需要您设计一个巧妙的“更新”逻辑,因为让您的用户不了解更新和新功能/修复是一个坏主意。
祝你好运!
【讨论】:
不,www 文件夹已打包在您的应用程序中,因此如果您想更新这些文件,您必须重新提交到应用商店。 Android 和 BB 等其他平台将允许您远程托管您的应用,但如果您想在 iOS 应用商店中使用这些文件,则这些文件需要在本地。
【讨论】: