2011-10-16 18 views
7

Trong ứng dụng của tôi, người dùng mua vật tư tiêu hao, giả sử vali được lưu trữ trong Dữ liệu chính. Khi người dùng cài đặt ứng dụng lần đầu tiên, tôi cung cấp cho họ một người dùng miễn phí để bắt đầu. Ứng dụng không thể hoạt động nếu không có ít nhất một vali được thiết lập.iCloud giúp người dùng "ăn cắp" Hàng tiêu dùng trong ứng dụng

Nhưng nếu người dùng cài đặt ứng dụng trên iPhone của họ và sau đó là iPad của họ và đồng bộ hóa cả hai, giờ đây họ có 2 va li. Và nếu họ gỡ cài đặt ứng dụng trên một trong hai thiết bị, sau đó cài đặt lại và đồng bộ hóa ứng dụng, họ vừa mới nhận được thêm một thiết bị và họ có thể thực hiện điều đó vô thời hạn.

tôi có thể thấy hai giải pháp, nhưng không ai trong số họ có vẻ đúng:

  1. Thêm một giá trị để NSUbiquityKeyValueStore khi người dùng đồng bộ đầu tiên với iCloud. Kiểm tra giá trị này khi khởi chạy lần đầu tiên. Nếu không, hãy tạo freebie, nếu không, hãy đồng bộ dữ liệu. Nhưng điều này tạo ra một vấn đề. Điều gì sẽ xảy ra nếu người dùng tắt iCloud hoặc không có kết nối internet khi khởi chạy lần đầu tiên. Các ứng dụng sẽ tạo ra các freebie, sau đó khi iCloud có sẵn, đồng bộ hóa các bản sao, và họ có thể làm điều này nhiều lần như họ muốn.

  2. Cách nào đó khớp với các mục mặc định trên mỗi ứng dụng. Tôi đã có ý tưởng phù hợp với objectID hoặc dấu thời gian, nhưng chúng sẽ khác nhau và tôi không chắc chắn làm thế nào để xử lý nó.

Có ai biết điều gì tôi có thể làm được không?

EDIT:

Sử dụng một cơ sở dữ liệu đóng gói sẵn cộng với migratePersistentStore: tourl: tùy chọn: withType: Lỗi: có vẻ là con đường để đi. Sẽ đăng một câu trả lời với mã nếu nó làm việc cho tôi.

+0

Có lẽ ví dụ của bạn chỉ là khó hiểu, nhưng tại sao không chỉ không bao giờ cung cấp cho họ một chiếc vali miễn phí nếu họ đã có một? Bạn nói rằng ứng dụng sẽ không hoạt động nếu không có va li. Bạn có nghĩa là nó sẽ hoạt động nếu họ đã có một va li trước đó và tiêu thụ nó? –

+0

@chrispix Xin lỗi làm cho ví dụ trở nên trừu tượng. Về cơ bản, bạn không "tiêu thụ" vali, bạn mua bao nhiêu tùy thích và bạn tích lũy chúng. Đó là một mô hình "có thể tiêu thụ" vì nó không giới hạn, nhưng mặt hàng đó không thực sự "tiêu thụ" khi mua, mà tôi đoán là sự khác biệt chính. – ntesler

+0

Tôi nghĩ tôi thấy. Vì vậy, người dùng cài đặt lại, không có va li, bạn cung cấp cho họ một. Sau đó, họ nhập một số thông tin cho phép họ kéo vali trước đó từ máy chủ của bạn? –

Trả lời

0

Giải pháp tốt nhất cho điều này, theo ý kiến ​​của tôi, là lưu trữ UDID trong một mảng trong 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

... nhưng bạn không thể lưu trữ UDID nữa, đúng không? – 3zzy

1

Sử dụng iCloud ngụ ý kết nối mạng. Ngay sau khi thiết bị kết nối với mạng, bạn có thể xác thực biên nhận và đăng nhập mức tiêu thụ của một máy tiêu thụ trên máy chủ của riêng bạn.

+0

Tôi không có kỹ năng cần thiết để thiết lập điều đó, nhưng tôi tin rằng việc sử dụng UbiquitousKeyValueStore của iCloud sẽ tốt hơn là không có gì. – ntesler

3

Nếu bạn không xác thực biên nhận và theo dõi những gì người dùng hàng tiêu dùng sở hữu trên máy chủ của riêng bạn mà bạn đang làm sai. Về cơ bản, bạn tin tưởng người dùng là phong nha và trung thực, thường là ý tưởng tồi.

Khi bạn sử dụng hàng tiêu dùng trong ứng dụng, bạn nên giữ nhật ký trên máy chủ ở nơi nào đó mà người dùng của bạn đã mua. Bằng cách đó, mỗi lần ứng dụng của bạn khởi động, ứng dụng có thể xác minh với máy chủ rằng số lượng hàng hóa tiêu thụ dự kiến ​​có mặt.

+1

Nói chung là ok để tin tưởng khách hàng của bạn. Những người ăn cắp có khả năng sẽ không bao giờ trả tiền ngay từ đầu. Ngoài ra nếu bạn có một ứng dụng tốt đẹp, họ sẽ nói với những người không hiểu biết về mặt kỹ thuật để mua nó, và sau đó bạn nhận được nhiều doanh thu hơn. Bí quyết là làm cho nó không rõ ràng như thế nào bạn sẽ nhận được xung quanh việc mua công cụ. –

+0

Vấn đề không phải là mua hàng trong ứng dụng bởi vì, như bạn nói, bạn có thể xác nhận biên nhận. Các bit khó khăn là freebies và làm thế nào bạn đảm bảo mỗi người dùng được các freebie chỉ một lần. – Nestor

Các vấn đề liên quan