我使用sqlite db创建了iPhone应用程序。在这个sqlite db我有故事文档,目录图像url和其他参数。当用户使用应用程序的“精简版”时,一切正常。但是当我将应用程序从“精简”版本升级到“付费”版本时,我希望能够将我的Documents
目录中的数据库和最新文件复制到“付费”应用程序。将不胜感激。
答案 0 :(得分:0)
如果Documents目录中的数据库然后在更新你的应用程序iOS时保留旧数据库。
答案 1 :(得分:0)
由于应用沙盒,你无法做到你想要的,但有很多方法:
而不是单独的专业版,只有一个版本的应用程序,它提供启用某些功能的In App Purchase。见Convert the "lite app" to "pro app" within the application。因此,这消除了将文件/设置从一个应用程序导入到另一个应用程序的需要。
您可以为应用的免费版和专业版实施单独的custom URL scheme,以允许他们通过网址交换有限数量的数据。因此,专业应用程序可能会在第一次运行时检查Lite应用程序是否已安装,如果是,请从中请求数据:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
BOOL runAlready = [userDefaults boolForKey:kRunAlready];
if (!runAlready)
{
[userDefaults setBool:YES forKey:kRunAlready];
[userDefaults synchronize];
[self importDataFromLite];
}
}
- (void)importDataFromLite
{
NSURL *liteURL = [NSURL URLWithString:@"testapp-lite://getdata"];
// if we can open test app, then test app installed, so launch it, providing "getdata" request
if ([[UIApplication sharedApplication] canOpenURL:liteURL])
{
// Getting data from lite app
[[UIApplication sharedApplication] openURL:liteURL];
}
}
Lite版本显然必须设置其Info.plist以注册此自定义URL方案,并且其app委托需要响应此数据请求,然后调用专业应用程序的自定义URL方案发送数据回来了:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
[[[UIAlertView alloc] initWithTitle:nil message:[url absoluteString] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
if ([[url absoluteString] isEqualToString:@"testapp-lite://getdata"])
{
// I'm going to create URL from local NSDictionary, but you would presumably retrieve data from your model/database
NSDictionary *dictionary = @{@"name" : @"Rob", @"age" : @"29"};
NSMutableArray *array = [NSMutableArray array];
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, NSString *obj, BOOL *stop) {
[array addObject:[NSString stringWithFormat:@"%@=%@", key, [obj stringByAddingPercentEscapesForURLParameterUsingEncoding:NSUTF8StringEncoding]]];
}];
// now create the URL
NSURL *proURL = [NSURL URLWithString:[NSString stringWithFormat:@"testapp-pro://data?%@", [array componentsJoinedByString:@"&"]]];
// if we can open pro app, then then do so, providing "getdata" request
if ([[UIApplication sharedApplication] canOpenURL:proURL])
{
NSLog(@"Opening pro app");
[[UIApplication sharedApplication] openURL:proURL];
}
}
return YES;
}
反过来,专业版可以有自定义URL方案来从应用程序的精简版本接收数据。因此,专业应用程序来自lite应用程序的数据处理程序可能如下所示:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
NSArray *absoluteStringComponents = [[url absoluteString] componentsSeparatedByString:@"?"];
NSArray *parameters = [absoluteStringComponents[1] componentsSeparatedByString:@"&"];
for (NSString *parameter in parameters)
{
NSArray *parameterComponents = [parameter componentsSeparatedByString:@"="];
// I'm just logging the results, but you'd presumably integrate the results into your model
NSLog(@"%@ is equal to %@", parameterComponents[0], [parameterComponents[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);
}
return YES;
}
这适用于适量的基本数据,但我不认为它非常适合交换图像文件。如果有兴趣,我可以告诉你这个例子。
在上面的变体中,您可以使用UIDocumentInteractionController导入更大量的数据,但我认为这会要求您在lite应用中显示一个popover,供用户指定在专业应用程序中打开数据文件(看起来不太优雅)。
理论上,您可以将数据存储在云端,可能是iCloud,DropBox或您自己的服务器。