0

読んでくれてありがとう、

PS: 私は初心者なので、残念ながらこれはあまり得意ではありませんが、助けていただければ幸いです。

したがって、基本的には、 Account オブジェクトを含む大きな配列をアーカイブしたいと考えています。

  • 1. NSString 形式のユーザー名、

  • 2.NSNumbers で満たされた暗号化されたパスワード配列、および

  • 3.サービス データ オブジェクトで満たされたデータ配列。

サービス データ オブジェクトには次のものがあります。

    1. 暗号化された serviceType (NSNumbers で満たされた NSArray) (ユーザー名とパスワードが対象とするサービスに関係なく)
    1. 暗号化されたユーザー名 (NSNumbers で満たされた NSArray)
    1. 暗号化されたパスワード (NSNumbers で満たされた NSArray)

奇妙なことに、これをアーカイブして保存しようとすると、2 つのエラーが発生します。Account クラスのデータ配列にサービス データ オブジェクトを追加できなくなり、次のエラー メッセージが表示されます (または、少なくとも NSTableView には表示されませんが、存在すると表示されます)。

[<ServiceData 0x60000023bfa0> valueForUndefinedKey:]: this class is not key value
coding-compliant for the key service.

2つ目は、アカウントクラスからユーザー名とパスワードでログインしようとすると、ユーザー名とパスワードの最初のカップルと最後のカップルの NSNumbers が正しく取得されますが、パスワードの残りの NSNumbers は数兆または何か、何がうまくいかないのだろうと思っています。どんな助けでも大歓迎です。

以下は、インスタンス変数のコード、NSKeyedArchiver と unarchiver の使用方法、およびファイルの保存と読み込みの方法です。繰り返しますが、私を助けてください、私はしばらくこれに固執しており、これは一種の最後の手段です. 何が起こっているのかわかりません!


アカウントクラス:

H ファイル:

@interface Account : NSObject <NSCoding>
{
@private
    NSString *username;
    NSMutableArray *password;
    NSMutableArray *accData;
}

@property NSString *username;
@property NSArray *password;

完全な M ファイル:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if(self)
    {
        username = [aDecoder decodeObjectForKey:@"username"];
        password = [aDecoder decodeObjectForKey:@"password"];
        accData = [aDecoder decodeObjectForKey:@"data"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:username forKey:@"username"];
    [aCoder encodeObject:password forKey:@"password"];
    [aCoder encodeObject:accData forKey:@"data"];
}

サービスデータ クラス:

H ファイル:

@interface ServiceData : NSObject <NSCoding>
{
@private
    NSArray* serviceData;
    NSArray* usernameData;
    NSArray* passwordData;
}

@property NSArray* serviceData; 
@property NSArray* usernameData;
@property NSArray* passwordData;

M ファイル:

#import "Account.h"
#import "Crypt.h"

NSMutableArray *accounts;
NSInteger accountNumber = -1;


@implementation Account

@synthesize username;
@synthesize password;

- (id)initWithUsername:(NSString *)name withPassword:(NSMutableArray *)key
{
    self = [super init];
    if (self)
    {
        username = name;
        password = key;
        accData = [[NSMutableArray alloc]init];
    }
    return self;
}


/*
setters and getters
*/

-(NSString*)getUsername;
{
    return username;
}
-(NSArray*)getPassword;
{
    return password;
}
-(void)changePassword:(NSMutableArray*)newPassword;
{
    NSInteger sizeOldPass = [password count];
    NSInteger sizeNewPass = [newPassword count];
    int changeXObjects = (int)(sizeNewPass - sizeOldPass);
    int changeSize = abs(changeXObjects);
    //adjusts size differences
    if (changeXObjects < 0)
    {
        for(int i = 0; i < changeSize; i++)
        {
            [password removeLastObject];
        }
    }
    else if (changeXObjects > 0)
    {
        for(int i = 0; i < changeSize; i++)
        {
            NSNumber *value = [NSNumber numberWithInt:0];
            [password addObject:value];
        }
    }

    //change password
    NSInteger sizePass = [password count];
    for (int k = 0; k < sizePass; k++)
    {
        [password replaceObjectAtIndex:k withObject:newPassword[k]];
    }
}

-(NSMutableArray*)getAccData;
{
    return accData;
}
-(void)setAccData:(NSMutableArray*)input
{
    [input setArray: accData];
}

+(NSMutableArray*)getAccounts
{
    return accounts;
}

+(NSInteger)getAccountNumber
{
    return accountNumber;
}

+(void)setAccounts:(id)accs
{
    accounts = accs;
}

+(void)setAccountNumber:(NSInteger)number
{
    accountNumber = number;
}


/*
other methods
*/

+(void)addAccount:(id)acc
{
    [accounts addObject:acc];
}
+(void)deleteAccount:(NSInteger)index
{
    [accounts removeObjectAtIndex:index];
}


-(void)addAccData:(id)input
{
    [accData addObject:input];
}

-(void)deleteAccDataAt:(NSInteger)index
{
    [accData removeObjectAtIndex:index];
}

+(bool)checkPassword:(NSString*)passwordIn accountNumber:(NSInteger)index
{
    NSMutableArray *passwordInputCrypt = [Crypt encrypt:passwordIn];
    NSMutableArray *passwordCrypt = [accounts[index] getPassword];

    NSInteger lengthPassword = [passwordInputCrypt count];

    bool correctPassword = true;
    if([passwordCrypt count] == [passwordInputCrypt count])
    {
        for(int i = 0; i < lengthPassword; i++)
        {
            if(passwordCrypt[i]!=passwordInputCrypt[i])
                correctPassword = false;
        }
    }
    else
    {
        correctPassword = false;
    }

    if(correctPassword == true)
    {
        return true;
    }
    return false;
}


-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if(self)
    {
        username = [aDecoder decodeObjectForKey:@"username"];
        password = [aDecoder decodeObjectForKey:@"password"];
        accData = [aDecoder decodeObjectForKey:@"data"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:username forKey:@"username"];
    [aCoder encodeObject:password forKey:@"password"];
    [aCoder encodeObject:accData forKey:@"data"];
}
@end

LOADING FILE(filePath が与えられます):

NSData *data = [[NSFileManager defaultManager] contentsAtPath:filePath];

if(data != nil)
{
    NSArray *arrayFromData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSMutableArray *initArray = [NSMutableArray arrayWithArray:arrayFromData];
    [Account setAccounts:initArray];
}
else
{
    NSMutableArray *accountsInit = [[NSMutableArray alloc] init];
    [Account setAccounts:accountsInit];
}

ファイルを保存しています:

NSArray *accounts = [Account getAccounts];
NSString *filePath = [AppController getFilePath];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:accounts];

[data writeToFile:filePath atomically:YES];
4

1 に答える 1

0

いくつかのこと:

  1. パスワード データをディスクにアーカイブしないでください (暗号化していても)。そのためのキーチェーンです。適切なラッパー クラスについては、SSKeychainを参照してください。
  2. 取得しているキー値コーディング エラーは、serviceData 配列を単に「サービス」としてどこかで参照しようとしていることを示唆しています。valueForKey および setValueForKey ステートメントを確認してください。

Account クラスの残りを投稿できますか? そのメソッド setAccounts が関連しているように見えます。

また、Core Data の代わりに Keyed Archiving を使用している理由はありますか?

于 2014-01-25T06:03:08.660 に答える