14

每次对appStore进行更改时,是否可以在不提交应用程序的情况下更新phonegap中WWW文件夹的内容?它有任何法律问题吗?

4

4 回答 4

21

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

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

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

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

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

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

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

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

于 2012-12-06T18:24:05.253 回答
19

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

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];
}


其他参考:

于 2013-12-18T22:00:04.937 回答
1

好吧,由于 Phonegap 使用的是 WebView,您可以将部分代码存储在localstorage其中eval,并且每次用户可以访问 Internet 时,您都可以从您的服务器下载更新的部分代码并localstorage重新放置它们。

至于文件,您无法在打包时替换它们。

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

祝你好运!

于 2012-10-12T20:04:29.260 回答
-2

No, the www folder is packaged in your application so if you want to update those files you'll have to resubmit to the app store. Other platforms like Android and BB will allow you to host your app remotely but if you want to be in the iOS app store those files will need to be local.

于 2012-10-12T19:57:42.700 回答