appStoreに変更を加えるたびにアプリを送信せずに、phonegapのWWWフォルダーのコンテンツを更新することはできますか?法的な問題はありますか?
4 に答える
簡単な答え-はい、できます-しかし、書き込みを行う前にwwwを再配置する必要があります。
長い答え-ショーツの巡礼者を締めてください、これはでこぼこになるかもしれません....
そのため、アプリをパッケージ化すると、アプリバンドルにはwwwディレクトリと、PG自己完結型Webアプリのさまざまなさまざまな部分がすべて含まれます。アプリバンドルの一部であるものはすべて静的であるため、書き込むことはできません。ただし、アプリケーションのNSDocumentDirectoryに書き込むことはできます。これは、サンドボックス化されたプライベートストレージ領域です。
最初のステップは、(起動時に)wwwフォルダーをNSDocumentDirectoryにコピーすることです。
次に、PGを新しいwwwの場所に向けるために、CDVCommandDelegateImplpathForResourceメソッドをオーバーライドする必要があります。
この時点で、アプリはアプリバンドルに含まれているときと同じように動作しているはずです。注目すべき例外の1つは、各ファイルを変更できるようになったことです。
私のアプリは、アドオンコンテンツを持つことができる基本製品です。すべてのアドオンコンテンツを含めると、アプリのサイズは数百MBになります。そこで、基本的なアプリに単一の(サンプル)データパッケージを含めます。ユーザーは製品を拡張する必要があるため、追加のデータパッケージを選択します。これらのデータパッケージは、ダウンロード、抽出、およびwwwフォルダーの適切なサブディレクトリにコピーされます。 NSDocumentDirectory。
ボーナスとして、HTMLにバグを見つけた場合、または機能を追加したい場合は、アプリを再送信せずに追加できます。アプリを再送信する必要がある唯一の理由は、Objective-Cのバグ修正があるかどうかです。
これはマイケルの答えに追加されているだけです。
1) wwwフォルダーをNSDocumentDirectoryにコピーします。--phonegap iosの場合は、これを/ProjectName/Classes/AppDelegate.mに追加します。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{{
CGRect screenBounds =[[UIScreenmainScreen]境界];
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.viewControllerviewWillAppear:]。
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
if([[NSUserDefaults standardUserDefaults] boolForKey:@ "AppFirstLaunch"])
{{
NSLog(@ "アプリはすでに起動しています!");
}
そうしないと
{{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@ "AppFirstLaunch"];
[[NSUserDefaultsstandardUserDefaults]同期];
NSLog(@ "アプリが初めて起動しました!");
BOOLの成功1;
NSError * error1;
NSFileManager * fileManager1 = [NSFileManager defaultManager];
fileManager1.delegate = self;
NSArray * paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES);
NSString * documentsDirectory1 = [paths1 objectAtIndex:0];
NSString * writableDBPath1 = [documentsDirectory1 stringByAppendingPathComponent:@ "/ www"];
success1 = [fileManager1 fileExistsAtPath:writableDBPath1];
if(success1)
{{
NSString * defaultDBPath1 = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@ "www"];
NSLog(@ "default SUCCESS / AppDelegate path%@"、defaultDBPath1);
success1 = [fileManager1 copyItemAtPath:defaultDBPath1 toPath:writableDBPath1 error:&error1];
}
そうしないと
{{
if(![[NSFileManager defaultManager] fileExistsAtPath:writableDBPath1])
[[NSFileManager defaultManager] createDirectoryAtPath:writableDBPath1 withIntermediateDirectories:NO属性:nilエラー:&error1];
}
}
YESを返します。
}
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*ファイル名=[directoryPartslastObject];
[directoryParts removeLastObject];
NSString * directoryPartsJoined = [directoryParts componentsJoinedByString:@ "/"];
NSString * directoryStr = [self wwwFolderName];
if([directoryPartsJoined length]> 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];
}
その他の参考資料:
PhonegapはWebViewを使用しているため、コードの一部をそこに保存できますlocalstorage。evalユーザーがインターネットにアクセスできるたびに、サーバーからコードの更新された部分をダウンロードして、localstorage再度配置できます。
ファイルはパッケージ化されているため、置き換えることはできません。
ただし、更新や新機能/修正についてユーザーに通知しないようにするのは悪い考えであるため、これには巧妙な「更新」ロジックを設計する必要があります。
幸運を!
いいえ、wwwフォルダーはアプリケーションにパッケージ化されているため、これらのファイルを更新する場合は、アプリストアに再送信する必要があります。AndroidやBBなどの他のプラットフォームでは、アプリをリモートでホストできますが、iOSアプリストアに参加したい場合は、これらのファイルをローカルにする必要があります。