2011-10-16 12 views
7

W mojej aplikacji użytkownicy kupują materiały eksploatacyjne, powiedzmy walizki, które są przechowywane w danych podstawowych. Kiedy użytkownik po raz pierwszy instaluje aplikację, daje im darmowy dostęp. Aplikacja nie może działać bez co najmniej jednej konfiguracji walizki.Usługa iCloud umożliwia użytkownikom "kradzież" materiałów eksploatacyjnych w aplikacji

Ale jeśli użytkownik zainstaluje aplikację na swoim iPhonie, a następnie na iPadzie i zsynchronizuje te dwa, teraz ma 2 walizki. A jeśli odinstalują aplikację na dowolnym urządzeniu, a następnie zainstalują ją ponownie i zsynchronizują, otrzymają jeszcze jeden i mogą to zrobić w nieskończoność.

Widzę dwa rozwiązania, ale żadne z nich nie wydaje się słuszne:

  1. Dodaj wartość do NSUbiquityKeyValueStore gdy użytkownik najpierw synchronizuje się z iCloud. Sprawdź tę wartość przy pierwszym uruchomieniu. Jeśli jest zerowy, utwórz freebie, jeśli nie, zsynchronizuj dane. Ale to stwarza problem. Co jeśli użytkownik wyłącza iCloud lub nie ma połączenia internetowego przy pierwszym uruchomieniu. Aplikacja utworzy freebie, a następnie, gdy usługa iCloud będzie dostępna, zsynchronizuje duplikat i może to zrobić tyle razy, ile chce.

  2. W pewien sposób pasuje do domyślnych elementów każdej aplikacji. Miałem pomysł dopasowania objectID lub znaczników czasu, ale te byłyby różne i nie jestem pewien, jak sobie z tym poradzić.

Czy ktoś wie coś, co mogę zrobić w tej sprawie?

EDIT:

Korzystanie paczkowana bazy plusa migratePersistentStore: toURL: Opcje: withType: błąd: wydaje się być droga. Opublikuje odpowiedź z kodem, jeśli zadziała dla mnie.

+0

Może Twój przykład jest tylko kłopotliwe, ale dlaczego nie po prostu nigdy nie dać im wolną walizkę jeśli już macie? Mówisz, że aplikacja nie będzie działać bez walizki. Czy masz na myśli, że będzie funkcjonował, jeśli wcześniej mieli walizkę i ją skonsumowali? –

+0

@chrispix Przykro nam, aby przykład był tak abstrakcyjny. Zasadniczo nie "zużywasz" walizki, kupujesz tyle, ile chcesz i je gromadzisz. Jest to model "eksploatacyjny", ponieważ jest nieograniczony, ale produkt nie jest "konsumowany" przy zakupie, co jest kluczową różnicą. – ntesler

+0

Myślę, że widzę. Więc użytkownik ponownie instaluje, nie ma walizek, dajesz im jeden. Następnie wprowadzają jakieś dane uwierzytelniające, które pozwalają im wyciągnąć poprzednie walizki z serwera? –

Odpowiedz

0

Najlepszym rozwiązaniem jest, moim zdaniem, przechowywanie identyfikatorów UDID w tablicy w iCloud UbiquitousKeyValueStore.

//Store UDID in iCloud 
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0) { 
    if ([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) { 
     NSUbiquitousKeyValueStore *store = [NSUbiquitousKeyValueStore defaultStore]; 

     //Get array 
     NSMutableArray *devices = [NSMutableArray arrayWithArray:[store arrayForKey:@"UDID"]]; 
     [devices addObject:[[UIDevice currentDevice] uniqueIdentifier]]; 

     //Create new array, set to kvstore 
     NSArray *newDevices = [NSArray arrayWithArray:devices]; 
     [store setArray:newDevices forKey:@"UDID"]; 
     [store synchronize]; 
    } 
} 

...

//Check if app already installed on device 
    NSArray *devices = [[NSUbiquitousKeyValueStore defaultStore] arrayForKey:@"UDID"]; 

    for (NSString *UDID in devices) { 
     if ([UDID isEqualToString:[[UIDevice currentDevice] uniqueIdentifier]]) { 
       //stop the giveaway 
     } 
    } 
+2

... ale nie możesz już przechowywać identyfikatorów UDID, prawda? – 3zzy

1

Korzystanie z iCloud oznacza połączenie sieciowe. Natychmiast po podłączeniu urządzenia do sieci można sprawdzać wpływy i rejestrować zużycie materiałów eksploatacyjnych na własnych serwerach.

+0

Nie mam umiejętności niezbędnych do przygotowania tego, ale uważam, że używanie UbisquitousKeyValueStore w iCloud powinno być lepsze niż nic. – ntesler

3

Jeśli nie sprawdzasz paragonów i nie śledzisz materiałów eksploatacyjnych, które użytkownicy posiadają na własnych serwerach, robisz to źle. Zasadniczo ufasz, że użytkownik jest przyzwoity i uczciwy, co zwykle jest złym pomysłem.

Podczas korzystania z materiałów eksploatacyjnych w aplikacji należy prowadzić dziennik na serwerze gdzieś kupionych przez użytkowników. W ten sposób za każdym razem, gdy uruchomi się Twoja aplikacja, możesz zweryfikować na serwerze, czy obecna jest oczekiwana liczba materiałów eksploatacyjnych.

+1

Zasadniczo można ufać swoim klientom. Ci, którzy kradną, prawdopodobnie nigdy nie zapłaciliby w pierwszej kolejności. Również, jeśli masz fajną aplikację, powiedzą osobom nie posiadającym technicznych umiejętności, aby ją kupić, a następnie uzyskasz większą sprzedaż. Sztuczka polega na tym, aby nie było oczywiste, jak obejdzie się kupowanie rzeczy. –

+0

Problem nie dotyczy zakupów w aplikacji, ponieważ, jak możesz powiedzieć, możesz potwierdzić wpływy. Najtrudniejsze jest gratisy i sposób, w jaki każdy użytkownik dostaje freebie tylko raz. – Nestor

Powiązane problemy