8
8
9
9
#import " ABGameKitHelper.h"
10
10
#import " AppDelegate.h"
11
+ #import " NSData+AES256.h"
11
12
12
- #define APPNAME @" AppName"
13
+ #define APPNAME @" MyAppName"
14
+ #define AESKEY @" RandomKeyHere"
13
15
14
16
@implementation ABGameKitHelper
15
17
@@ -42,9 +44,12 @@ -(void) authenticatePlayer {
42
44
}];
43
45
}
44
46
45
- -(void ) showLeaderboard {
47
+ -(void ) showLeaderboard : ( NSString *) leaderboardID {
46
48
GKLeaderboardViewController *leaderboardViewController = [[GKLeaderboardViewController alloc ] init ];
47
49
leaderboardViewController.leaderboardDelegate = self;
50
+ if (leaderboardID) {
51
+ leaderboardViewController.category = leaderboardID;
52
+ }
48
53
49
54
AppController *app = (AppController*) [[UIApplication sharedApplication ] delegate ];
50
55
[[app navController ] presentModalViewController: leaderboardViewController animated: YES ];
@@ -73,54 +78,62 @@ -(void) reportScore:(int)score forLeaderboard:(NSString*)leaderboardName {
73
78
}
74
79
75
80
-(void ) cacheScore : (GKScore*)score {
76
- // Retrieve Array of all Cached Scoress
81
+ // Retrieve Array of all Cached Achievements
77
82
NSData *loadedArrayData = [self loadDataForKey: @" cachedscores" ];
78
- NSMutableArray *scoresArray = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
83
+ id achievements = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
84
+ NSMutableArray *scoresArray = [[NSMutableArray alloc ] initWithArray: achievements];
79
85
80
86
// Add new achievement to Array
81
87
[scoresArray addObject: score];
82
88
83
89
// Save Array back to presitent storage
84
90
NSData *newArrayData = [NSKeyedArchiver archivedDataWithRootObject: scoresArray];
85
91
[self saveData: newArrayData withKey: @" cachedscores" ];
92
+
93
+ NSLog (@" Cached Score: %lld for LB:%@ " , score.value , score.category );
86
94
}
87
95
88
96
-(void ) reportCachedScores {
89
97
// Retrieve Array of all Cached Achievements
90
98
NSData *loadedArrayData = [self loadDataForKey: @" cachedscores" ];
91
- NSMutableArray *scoresArray = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
99
+ id achievements = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
100
+ NSMutableArray *scoresArray = [[NSMutableArray alloc ] initWithArray: achievements];
92
101
93
- // Array to keep track of successfully reported Achievements
94
- NSMutableArray *deleteArray = [[NSMutableArray alloc ] init ];
102
+ NSLog (@" Number of cached scores: %i " , scoresArray.count );
95
103
96
104
for (GKScore *score in scoresArray) {
97
105
98
106
[score reportScoreWithCompletionHandler: ^(NSError *error) {
99
107
if (error != nil ) {
100
108
NSLog (@" GK - Error during reportCachesScores: - Error: %@ " , error);
109
+ [self cacheScore: score];
101
110
} else {
102
- NSLog (@" GK - Score:%@ Leaderboard:%@ reported" , score.value , score.category );
103
- // Add to deleteArray
104
- [deleteArray addObject: score];
111
+ NSLog (@" GK - CachedScore:%lld Leaderboard:%@ reported" , score.value , score.category );
105
112
}
106
113
}];
107
114
108
115
}
109
116
110
- // Delete successfully reported Achievement Objects from achievementArray
111
- [scoresArray removeObjectsInArray: deleteArray];
117
+ [self deleteScoresFromCache ];
118
+
119
+ }
120
+
121
+ -(void ) deleteScoresFromCache {
122
+ // Retrieve Array of all Cached Achievements
123
+ NSData *loadedArrayData = [self loadDataForKey: @" cachedscores" ];
124
+ id scores = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
125
+ NSMutableArray *scoresArray = [[NSMutableArray alloc ] initWithArray: scores];
126
+
127
+ [scoresArray removeAllObjects ];
112
128
113
129
// Save Array back to presitent storage
114
130
NSData *newArrayData = [NSKeyedArchiver archivedDataWithRootObject: scoresArray];
115
131
[self saveData: newArrayData withKey: @" cachedscores" ];
116
-
117
- [deleteArray release ];
118
- deleteArray = nil ;
119
132
}
120
133
121
134
-(void ) reportAchievement : (NSString *)identifier percentComplete : (float )percent {
122
135
123
- GKAchievement *achievement = [[[ GKAchievement alloc ] initWithIdentifier: identifier ] autorelease ];
136
+ GKAchievement *achievement = [[GKAchievement alloc ] initWithIdentifier: identifier];
124
137
if (achievement) {
125
138
achievement.percentComplete = percent;
126
139
@@ -144,54 +157,69 @@ -(void) reportAchievement:(NSString*)identifier percentComplete:(float)percent {
144
157
}
145
158
146
159
-(void ) cacheAchievement : (GKAchievement*)achievement {
160
+ NSLog (@" Cached Achievement: %@ " , achievement.identifier );
161
+
162
+ NSString *identifier = achievement.identifier ;
163
+ double percentage = achievement.percentComplete ;
164
+
147
165
// Retrieve Array of all Cached Achievements
148
- NSData *loadedArrayData = [self loadDataForKey: @" cachedachievements" ];
149
- NSMutableArray *achievementArray = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
166
+ NSData *loadedDicData = [self loadDataForKey: @" cachedachievements" ];
167
+ id achievements = [NSKeyedUnarchiver unarchiveObjectWithData: loadedDicData];
168
+ NSMutableDictionary *achievementDic = [[NSMutableDictionary alloc ] initWithDictionary: achievements];
150
169
151
170
// Add new achievement to Array
152
- [achievementArray addObject: achievement ];
171
+ [achievementDic setObject: [ NSNumber numberWithDouble: percentage] forKey: identifier ];
153
172
154
173
// Save Array back to presitent storage
155
- NSData *newArrayData = [NSKeyedArchiver archivedDataWithRootObject: achievementArray];
156
- [self saveData: newArrayData withKey: @" cachedachievements" ];
174
+ NSData *newDicData = [NSKeyedArchiver archivedDataWithRootObject: achievementDic];
175
+
176
+ [self saveData: newDicData withKey: @" cachedachievements" ];
157
177
}
158
178
159
179
-(void ) reportCachedAchievements {
160
180
// Retrieve Array of all Cached Achievements
161
- NSData *loadedArrayData = [self loadDataForKey: @" cachedachievements" ];
162
- NSMutableArray *achievementArray = [NSKeyedUnarchiver unarchiveObjectWithData: loadedArrayData];
163
-
164
- // Array to keep track of successfully reported Achievements
165
- NSMutableArray *deleteArray = [[NSMutableArray alloc ] init ];
166
-
167
- for (GKAchievement *achievement in achievementArray) {
168
- if (achievement) {
169
- [achievement reportAchievementWithCompletionHandler: ^(NSError *error) {
170
- if (error != nil ) {
171
- NSLog (@" GK - Error during reportCachedAchievement: - Error: %@ " , error);
172
-
173
- } else {
174
- NSLog (@" GK - CachedAchievement:%@ Percent:%f reported" , achievement.identifier , achievement.percentComplete );
175
- // Locally report Achievement as completed
176
- if (achievement.percentComplete == 100 ) {
177
- [self saveBool: YES withKey: achievement.identifier];
178
- }
179
- // Add to deleteArray
180
- [deleteArray addObject: achievement];
181
+ NSData *loadedDicData = [self loadDataForKey: @" cachedachievements" ];
182
+ id achievements = [NSKeyedUnarchiver unarchiveObjectWithData: loadedDicData];
183
+ NSMutableDictionary *achievementDic = [[NSMutableDictionary alloc ] initWithDictionary: achievements];
184
+
185
+ NSLog (@" Number of cached Achievements: %i " , achievementDic.count );
186
+
187
+ [achievementDic enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
188
+ NSString *identifier = key;
189
+ double percentage = [obj doubleValue ];
190
+
191
+ GKAchievement *achievement = [[GKAchievement alloc ] initWithIdentifier: identifier];
192
+ achievement.percentComplete = percentage;
193
+ [achievement reportAchievementWithCompletionHandler: ^(NSError *error) {
194
+ if (error != nil ) {
195
+ NSLog (@" GK - Error during reportCachedAchievement: - Error: %@ " , error);
196
+
197
+ } else {
198
+ NSLog (@" GK - CachedAchievement:%@ Percent:%f reported" , identifier, percentage);
199
+ // Locally report Achievement as completed
200
+ if (achievement.percentComplete == 100 ) {
201
+ [self saveBool: YES withKey: identifier];
181
202
}
182
- }];
183
- }
184
- }
203
+ // Add to deleteArray
204
+ [self deleteAchievementFromCache: identifier];
205
+ }
206
+
207
+ }];
208
+ }];
209
+ }
210
+
211
+ -(void ) deleteAchievementFromCache : (NSString *)identifier {
212
+ NSData *loadedDicData = [self loadDataForKey: @" cachedachievements" ];
213
+ id achievements = [NSKeyedUnarchiver unarchiveObjectWithData: loadedDicData];
214
+ NSMutableDictionary *achievementDic = [[NSMutableDictionary alloc ] initWithDictionary: achievements];
185
215
186
- // Delete successfully reported Achievement Objects from achievementArray
187
- [achievementArray removeObjectsInArray: deleteArray];
216
+ [achievementDic removeObjectForKey: identifier];
188
217
189
- // Save Array back to presitent storage
190
- NSData *newArrayData = [NSKeyedArchiver archivedDataWithRootObject: achievementArray];
191
- [self saveData: newArrayData withKey: @" cachedachievements" ];
218
+ NSLog (@" post deletion count: %i " , achievementDic.count );
192
219
193
- [deleteArray release ];
194
- deleteArray = nil ;
220
+ // Save Array back to presitent storage
221
+ NSData *newDicData = [NSKeyedArchiver archivedDataWithRootObject: achievementDic];
222
+ [self saveData: newDicData withKey: @" cachedachievements" ];
195
223
}
196
224
197
225
-(void ) resetAchievements {
@@ -224,33 +252,58 @@ -(void) achievementViewControllerDidFinish:(GKAchievementViewController *)viewCo
224
252
225
253
#pragma mark Data Persistence Methods
226
254
227
- -(NSString *) getPath {
255
+ -(NSString *) getBinaryPath {
256
+
257
+ NSString *returnString;
258
+
228
259
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES );
229
260
NSString *documentsDirectory = [paths objectAtIndex: 0 ];
230
- NSString *fileName = [NSString stringWithFormat: @" %@ _ABGameKitHelper.plist" , APPNAME];
231
- NSString *path = [documentsDirectory stringByAppendingPathComponent: fileName];
232
- return path;
261
+ NSString *fullFileName = [NSString stringWithFormat: @" %@ _ABGameKitHelper.absave" , APPNAME];
262
+ NSString *path = [documentsDirectory stringByAppendingPathComponent: fullFileName];
263
+ returnString = path;
264
+
265
+ // Shouldn't happen:
266
+ return returnString;
233
267
}
234
268
235
269
-(void ) saveData : (NSData *)data withKey : (NSString *)key {
236
270
// Check if file exits, if so init Dictionary with it's content, otherwise allocate new one
237
- BOOL fileExists = [[NSFileManager defaultManager ] fileExistsAtPath: [self getPath ]];
271
+ BOOL fileExists = [[NSFileManager defaultManager ] fileExistsAtPath: [self getBinaryPath ]];
238
272
NSMutableDictionary *tempDic;
239
273
if (fileExists == NO ) {
240
274
tempDic = [[NSMutableDictionary alloc ] init ];
241
275
} else {
242
- tempDic = [[NSMutableDictionary alloc ] initWithContentsOfFile: [self getPath ]];
276
+ NSData *binaryFile = [NSData dataWithContentsOfFile: [self getBinaryPath ]];
277
+ NSData *dataKey = [[NSString stringWithString: AESKEY] dataUsingEncoding: NSUTF8StringEncoding];
278
+ NSData *decryptedData = [binaryFile decryptedWithKey: dataKey];
279
+ tempDic = [NSKeyedUnarchiver unarchiveObjectWithData: decryptedData];
243
280
}
281
+
244
282
// Populate Dictionary with to save value/key and write to file
245
283
[tempDic setObject: data forKey: key];
246
- [tempDic writeToFile: [self getPath ] atomically: YES ];
284
+ // [tempDic writeToFile:[self getPath:fileName] atomically:YES];
285
+
286
+ NSData *dicData = [NSKeyedArchiver archivedDataWithRootObject: tempDic];
287
+
288
+ NSData *dataKey = [[NSString stringWithString: AESKEY] dataUsingEncoding: NSUTF8StringEncoding];
289
+ NSData *encryptedData = [dicData encryptedWithKey: dataKey];
290
+
291
+ [encryptedData writeToFile: [self getBinaryPath ] atomically: YES ];
292
+
247
293
// Release allocated Dictionary
248
- [tempDic release ];
294
+ // [tempDic release];
249
295
}
250
296
251
297
-(NSData *) loadDataForKey : (NSString *)key {
252
- NSMutableDictionary *tempDic = [[NSMutableDictionary alloc ] initWithContentsOfFile: [self getPath ]];
298
+ NSData *binaryFile = [NSData dataWithContentsOfFile: [self getBinaryPath ]];
299
+ NSData *dataKey = [[NSString stringWithString: AESKEY] dataUsingEncoding: NSUTF8StringEncoding];
300
+ NSData *decryptedData = [binaryFile decryptedWithKey: dataKey];
301
+
302
+ NSMutableDictionary *tempDic = [NSKeyedUnarchiver unarchiveObjectWithData: decryptedData];
253
303
NSData *loadedData = [tempDic objectForKey: key];
304
+
305
+ // [tempDic release];
306
+
254
307
return loadedData;
255
308
}
256
309
@@ -271,8 +324,23 @@ -(BOOL) loadBoolForKey:(NSString*) key {
271
324
return [boolean boolValue ];
272
325
}
273
326
274
-
275
-
327
+ -(void ) saveINT : (int ) number withKey : (NSString *) key {
328
+ NSNumber *numberObject = [NSNumber numberWithInt: number];
329
+ NSData *data = [NSKeyedArchiver archivedDataWithRootObject: numberObject];
330
+ [self saveData: data withKey: key];
331
+ }
332
+ -(int ) loadINTForKey : (NSString *) key {
333
+ NSData *loadedData = [self loadDataForKey: key];
334
+ NSNumber *loadedNumberObject;
335
+ if (loadedData != NULL ) {
336
+ loadedNumberObject = [NSKeyedUnarchiver unarchiveObjectWithData: loadedData];
337
+ } else {
338
+ loadedNumberObject = [NSNumber numberWithInt: 0 ];
339
+ }
340
+ // Convert NSNumber object back to int
341
+ int loadedNumber = (int ) [loadedNumberObject intValue ];
342
+ return loadedNumber;
343
+ }
276
344
277
345
@end
278
346
0 commit comments