web-gelistirme-sc.com

Bir iOS kullanıcısını benzersiz şekilde tanımlama

Bir uygulamanın yeni kullanıcıları için sunucuda bir kullanıcı hesabı oluşturmak istiyorum, ancak kullanıcıdan hiçbir şey yazmasını istemem. İdeal olarak, Game Center'daki gibi otomatik olmasını isterim.

Ama mümkün olup olmadığını merak ediyorum. Kullanıcıyı benzersiz bir şekilde tanımlamak için kullanabileceğim bir şey var mı? Kullanıcının Apple kimliğini öğrenmem pek mümkün değil. Ayrıca, cihaz kimliği kullanıcıyı değil cihazı benzersiz bir şekilde tanımlar, bu nedenle kullanıcının daha fazla cihaza sahip olması yararsızdır ...

Kullanabileceğim başka bir şey var mı?

Gizlilik hakkında - Kullanıcının arkasından bir şey öğrenmek istemiyorum. Kullanıcıdan, kendi bilgilerine erişmesini isteme konusunda hiçbir sorunum yok (ve bana bu bilgiyi veren bir API varsa, eğer API kendisinden isterse çok iyi olurdu). Steve Jobs’un kendisinin de söylediği gibi, gizlilik meselesi budur - uygulamaları özel verileriyle ilgili herhangi bir şey yapmadan önce kullanıcıdan izin istemek için zorlamak.

36
rid

Doğru çözüm, iCloud Anahtar Değer Deposunu kullanmaktır; burada, herhangi bir kimlik doğrulama veya e-posta adresi gibi bir kullanıcı bilgisi gerektirmeden benzersiz bir kullanıcı kimliği saklayabilirsiniz. 

Sonuç, her kullanıcı için farklı olan, ancak aynı iTunes hesabına kayıtlı birden fazla cihaz için aynı değere sahip olacak olan rasgele bir UUID (kullanıcıyı gerçekten kimliği belirten hiçbir şey değil).

İCloud KV Mağazamızda bir alan tanımlarız, hadi kullanıcı kimliği diyelim. Uygulama başlatıldığında, önce kullanıcı kimliğini kontrol ederiz. Eğer oradaysa, o zaman hepimiz kullanıcının benzersiz kimliği ile hazırız. Değilse, o zaman bu kullanıcı için ilk kez çalışıyoruz. Rasgele bir UUID üretir ve kullanıcı kimliği altındaki KV Mağazasında depolarız. Hepsi bu kadar.

Deneyimlerimiz bu UUID’in iTunes’a göre benzersiz olduğunu gösteriyor. Son kullanıcılarınız aile paylaşımını kullanıyorsa, bu hesaplara farklı UUID'ler atanır (istenebilir veya olmayabilir ancak bu konuda yapabileceğiniz hiçbir şey yoktur). Aynı iTunes hesabı altında başlatılan herhangi bir cihaz aynı UUID'yi görecektir.

Bu yaklaşım tamamen okunaklıdır ve Apple tarafından herhangi bir sorun olmadan onaylanması gerekir.

Belli ki, Yetenekler altında Xcode'da iCloud Anahtar-Değer deposunu etkinleştirmelisiniz, sadece iCloud Switch'i açın.

İşte bu kavramı Objective-C'de uygulayan basit bir sınıf:

@implementation EEUserID

+ (NSUUID *) getUUID
{
    NSUUID *uuid = nil;
    NSString *uuidString = [[NSUbiquitousKeyValueStore defaultStore] stringForKey: @"EEUserID"];
    if (uuidString == nil)
    {
        // This is our first launch for this iTunes account, so we generate random UUID and store it in iCloud:
        uuid = [NSUUID UUID];
        [[NSUbiquitousKeyValueStore defaultStore] setString: uuid.UUIDString forKey: @"EEUserID"];
        [[NSUbiquitousKeyValueStore defaultStore] synchronize];
    }
    else
    {
        uuid = [[NSUUID alloc] initWithUUIDString: uuidString];
    }

    return uuid;
}

+ (NSString *) getUUIDString
{
    NSUUID *uuid = [self getUUID];
    if (uuid != nil)
        return uuid.UUIDString;
    else
        return nil;
}

+ (void) load
{
    // get changes that might have happened while this
    // instance of your app wasn't running
    [[NSUbiquitousKeyValueStore defaultStore] synchronize];
}

@end

Ve başlık dosyası için:

#import <Foundation/Foundation.h>

@interface EEUserID : NSObject

+ (NSUUID *) getUUID;
+ (NSString *) getUUIDString;

@end

Kullanmak için yapmanız gereken tek şey çağırmaktır:

NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString];

Keyfini çıkarın.

23
ldoogy

Bununla bir UUID oluşturun:

NSString *UUID() {
    CFUUIDRef cfuuid = CFUUIDCreate(NULL); 
    NSString *uuid =  (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfuuid); 
    CFRelease(cfuuid);
    return uuid;
}

Buradaki hiçbir şey Apple tarafından itiraz edilemez veya kaşlarını çatmaz - aslında, bunu yapmayı önerdikleri yoldur. Oluşturulan UUID'yi anahtarlığa depolayın; kullanıcı uygulamanızı kaldırıp yeniden yüklese bile orada olacak. UUID, aygıt ve oluşturulduğu zaman için benzersizdir.

Daha sonra kullanıcının aygıtlarını birlikte gruplandırması için çeşitli şemaları kullanabilirsiniz - iCloud veya sunucudan aldığınız bir anahtar.

İyi şanslar!

Ekleme:

Uuid'i bir kullanıcı adı olarak kullanarak ve rastgele bir parola oluşturarak, bunu anahtarlıkta nasıl sakladığımı şu şekilde bulabilirsiniz:

uuid = UUID();
[keychainItemWrapper setObject:uuid forKey:(__bridge_transfer id)kSecAttrAccount];
NSString *pass_token = randomString(10);
[keychainItemWrapper setObject:pass_token forKey:(__bridge_transfer id)kSecValueData];

Tüm bunların, kullanıcının herhangi bir girişi olmadan yapılabileceğini unutmayın.

Güncelleme:

MCSMKeychainItem , UUID oluşturma ve [MCSMApplicationUUIDKeychainItem applicationUUID] ile depolama için harika bir çözüme sahiptir. Kütüphanede ayrıca [MCSMGenericKeychainItem genericKeychainItemWithService:service username:username password:password] vardır. Birlikte, bu işlevler yukarıda belirtilen her şeye dikkat eder. CocoaPods ile kurulumu kolaydır.

22
Erik

Radu

Mükemmel soru Açıkladığınız sorunu Urban Airship'i (urbanairship.com) uygulamalarımıza entegre ederek çözdük. Urban Airship, uygulama içi satın alımları, makbuz doğrulama, abonelik kurtarma, içerik teslimi ve Apple Push Bildirimi'ni desteklemek için geniş bir işlevsellik çantası sunar.

Urban Airship ile ilgili en güzel şeylerden biri, bir cihazı değil, bir e-posta adresini kullanarak bir "kullanıcıyı" belirleme yeteneğidir. Bu gerçekten reklamı yapılan bir "özellik" değil ... amaçlanan işlevselliğinin bir yan ürünü.

İşte bulduklarımızı ve yaşadığınız problemi çözmek için Urban Airship'ten nasıl yararlanabileceğimizi.

Bir kullanıcı, Urban Airship'in entegre edilmiş olduğu uygulamanızı yüklediğinde, UA bir şekilde UDID benzeri bir sayı oluşturur; 

Bununla birlikte, Urban Airship'in abonelik kurtarma bileşenlerinden yararlanırsanız, kullanıcının bir e-posta adresi girmesini sağlayabilirsiniz. Kullanıcı ilk cihaza e-posta adresini girdiğinde ... oluşturulan kimlik, kullanıcı kimliğinin ana yöntemi haline gelir ve bu e-posta adresiyle ilişkilendirilir. Bir sonraki cihazlara e-posta adreslerini girdiklerinde, Urban Airship bir e-posta doğrulama işlemini tetikleyecektir. Kullanıcı doğrulama işlemini tamamladığında, yeni cihazın kimliğini ilk cihazın kimliğiyle aynı olacak şekilde günceller. Bunun en iyi yanı ... hepsi otomatik sihir! Siz sadece bileşenleri entegre edin ve kullanıcının e-posta adresini girmesini sağlayın. Her şeyi bir saat içinde hazırlayabilmeli ve çalışabilmelisiniz.

Ayrıca, kullanıcının tüm cihazlarıyla ilişkili e-posta adresini değiştirmesine olanak sağlayan işlevsellik sunar.

Aslında uyguladık ve çok iyi çalışıyor!

NOT: 1 Temmuz 2013'ten itibaren Urban Airship, abonelik ve geri kazanım işlevselliğini kaldırıyor

4
radesix

Erik'in önerdiği gibi bir UUID üretmek kesinlikle sağlam bir çözüm. Tek (küçük) uyarı, tam bir iDevice geri yüklemesi durumunda, anahtarlığın da silineceği olabilir. Uygulama bu senaryoda yeni bir UUID oluşturacaktır ve iDevice artık mevcut bir kullanıcıyla ilişkili olamaz.

Bir iDevice'ı benzersiz bir şekilde tanımlamak için başka bir yaklaşım, ağ arayüzünün MAC adresini temel alan benzersiz bir kimlik oluşturmak ve bunu uygulama paketi kimliği ile birleştirmek. Bu yöntemler, uygulamaya özgü ve dayanıklı benzersiz bir kimlik sağlar. İDevice silindiğinde, geri yüklendiğinde veya uygulama kaldırılıp yeniden yüklendiğinde değişmez. Bu nedenle, bu kimliği anahtarlığa kaydetmeye gerek yoktur.

Neyse ki bunu başarmak için küçük bir kütüphane yaratan bazı insanlar var. Kod GitHub'da bulunabilir:

https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5

1
Bas Peters

swift3/4 +

İCloud kayıt kimliğini kullanma (CKRecordID). Bu kimlik iTunes hesabı için benzersiz olacak.

let container = CKContainer.default()
container.fetchUserRecordID() {
    recordID, error in

    if let err = error {
        print(err.localizedDescription)
    }
    else if recID = recordID {
        print("fetched ID \(recID.recordName ?? "NA")")
    }
}

Otomatik olarak oluşturulan kayıtlar için ID adı dizesi bir UUID'ye dayanır ve bu nedenle benzersiz olması garanti edilir.

Kullanıcıyı tanımlamak için oyun merkezi ve iCloud'u birlikte kullanmaya ne dersiniz?

Bir kullanıcının oyun oynamaması ve verilerini senkronize etmemesi daha az olasıdır.

0
Mickey

SECUREUDID gibi üçüncü taraf çözümlerini de kullanabilirsiniz this

0
msk

Bugün Bizim APP reddedildi, Game Center kullanıcı kimliği nedeniyle. App Store Kılavuzunda: https://developer.Apple.com/appstore/resources/approval/guidelines.html

Uniqe Game Center ID'yi G: biçiminde kullanamazsınız.

Şimdi bizim için tek yol iOS6 Facebook entegrasyonunu kullanmak.

GÜNCELLEME: Otomatik FB oturum açma özelliğine sahip yeni sürümümüz inceleme sürecinden geçti ve App Store'da (Slovni Duel) kullanıma sunuldu. FB profiline bağlı Aplik aboneliğini de kullanır.

0
Lubomir

Mutlak kesin bir çözüm değildir (ve yalnızca iCloud etkinleştirildiğinde çalışır), ancak uygulanması çok kolaydır: Bir kez benzersiz bir kimlik oluşturun (UUID gibi) ve iCloud anahtar-değer-depolama alanında saklayın.

Tek sorun, ileri düzeydeki kullanıcıların iCloud'daki içeriği nasıl sileceklerini bilmesidir.

Kullanıcının yalnızca iCloud'da depolanan benzersiz kimliği başka bir kullanıcı kimliğine düzenlemesini önlemek için bir çeşit sır ekleyebilirsiniz.

0
miho

Erik'in önerisine bir alternatif, OpenUDID adlı üçüncü taraf bir kütüphanedir. Her cihaz için benzersiz bir tanımlayıcı oluşturabilirsiniz ve bu çok basit: 

#include "OpenUDID.h"
NSString* openUDID = [OpenUDID value];
0
Anthony