我使用 sqlite db 创建了 iPhone 应用程序。在这个 sqlite db 中,我有故事文档、目录图像 url 和其他参数。当用户使用应用程序的“精简版”版本时,一切正常。但是当我将应用程序从“精简”版本升级到“付费”版本时,我希望能够将我Documents
目录中的数据库和最新文件复制到“付费”应用程序。协助将不胜感激。
2 回答
由于应用程序沙盒,您无法精确地做您想做的事,但有多种方法:
而不是单独的专业版,只有一个应用程序版本,它提供启用某些功能的应用内购买。请参阅在应用程序中将“lite app”转换为“pro app”。因此,这消除了将文件/设置从一个应用程序导入另一个应用程序的需要。
您可以为您的应用程序的免费版和专业版实施单独的自定义 URL 方案,以允许它们通过 URL 交换有限数量的数据。因此,专业版应用程序可能会在第一次运行时检查是否安装了精简版应用程序,如果是,则向其请求数据:
- (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]; } }
精简版显然必须设置它的 Info.plist 来注册这个自定义 URL 方案,并且它的应用程序委托需要响应这个数据请求,进而调用专业应用程序的自定义 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 应用程序的数据的 pro 应用程序处理程序可能如下所示:
- (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 应用程序中显示一个弹出框,以便用户指定在 pro 应用程序中打开数据文件(其中看起来不优雅)。
从理论上讲,您可以将数据存储在云端,可能是 iCloud、DropBox 或您自己的服务器。
如果 Documents 目录中的数据库,那么在更新您的应用程序时,iOS 会保留旧数据库。