как управлять версией базы данных sqlite для Lite до платной версии в приложении iphone?

-4

Я создал приложение iPhone, используя sqlite db. В этом sqlite db у меня есть файл историй, URL-адрес обращений к каталогам и другие параметры. Когда пользователь использует "облегченную" версию приложения, все работает нормально. Но когда я обновляю приложение с "облегченной" версии до "платной" версии, я хотел бы иметь возможность копировать базу данных и последние файлы в моем каталоге " Documents в "платное" приложение. Помощь будет оценена по достоинству.

спросил(а) 2021-01-19T21:37:40+03:00 2 месяца, 3 недели назад
1
Решение
124

Из-за песочницы приложения вы не можете делать то, что хотите, но есть ряд подходов:

Вместо отдельной версии pro, есть только одна версия приложения, которая предлагает In App Purchase, которая позволяет определенные функции. См. Раздел Преобразование приложения "lite" в приложение "pro" в приложении. Таким образом, это устраняет необходимость импорта файлов/настроек из одного приложения в другое.

Вы можете реализовать отдельную схему URL-адресов для бесплатных и бесплатных версий вашего приложения, чтобы они могли обменивать ограниченный объем данных по URL-адресу. Таким образом, pro pro, возможно, в первый раз, когда он запустится, проверьте, установлено ли приложение 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-адресов, и ее делегат должен будет ответить на этот запрос данных, в свою очередь, вызвать схему пользовательских 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;
}

В свою очередь, pro-версия может иметь настраиваемую схему URL для получения данных из облегченной версии приложения. Таким образом, обработчик pro app для данных из приложения 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 для импорта больших объемов данных, хотя я думаю, что это потребует, чтобы вы представили popover в Lite-приложении, чтобы пользователь мог указать, чтобы открыть файл данных в pro-приложении (который кажется inelegant).

Теоретически вы можете хранить данные в облаке, возможно, iCloud, DropBox или собственный сервер.

ответил(а) 2021-01-19T21:37:40+03:00 2 месяца, 3 недели назад
44

Если база данных в каталоге "Документы", то при обновлении вашего приложения iOS сохранится старая база данных.

ответил(а) 2021-01-19T21:37:40+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема