【问题标题】:Phonegap - Updating JavaScript and CSS without submitting the app to appStorePhonegap - 更新 JavaScript 和 CSS 而不将应用程序提交到 appStore
【发布时间】:2012-10-12 18:50:50
【问题描述】:

是否可以在每次更改appStore时无需提交应用程序来更新phonegap中WWW文件夹的内容? 有什么法律问题吗?

【问题讨论】:

    标签: cordova app-store


    【解决方案1】:

    简短的回答 - 是的,你可以 - 但你需要重新定位 www 才能写信。

    长答案 - 收紧你的短裤朝圣者,这可能会变得颠簸......

    因此,当您打包应用程序时,应用程序包包含您的 www 目录以及 PG 自包含 Web 应用程序的所有各种和杂项部分。应用程序包中的所有内容都是静态的 - 因此无法写入。但是,您可以为您的应用程序写入 NSDocumentDirectory - 它是私有的沙盒存储区域。

    第一步是(在启动时)将您的 www 文件夹复制到 NSDocumentDirectory。

    其次,您需要重写 CDVCommandDelegateImpl pathForResource 方法,以便将 PG 指向新的 www 位置。

    此时,您的应用应该像包含在应用程序包中时那样运行。一个值得注意的例外是现在可以修改每个文件。

    我的应用是可以包含附加内容的基础产品。如果我包含所有附加内容,则该应用程序的大小将达到数百 MB。因此,我将基本应用程序包含在单个(示例)数据包中,并且当用户需要扩展产品时,他们会选择额外的数据包,这些数据包会被下载、提取并复制到 www 文件夹的相应子目录中,因为它存在于NSDocumentDirectory。

    作为奖励,如果我发现 HTML 中的错误 - 或想要添加功能,我可以这样做而无需重新提交应用程序。我需要重新提交应用程序的唯一原因是是否存在 Objective-C 错误修复。

    【讨论】:

    • 你能把完成这个的代码放在github或其他地方吗?我真的很感激能够看到一份工作副本。
    【解决方案2】:

    这只是添加到迈克尔的答案中。

    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


    与:

    - (NSString*)wwwFolderName { NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return [NSString stringWithFormat:@"%@/www",[searchPaths objectAtIndex:0]]; } - (NSString*) pathForResource:(NSString*)resourcepath { NSBundle* mainBundle = [NSBundle mainBundle]; NSMutableArray* directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]]; NSString* 文件名 = [directoryParts lastObject]; [directoryParts removeLastObject]; NSString* directoryPartsJoined = [directoryParts componentsJoinedByString:@"/"]; NSString* directoryStr = [self wwwFolderName]; if ([directoryPartsJoined 长度] > 0) { directoryStr = [NSString stringWithFormat:@"%@/%@", [self wwwFolderName], [directoryParts componentsJoinedByString:@"/"]]; } NSLog(@"默认路径 %@",directoryStr); if (![[self wwwFolderName] isEqualToString:@"www"]) { return [NSString stringWithFormat:@"%@/%@",[self wwwFolderName],@"shared/index.html"]; } return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr]; }


    其他参考资料:

    【讨论】:

    • 我比我更喜欢您的代码 - 感谢您扩展我的方法,我从您那里学到了一些东西。
    • 客户不可避免地希望在 Android 应用程序中使用此功能 - 您对我需要从哪里开始完成同样的事情有什么建议吗?
    • 我实际上采纳了您最初的想法,并将其用于与工作相关的项目。这使我们能够将应用程序精简到最初与应用程序一起加载的几个核心部分(700mb 到 38mb),然后我们使用不同的清单来指示哪些部分可以更新或需要下载。
    【解决方案3】:

    好吧,由于 Phonegap 使用 WebView,您可以将部分代码存储在 localstorageeval 中,并且每次用户可以访问互联网时,您都可以从您的服务器下载更新的部分代码并放置他们又在localstorage

    至于文件,打包后无法替换。

    虽然这需要您设计一个巧妙的“更新”逻辑,因为让您的用户不了解更新和新功能/修复是一个坏主意。

    祝你好运!

    【讨论】:

    • 不要使用本地存储。如果内存不足,iOS会回收它,它不能指望它
    【解决方案4】:

    不,www 文件夹已打包在您的应用程序中,因此如果您想更新这些文件,您必须重新提交到应用商店。 Android 和 BB 等其他平台将允许您远程托管您的应用,但如果您想在 iOS 应用商店中使用这些文件,则这些文件需要在本地。

    【讨论】:

    • 我知道文件必须是本地的,但是如果我们通过插件或本机代码替换 www 中的文件呢?
    • @Ard 您无法写入 www 目录。它是您应用程序的一部分,如果您能够修改内容,它将更改应用程序的校验和,从而使其无效。不能修改 www 目录的内容是操作系统的一项安全功能。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2012-01-26
    • 2014-07-23
    • 2021-11-21
    • 2010-12-04
    • 2012-04-25
    相关资源
    最近更新 更多