203 |
204 |
205 |
206 |
207 |
208 |
209 | open Leaderboard Modal
210 |
211 | this.submitLeaderboardScore(this.state.score)} style={[s.columnItem,s.center,s.button,{backgroundColor:"#32db64"}]}>
212 | submit Leaderboard Score
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 | {/* Heading Title */}
221 |
222 | Player
223 | Player Buttons
224 |
225 |
226 |
227 |
228 |
229 |
230 | get player
231 |
232 |
233 |
234 | get Player Friends
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 | {/* Heading Title */}
246 |
247 | Achievements
248 | Achievements Buttons
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 | open AchievementModal
259 |
260 |
261 |
262 | get Achievements
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 | submit Achievement Score
273 |
274 |
275 |
276 | reset Achievements
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 | );
288 | }
289 | }
290 |
291 |
292 |
293 |
294 |
295 | // RNGameCenter.init({leaderboardIdentifier})
296 | AppRegistry.registerComponent('GameCenterExample', () => GameCenterExample);
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 | let BUTTON_ROW_NUM_OF_BUTTONS = 3
306 | let BUTTON_ROW_HEIGHT = 50
307 | let BUTTON_HEIGHT = 50
308 | const s = StyleSheet.create({
309 | container: {
310 | flex: 1,
311 | // justifyContent: 'center',
312 | // alignItems: 'center',
313 | backgroundColor: '#F5FCFF',
314 | },
315 | headingText: {
316 | fontSize: 25,
317 | marginBottom:40,
318 | fontWeight: "900",
319 | textAlign: 'center',
320 |
321 | },
322 | scoreText: {
323 | fontSize: 20,
324 | fontWeight: "900",
325 | textAlign: 'center',
326 |
327 | },
328 | rowTitleContainer: {
329 | flexDirection: 'row',
330 | },
331 | titleText: {
332 | fontWeight: "800"
333 | },
334 | instructions: {
335 | textAlign: 'center',
336 | color: '#333333',
337 | marginBottom: 5,
338 | },
339 | button: {
340 | borderWidth: 1,
341 | margin: 5,
342 | // padding: 15,
343 | paddingLeft: 5,
344 | paddingRight: 5,
345 | borderColor: "white",
346 | backgroundColor:"#488aff",
347 | borderRadius: 5,
348 | },
349 | centerItem: {
350 | borderRadius:25,
351 | borderWidth:4,
352 | borderColor:"rgba(0,0,0,0.2)",
353 | justifyContent: "center",
354 | alignItems: "center",
355 | borderRadius:25,
356 | height:50,
357 | width:50,
358 | backgroundColor:"red",
359 | },
360 | margin10: {
361 | margin: 10,
362 | },
363 | rowContainer: {
364 | flexDirection: 'row',
365 | height: BUTTON_ROW_HEIGHT,
366 | },
367 | spaceAround: {
368 | justifyContent: 'space-around',
369 | alignItems: 'center',
370 | },
371 |
372 | center:{justifyContent:"center",alignItems:"center",},
373 | spaceBetween: {
374 | justifyContent: 'space-between',
375 | alignItems: 'center',
376 | },
377 | rowItem: {
378 | backgroundColor: "transparent",
379 | width: width / BUTTON_ROW_NUM_OF_BUTTONS - 20,
380 | height: BUTTON_HEIGHT,
381 | borderRadius: 5,
382 | },
383 | rowItemBorder: {
384 | borderWidth: 0.8,
385 | borderColor: "rgba(0,0,0,0.1)"
386 | },
387 | textStyle:{color:"rgba(255,255,255,1)", textAlignVertical: "center", fontWeight:"700",textAlign: "center"},
388 |
389 | viewShadow: {
390 | shadowOpacity: 1,
391 | shadowOffset: {
392 | width: 0,
393 | height: 5
394 | },
395 | shadowRadius: 4,
396 | shadowColor: "rgba(0,0,0,0.6)",
397 | },
398 |
399 | headerComponentTouchableIcon:{margin: 5,},
400 | headerComponentSubheading:{fontSize: 17,color: '#444',margin: 5,fontWeight: '400'},
401 | headerComponentTitleContainer:{},
402 | headerComponentTitleTextStyle:{fontSize: 35,color: '#444',margin: 5,fontWeight: '700'},
403 | lineDivider:{width: 50,borderBottomWidth: 1,borderColor: '#e3e3e3',margin: 5},
404 | columnContainer:{flex: 1,flexDirection: 'row',
405 | justifyContent: 'center',
406 | justifyContent: 'space-between',
407 | justifyContent: 'space-around',
408 | maxHeight:50,
409 | alignItems: 'center',},
410 | columnItem:{width:width/2-20, height: 50},
411 |
412 | });
413 |
414 | /*
415 | //TODO coming soon
416 | getLeaderboardPlayers(){
417 |
418 | let options = {playerIds:[]};
419 |
420 | _GameCenter.getLeaderboardPlayers(options)
421 | }
422 |
423 |
424 |
425 | invite(){
426 | let options = {playerIds:[]};
427 | _GameCenter.invite(options)
428 | }
429 |
430 | challengeComposer(){
431 |
432 | let options = {score:this.state.score,
433 | message:"my message",
434 | players:["G:8135064222"],
435 | achievementIdentifier:"novice_award"
436 | };
437 |
438 | _GameCenter.challengeComposer(options)
439 | .then(console.log)
440 | .catch(console.warn)
441 | }
442 |
443 |
444 |
445 | findScoresOfFriendsToChallenge(){
446 | _GameCenter.findScoresOfFriendsToChallenge()
447 | .then(console.log)
448 | .catch(console.warn)
449 | }
450 |
451 | loadLeaderboardPlayers(){
452 | _GameCenter.loadLeaderboardPlayers()
453 | .then(console.log)
454 | .catch(console.warn)
455 | }
456 |
457 |
458 |
459 | */
460 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
Meet react-native-game-center










2 |
3 | # React Native Game Center
4 | hire me!
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | # Contents
14 |
15 | - [React Native Game Center](#react-native-game-center)
16 | * [Contents](#contents)
17 | * [Getting Started](#getting-started)
18 | * [Basic Usage](#basic-usage)
19 | * [Installation](#installation)
20 | * [Set Up](#set-up)
21 | - [Example](#example)
22 | - [Methods](#methods)
23 | - [Init Method](#init-method)
24 | * [init()](#init----promise--)
25 | - [Player Methods](#player-methods)
26 | * [getPlayer()](#getplayer--promise--)
27 | * [getPlayerImage()](#getplayerimage--promise--)
28 | * [getPlayerFriends()](#getplayerfriends--promise--)
29 | - [Leaderboard Methods](#leaderboard-methods)
30 | * [openLeaderboardModal()](#openleaderboardmodal--promise--)
31 | * [submitLeaderboardScore()](#submitleaderboardscore--promise--)
32 | - [Achievements Methods](#achievements-methods)
33 | * [openAchievementModal()](#openachievementmodal--promise--)
34 | * [getAchievements()](#getachievements--promise--)
35 | * [resetAchievements()](#resetachievements--promise--)
36 | * [submitAchievementScore()](#submitachievementscore--promise--)
37 |
38 | - [TODO](#todo)
39 |
40 | # Getting Started
41 |
42 | - Install `react-native` first
43 |
44 | ```bash
45 | npm i react-native -g
46 | react-native init myApp
47 | cd myApp
48 | yarn add react-native-game-center
49 | react-native link
50 | react-native run-ios
51 | ```
52 |
53 | # Basic Usage
54 |
55 | - In your `index.js`, use:
56 | ```bash
57 | import RNGameCenter from "react-native-game-center"
58 |
59 | RNGameCenter.getPlayer().then(player=>console.log("player: ",player))
60 | ```
61 |
62 |
63 | # Installation
64 |
65 | - From project root
66 |
67 | ```bash
68 | yarn add react-native-game-center
69 | react-native link
70 | react-native run-ios
71 | ```
72 | then **Follow setup Instructions**
73 |
74 | # Set Up
75 | > See [SETUP.md](SETUP.md)
76 |
77 |
78 | # Example
79 |
80 | or clone the repo and play with the example project
81 |
82 | ```bash
83 | $ git clone https://github.com/garrettmac/react-native-game-center
84 | $ cd react-native-game-center/GameCenterExample
85 | $ yarn install
86 | $ npm start
87 | ```
88 |
89 |
90 |
91 |
92 |
93 | # Init Method
94 |
95 | * [init() ](#init----promise--)
96 | - [Details](#details)
97 | - [Parameters](#parameters)
98 | - [Usage](#usage)
99 |
100 | ## init()
101 |
102 | #### Details
103 |
104 | Initiates your app with Game Center.
105 | Add this to the top of your app before your `AppRegister`.
106 |
107 |
108 | **ITUNES CONNECT APP DASHBOARD**
109 | > https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app
110 |
111 | **Then**
112 | > SELECT APP > Feature > Game Center
113 |
114 | #### Parameters
115 |
116 | | Name | Required | Default | Description |
117 | |--------------|--------------|--------------|--------------|
118 | | leaderboardIdentifier | Yes | `undefined` | Your apps default leaderboard Identifier. You can can several of these but at least one is required. |
119 | | achievementIdentifier | No | `undefined` | Your apps default achievement Identifier. Not required. Set this to avoid having to keep passing it in. |
120 |
121 |
122 | #### Usage
123 |
124 | **Basic**
125 |
126 | ```jsx
127 | const leaderboardIdentifier="high_scores"
128 |
129 | GameCenter.init({leaderboardIdentifier})
130 | ```
131 |
132 | **Advanced**
133 |
134 | ```jsx
135 | const leaderboardIdentifier="high_scores"
136 | const achievementIdentifier="novice_award"
137 |
138 |
139 | //init app
140 | GameCenter.init({leaderboardIdentifier,achievementIdentifier})
141 | .then(console.log)
142 | .catch(console.warn)
143 |
144 | ```
145 |
146 |
147 |
148 |
149 |
150 |
151 | # Player Methods
152 |
153 | [Player Methods](#player-methods)
154 | * [getPlayer ](#getplayer--promise--)
155 | - [Details](#details-1)
156 | - [Parameters](#parameters-1)
157 | - [Basic Usage](#basic-usage-1)
158 | - [Response](#response)
159 | * [getPlayerImage ](#getplayerimage--promise--)
160 | - [Details](#details-2)
161 | - [Parameters](#parameters-2)
162 | - [Usage](#usage-1)
163 | - [Success Response](#success-response)
164 | - [Failed Response](#failed-response)
165 | + [getPlayerFriends](#getplayerfriends)
166 | - [Details](#details-3)
167 | - [Parameters](#parameters-3)
168 | - [Usage](#usage-2)
169 | - [Response](#response-1)
170 |
171 | ## getPlayer
172 |
173 | #### Details
174 |
175 | Gets logged in user.
176 |
177 | #### Parameters
178 |
179 | No Parameters
180 |
181 | #### Basic Usage
182 |
183 | ```jsx
184 | GameCenter.getPlayer().then(player=>{
185 | console.log("player: ", player);
186 | })
187 | ```
188 |
189 | #### Response
190 |
191 | ```json
192 | {alias: "Garrettmacmac", displayName: "Me", playerID: "G:8135064222"}
193 | ```
194 |
195 |
196 |
197 |
198 | ## getPlayerImage
199 |
200 |
201 | #### Details
202 |
203 | Gets logged player image if available.
204 | Most players don't have one.
205 |
206 | #### Parameters
207 |
208 | No Parameters
209 |
210 | #### Usage
211 |
212 | ```jsx
213 | GameCenter.getPlayerImage().then(image=>{
214 | console.log("image: ", image);
215 | })
216 | ```
217 | #### Success Response
218 |
219 | ```json
220 | {image: "/path/to/image.png"}
221 | ```
222 | #### Failed Response
223 |
224 | ```json
225 | Error fetching player image
226 | ```
227 |
228 |
229 | ### getPlayerFriends
230 |
231 | #### Details
232 |
233 | Gets a list of players.
234 | Most games don't have this anymore as Apple took away the game center App.
235 | Now you see lots of users connect via Facebook, SMS and by geolocation.
236 |
237 | #### Parameters
238 |
239 | No Parameters
240 |
241 | #### Usage
242 |
243 | ```jsx
244 | GameCenter.getPlayerFriends().then(friends=>{
245 | console.log("friends: ", friends);
246 | })
247 | ```
248 |
249 | #### Response
250 | I don't know what this looks like, as I don't have friends 😫 and Apple said they are depreciating support for this is new versions.
251 |
252 | **Success**
253 | ```json
254 | [...array of friends]
255 | ```
256 | or
257 |
258 | ```json
259 | undefined
260 | ```
261 |
262 | **Failed**
263 |
264 | ```json
265 | Error fetching player friends
266 | ```
267 |
268 |
269 |
270 |
271 |
272 | # Leaderboard Methods
273 |
274 |
275 | - [Leaderboard Methods](#leaderboard-methods)
276 | * [openLeaderboardModal ](#openleaderboardmodal--promise--)
277 | - [Details](#details-4)
278 | - [Parameters](#parameters-4)
279 | - [Usage](#usage-3)
280 | - [Success Response](#success-response-1)
281 | - [Failed Response](#failed-response-1)
282 | * [submitLeaderboardScore ](#submitleaderboardscore--promise--)
283 | - [Details](#details-5)
284 | - [Parameters](#parameters-5)
285 | - [Usage](#usage-4)
286 | - [Response](#response-2)
287 |
288 |
289 |
290 | ## openLeaderboardModal
291 |
292 | #### Details
293 |
294 | Opens Game Center Modal on Leaderboard Page
295 |
296 | #### Parameters
297 |
298 | No Parameters
299 |
300 | #### Usage
301 |
302 | ```jsx
303 | GameCenter.openLeaderboardModal()
304 | .then(success=>{})//is open
305 | .catch(error=>{})//could not open
306 |
307 | ```
308 |
309 | #### Success Response
310 |
311 | ```json
312 | opened leaderboard modal
313 | ```
314 | #### Failed Response
315 |
316 | ```json
317 | opened leaderboard modal
318 | ```
319 |
320 |
321 |
322 | ## submitLeaderboardScore
323 |
324 | #### Details
325 | Submit progress of users leaderboard
326 |
327 | #### Parameters
328 |
329 | | Name | Required | Default | Description |
330 | |--------------|--------------|--------------|--------------|
331 | | score | Yes | n/a | some number to track for leaderboard |
332 | | leaderboarIdentifier | No* (see Response) | `leaderboarIdentifier` set up in Itunes Connect |
333 |
334 |
335 | #### Usage
336 |
337 |
338 |
339 |
340 | **Basic**
341 |
342 | ```jsx
343 | let options={score:50};
344 |
345 | //reverts to default leaderboarIdentifier set up in init()
346 | GameCenter.submitLeaderboardScore(options)
347 | //now update state
348 | this.setState(options)
349 | ```
350 |
351 | **Advanced**
352 | ```jsx
353 | let options={
354 | score:50,
355 | leaderboarIdentifier:"some_other_leaderboard"
356 | };
357 |
358 | GameCenter.submitLeaderboardScore(options)
359 | .then(res=>{
360 | if(res==="Successfully submitted score")
361 | this.setState({score:50})
362 | })
363 | .catch(console.warn("Users progress is not being tracked due to error."))
364 |
365 | ```
366 |
367 |
368 | #### Response
369 |
370 | **Success**
371 |
372 | ```json
373 | "Successfully submitted score"
374 | ```
375 |
376 |
377 | **Failed**
378 |
379 | ```json
380 | "Error submitting score."
381 | ```
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 | # Achievements Methods
390 |
391 | - [Achievements Methods](#achievements-methods)
392 | * [openAchievementModal ](#openachievementmodal--promise--)
393 | - [Details](#details-6)
394 | - [Parameters](#parameters-6)
395 | - [Usage](#usage-5)
396 | - [Response](#response-3)
397 | * [getAchievements ](#getachievements--promise--)
398 | - [Details](#details-7)
399 | - [Parameters](#parameters-7)
400 | - [Usage](#usage-6)
401 | - [Response](#response-4)
402 | * [resetAchievements ](#resetachievements--promise--)
403 | - [Details](#details-8)
404 | - [Parameters](#parameters-8)
405 | - [Usage](#usage-7)
406 | - [Response](#response-5)
407 | * [submitAchievementScore ](#submitachievementscore--promise--)
408 | - [Details](#details-9)
409 | - [Parameters](#parameters-9)
410 | - [Usage](#usage-8)
411 | - [Response](#response-6)
412 |
413 | ## openAchievementModal
414 |
415 | #### Details
416 |
417 | Opens Game Center Modal on Leaderboard Page
418 |
419 | #### Parameters
420 |
421 | No Parameters
422 |
423 | #### Usage
424 |
425 | ```jsx
426 | GameCenter.openAchievementModal()
427 | .then(success=>{})//is open
428 | .catch(error=>{})//could not open
429 |
430 | ```
431 |
432 | #### Response
433 |
434 | **Success**
435 |
436 | ```json
437 | opened achievement modal
438 | ```
439 |
440 | **Failed**
441 |
442 | ```json
443 | opened achievement modal
444 | ```
445 |
446 |
447 |
448 | ## getAchievements
449 |
450 | #### Details
451 |
452 | Gets players achievements if completed more than 0%.
453 | You must declare `submitAchievementScore` at least once before calling this.
454 |
455 | #### Parameters
456 |
457 | No Parameters
458 |
459 | #### Usage
460 |
461 | ```jsx
462 | GameCenter.getAchievements()
463 | .then(achievements=>{
464 | console.log(achievements)
465 | })
466 | .catch(error=>{})//failed
467 |
468 | ```
469 |
470 | #### Response
471 |
472 | ```json
473 | [{"showsCompletionBanner":false,"lastReportedDate":1506301241432,"completed":true,"percentComplete":100,"identifier":"novice_award"},{"showsCompletionBanner":false,"lastReportedDate":1506301211362,"completed":false,"percentComplete":5,"identifier":"pro_award"}]
474 | ```
475 |
476 | or
477 |
478 | ```json
479 | []
480 | ```
481 |
482 |
483 |
484 | ## resetAchievements
485 |
486 | > []
487 |
488 | #### Details
489 |
490 | Resets the players achievements.
491 |
492 | #### Parameters
493 |
494 |
495 | | Name | Required | Default | Description |
496 | |--------------|--------------|--------------|--------------|
497 | | hideAlert | No | `{hideAlert:false}` | Hide reset confirmation prompt |
498 |
499 |
500 | #### Usage
501 |
502 | **Basic**
503 |
504 | ```jsx
505 | //Triggers confirmation prompt
506 | GameCenter.resetAchievements()
507 |
508 | // hides confirmation prompt
509 | GameCenter.resetAchievements({hideAlert:true})
510 | ```
511 | **Advanced**
512 | ```jsx
513 | GameCenter.resetAchievements(res=>{
514 | if(res.resetAchievements){
515 | do something if user reset achievements
516 | }
517 | })
518 | .catch(alert("Could not reset achievements at this time. Try again later."))
519 | ```
520 |
521 | #### Response
522 |
523 | If you pass in `{hideAlert:true}` into `GameCenter.resetAchievements()` Method **OR** the you don't pass in the `hideAlert` parameter and player presses "Reset"
524 |
525 | ```json
526 | {"resetAchievements":true,"message":"User achievements reset"}
527 | ```
528 |
529 | If you don't pass in the `hideAlert` parameter and player presses "No!"
530 |
531 | ```json
532 | {"resetAchievements":false,"message":"User achievements not reset"}
533 | ```
534 |
535 |
536 |
537 |
538 | ## submitAchievementScore
539 |
540 |
541 | #### Details
542 | Submit progress of users achievements
543 |
544 | #### Parameters
545 |
546 | | Name | Required | Default | Description |
547 | |--------------|--------------|--------------|--------------|
548 | | percentComplete | Yes | n/a | number, float, or string of the percent achievement is complete. **Range 1-100** |
549 | | achievementIdentifier | No* (see Response) | `achievementIdentifier` set up in Itunes Connect |
550 | | hideCompletionBanner | No | `false` | Hides Game center banner when complete |
551 |
552 |
553 | #### Usage
554 |
555 |
556 |
557 | ```jsx
558 | let options={
559 | percentComplete:50,
560 | achievementIdentifier:"novice_award"
561 | };
562 |
563 | GameCenter.submitAchievementScore(options).then(res=>{
564 | if(res){
565 | //success
566 | }
567 | })
568 | .catch(alert("Could not update your achievements at this time. Try again later."))
569 | ```
570 |
571 |
572 | #### Response
573 |
574 | **Success**
575 |
576 | ```json
577 | [null]
578 | ```
579 |
580 | Not required if `achievementIdentifier` set as default in `init()`. `achievementIdentifier` always reverts to default unless defended. However, will reject promise if not passed in `init()` or `submitAchievementScore()` function
581 |
582 | **Failed**
583 |
584 | ```json
585 | No Game Center `achievementIdentifier` passed and no default set
586 | ```
587 |
588 |
589 |
590 | # TODO
591 |
592 |
593 | ADD METHODS
594 |
595 | [ ] getLeaderboardPlayers()
596 | [ ] invite()
597 | [ ] challengeComposer()
598 | [ ] findScoresOfFriendsToChallenge()
599 |
--------------------------------------------------------------------------------
/RNGameCenter/ios/RNGameCenter.m:
--------------------------------------------------------------------------------
1 | //
2 | // RNGameCenter.m
3 | // StockShot
4 | //
5 | // Created by vyga on 9/18/17.
6 | // Copyright © 2017 Facebook. All rights reserved.
7 | //
8 |
9 | #import "RNGameCenter.h"
10 | #import
11 | #import
12 | #import
13 | #import
14 | #import
15 |
16 |
17 | //Global Defaults
18 | NSString *_leaderboardIdentifier;
19 | NSString *_achievementIdentifier;
20 | NSString *_playerId;
21 | BOOL _isGameCenterAvailable=NO;
22 |
23 | static RNGameCenter *SharedInstance = nil;
24 | //static NSString *scoresArchiveKey = @"Scores";
25 | //static NSString *achievementsArchiveKey = @"Achievements";
26 | //static BOOL isGameCenterAvailable()
27 | //{
28 | // // Check for presence of GKLocalPlayer API.
29 | // Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
30 | //
31 | // // The device must be running running iOS 4.1 or later.
32 | // NSString *reqSysVer = @"4.1";
33 | // NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
34 | // BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
35 | //
36 | // return (gcClass && osVersionSupported);
37 | //}
38 |
39 | @interface RNGameCenter ()
40 |
41 | @property (nonatomic, strong) GKGameCenterViewController *gkView;
42 | @property (nonatomic, strong) UIViewController *reactNativeViewController;
43 | @property (nonatomic, strong) NSNumber *_currentAdditionCounter;
44 | @end
45 |
46 | @interface MobSvcSavedGameData : NSObject
47 | @property (readwrite, retain) NSString *data;
48 | +(instancetype)sharedGameData;
49 | -(void)reset;
50 | @end
51 |
52 |
53 | @implementation RNGameCenter
54 |
55 | - (dispatch_queue_t)methodQueue{
56 | return dispatch_get_main_queue();
57 | }
58 |
59 |
60 | RCT_EXPORT_MODULE()
61 |
62 |
63 |
64 | /* -----------------------------------------------------------------------------------------------------------------------------------------
65 | Init Game Center
66 | -----------------------------------------------------------------------------------------------------------------------------------------*/
67 |
68 |
69 | RCT_EXPORT_METHOD(init:(NSDictionary *)options
70 | resolve:(RCTPromiseResolveBlock)resolve
71 | rejecter:(RCTPromiseRejectBlock)reject){
72 | //GKGameCenterViewController* gcViewController = [[GKGameCenterViewController alloc]init];
73 | if(options[@"leaderboardIdentifier"])_leaderboardIdentifier=options[@"leaderboardIdentifier"];
74 | else reject(@"Error", @"Error please pass your leaderboardIdentifier into init function",nil);
75 |
76 |
77 | if(options[@"achievementIdentifier"])_achievementIdentifier=options[@"achievementIdentifier"];
78 |
79 |
80 | UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
81 |
82 | GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
83 | localPlayer.authenticateHandler = ^(UIViewController *gcViewController, NSError *error){
84 | if (gcViewController != nil) {
85 | [rnView presentViewController:gcViewController animated:YES completion:nil];
86 | }else{
87 | if ([GKLocalPlayer localPlayer].authenticated) {
88 | // Get the default leaderboard identifier.
89 | [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {
90 |
91 | if (error != nil) {
92 | NSLog(@"%@",[error localizedDescription]);
93 | reject(@"Error", @"Error initiating Game Center make sure you are enrolled in the apple program, you set up a game center in itunes connect, and you registed it to the correct and matching app bundle id",error);
94 | }else{
95 | //set to global
96 | _isGameCenterAvailable=YES;
97 | _leaderboardIdentifier=leaderboardIdentifier;
98 | resolve(@"init success");
99 | }
100 | }];
101 | }else{
102 | reject(@"Error", @"Error initiating Game Center Player",error);
103 | }
104 | }
105 | };
106 | };
107 |
108 | RCT_EXPORT_METHOD(userLogged:(RCTPromiseResolveBlock)resolve
109 | rejecter:(RCTPromiseRejectBlock)reject){
110 | resolve(_isGameCenterAvailable!=NO?@true:@false);
111 | }
112 |
113 | /* -----------------------------------------------------------------------------------------------------------------------------------------
114 | Player
115 | -----------------------------------------------------------------------------------------------------------------------------------------*/
116 |
117 | /* --------------getPlayer--------------*/
118 |
119 | RCT_EXPORT_METHOD(getPlayer:(RCTPromiseResolveBlock)resolve
120 | rejecter:(RCTPromiseRejectBlock)reject){
121 | if(_isGameCenterAvailable==NO){
122 | reject(@"Error",@"Game Center is Unavailable", nil);
123 | return;
124 | }
125 |
126 | @try {
127 | GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
128 | NSDictionary* user = @{
129 | @"alias":localPlayer.alias,
130 | @"displayName":localPlayer.displayName,
131 | @"playerID":localPlayer.playerID,
132 | @"alias":localPlayer.alias
133 | };
134 | resolve(user);
135 | }@catch (NSError * e) {
136 | reject(@"Error",@"Error getting user.", e);
137 | }
138 | }
139 |
140 | /* --------------loadLeaderboardPlayers--------------
141 | //let leaderboardIdentifier="high_scores"
142 | // let achievementIdentifier="pro_award"
143 | //let achievementIdentifier="novice_award"
144 | RCT_EXPORT_METHOD(loadLeaderboardPlayers:(RCTPromiseResolveBlock)resolve
145 | rejecter:(RCTPromiseRejectBlock)reject){
146 | NSArray *playersForIdentifiers=@[@"high_scores"];
147 |
148 | // GKLocalPlayer *localPlayer =
149 | [GKLocalPlayer loadPlayersForIdentifiers:playersForIdentifiers withCompletionHandler:^(NSArray * _Nullable players, NSError * _Nullable error) {
150 | NSLog(@"PLAYERRRS %@",players);
151 | if(error)return reject(@"Error",@"no users.", error);
152 | resolve(players);
153 | }];
154 |
155 | }
156 |
157 | */
158 |
159 |
160 | /* --------------getPlayerImage--------------*/
161 | //
162 |
163 | RCT_EXPORT_METHOD(getPlayerImage:(RCTPromiseResolveBlock)resolve
164 | rejecter:(RCTPromiseRejectBlock)reject){
165 | if(_isGameCenterAvailable==NO){
166 | reject(@"Error",@"Game Center is Unavailable", nil);
167 | return;
168 | }
169 |
170 | @try{
171 | GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
172 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
173 | NSUserDomainMask, YES);
174 | NSString *documentsDirectory = [paths objectAtIndex:0];
175 | NSString *path = [documentsDirectory stringByAppendingPathComponent:
176 | @"user.jpg" ];
177 |
178 | // Check if the user photo is cached
179 | BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
180 |
181 | if(fileExists){
182 | // Return it if it does
183 | NSDictionary *json = @{@"image":path};
184 | resolve(json);
185 | }else{
186 | // Else load it from the game center
187 | [localPlayer loadPhotoForSize:GKPhotoSizeSmall withCompletionHandler:^(UIImage *photo, NSError *error) {
188 | if (error!=nil)return reject(@"Error", @"Error fetching player image",error);
189 |
190 | if (photo != nil){
191 | NSData* data = UIImageJPEGRepresentation(photo, 0.8);
192 | [data writeToFile:path atomically:YES];
193 | NSDictionary *json = @{@"image":path};
194 | resolve(json);
195 | }else{
196 | NSMutableDictionary *json = [NSMutableDictionary dictionary];
197 | json[@"image"] = nil;
198 | resolve(json);
199 | }
200 |
201 |
202 | }];
203 | }
204 | }@catch (NSError * e) {
205 | reject(@"Error",@"Error fetching player image", e);
206 | }
207 | }
208 |
209 | //
210 | //
211 | //RCT_EXPORT_METHOD(challengePlayers:(NSDictionary *)options
212 | // resolve:(RCTPromiseResolveBlock)resolve
213 | // rejecter:(RCTPromiseRejectBlock)reject){
214 | ////- (void) challengeViewController:(MyAchievementChallengeViewController*)controller wasDismissedWithChallenge:(BOOL)issued
215 | // @try {
216 | // NSArray *challengePlayerArray=options[@"players"];
217 | // resolve(@"Successfully opened achievements");
218 | // }
219 | // @catch (NSError * e) {
220 | // reject(@"Error",@"Error opening achievements.", e);
221 | // }
222 | ////
223 | //// [self dismissViewControllerAnimated:YES completion:NULL];
224 | //// if (issued)
225 | //// {
226 | ////
227 | //// }
228 | //}
229 | //
230 | //
231 | //RCT_EXPORT_METHOD(challengeWithScore:(int64_t)playerScore
232 | // options:(NSDictionary *)options
233 | // resolve:(RCTPromiseResolveBlock)resolve
234 | // rejecter:(RCTPromiseRejectBlock)reject){
235 | //// -(void) sendScoreChallengeToPlayers:(NSArray*)players withScore:(int64_t)score message:(NSString*)message {
236 | // NSString *message = options[@"message"];
237 | // //NSArray *players = options[@"players"];
238 | // NSMutableArray *players=@[@"G:8135064222"];
239 | //
240 | // NSString *achievementId;
241 | // if(options[@"achievementIdentifier"])achievementId=options[@"achievementIdentifier"];
242 | // //1
243 | // GKScore *gkScore = [[GKScore alloc] initWithLeaderboardIdentifier:achievementId];
244 | // gkScore.value = playerScore;
245 | //
246 | // //2
247 | // UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
248 | // [gkScore issueChallengeToPlayers:players message:message];
249 | // GKGameCenterViewController *leaderboardController = [[GKGameCenterViewController alloc] init];
250 | //// [rnView presentViewController: leaderboardController animated: YES completion:nil];
251 | //
252 | // [rnView presentViewController:gkScore animated:YES completion:nil];
253 | //
254 | // //challengeComposeControllerWithMessage
255 | //// }
256 | //
257 | //}
258 | //
259 | //
260 | ////-(void) findScoresOfFriendsToChallenge {
261 | // RCT_EXPORT_METHOD(findScoresOfFriendsToChallenge:(NSDictionary *)options
262 | // resolve:(RCTPromiseResolveBlock)resolve
263 | // rejecter:(RCTPromiseRejectBlock)reject){
264 | //
265 | // // Get leaderboardIdentifier or use default leaderboardIdentifier
266 | // NSString *achievementId;
267 | // if(options[@"achievementIdentifier"])achievementId=options[@"achievementIdentifier"];
268 | // else achievementId=_achievementIdentifier;
269 | // GKLeaderboard *leaderboard = [[GKLeaderboard alloc] init];
270 | // leaderboard.identifier = achievementId;
271 | // leaderboard.playerScope = GKLeaderboardPlayerScopeFriendsOnly;
272 | // leaderboard.range = NSMakeRange(1, 100);
273 | // [leaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
274 | // BOOL success = (error == nil);
275 | //
276 | // if (success) {
277 | //// if (!_includeLocalPlayerScore) {
278 | //// NSMutableArray *friendsScores = [NSMutableArray array];
279 | //// for (GKScore *score in scores) {
280 | //// if (![score.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID]) {
281 | //// [friendsScores addObject:score];
282 | //// }
283 | //// }
284 | //// scores = friendsScores;
285 | // resolve(scores);
286 | //
287 | // }else{
288 | // reject(@"Error", @"Error scores",error);
289 | // }
290 | // }];
291 | //}
292 | //
293 |
294 |
295 |
296 | /* -----------------------------------------------------------------------------------------------------------------------------------------
297 | Leaderboard
298 | -----------------------------------------------------------------------------------------------------------------------------------------*/
299 |
300 | /* --------------openLeaderboardModal--------------*/
301 | //RCT_EXPORT_METHOD(openLeaderboardModal:(NSString *)leaderboardIdentifier
302 | RCT_EXPORT_METHOD(openLeaderboardModal:(NSDictionary *)options
303 | resolve:(RCTPromiseResolveBlock)resolve
304 | //RCT_EXPORT_METHOD(openLeaderboardModal:(RCTPromiseResolveBlock)resolve
305 | rejecter:(RCTPromiseRejectBlock)reject){
306 |
307 | if(_isGameCenterAvailable==NO){
308 | reject(@"Error",@"Game Center is Unavailable", nil);
309 | return;
310 | }
311 |
312 | UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
313 | GKGameCenterViewController *leaderboardController = [[GKGameCenterViewController alloc] init];
314 | NSString *leaderboardId;
315 | if(options[@"leaderboardIdentifier"])leaderboardId=options[@"leaderboardIdentifier"];
316 | else leaderboardId=_leaderboardIdentifier;
317 | if (leaderboardController != NULL){
318 | leaderboardController.leaderboardIdentifier = leaderboardId;
319 | leaderboardController.viewState = GKGameCenterViewControllerStateLeaderboards;
320 | leaderboardController.gameCenterDelegate = self;
321 | [rnView presentViewController: leaderboardController animated: YES completion:nil];
322 | resolve(@"opened Leaderboard");
323 | }
324 | }
325 |
326 |
327 | /* --------------submitLeaderboardScore--------------*/
328 |
329 |
330 | RCT_EXPORT_METHOD(submitLeaderboardScore:(int64_t)score
331 | options:(NSDictionary *)options
332 | resolve:(RCTPromiseResolveBlock)resolve
333 | rejecter:(RCTPromiseRejectBlock)reject){
334 |
335 | if(_isGameCenterAvailable==NO){
336 | reject(@"Error",@"Game Center is Unavailable", nil);
337 | return;
338 | }
339 |
340 | @try{
341 | // Get leaderboardIdentifier or use default leaderboardIdentifier
342 | NSString *leaderboardId;
343 | if(options[@"leaderboardIdentifier"])leaderboardId=options[@"leaderboardIdentifier"];
344 | else leaderboardId=_leaderboardIdentifier;
345 |
346 | GKScore *scoreSubmitter = [[GKScore alloc] initWithLeaderboardIdentifier: leaderboardId];
347 | scoreSubmitter.value = score;
348 | scoreSubmitter.context = 0;
349 |
350 | [GKScore reportScores:@[scoreSubmitter] withCompletionHandler:^(NSError *error) {
351 | if (error)
352 | {
353 | reject(@"Error", @"Error submitting score",error);
354 | }else{
355 | resolve(@"Successfully submitted score");
356 | }
357 | }];
358 | }@catch (NSError * e) {
359 | reject(@"Error",@"Error submitting score.", e);
360 | }
361 | }
362 |
363 |
364 |
365 | /* --------------getLeaderboardPlayers--------------*/
366 |
367 | RCT_EXPORT_METHOD(getLeaderboardPlayers:(NSDictionary *)options
368 | resolve:(RCTPromiseResolveBlock)resolve
369 | rejecter:(RCTPromiseRejectBlock)reject){
370 | if(_isGameCenterAvailable==NO){
371 | reject(@"Error",@"Game Center is Unavailable", nil);
372 | return;
373 | }
374 |
375 | @try{
376 | //Get Player Ids
377 | NSArray *playerIds=options[@"playerIds"];
378 | //create Query with Player Ids
379 | GKLeaderboard *query = [[GKLeaderboard alloc] initWithPlayers:[NSArray arrayWithObject:playerIds]];
380 |
381 | if (query != nil){
382 | [query loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
383 | if (error != nil)reject(@"Error", @"Error getting players leaderboards",error);
384 | else resolve(scores);
385 | }];
386 | }else{
387 | reject(@"Error", @"Error creating Leaderboard query",nil);
388 | }
389 | }@catch (NSError * e) {
390 | reject(@"Error",@"Error getting leaderboard players.", e);
391 | }
392 | }
393 |
394 |
395 |
396 | /*
397 | -----------------------------------------------------------------------------------------------------------------------------------------
398 | Achievements
399 | -----------------------------------------------------------------------------------------------------------------------------------------
400 | */
401 |
402 | /* --------------openAchievementModal--------------*/
403 |
404 | RCT_EXPORT_METHOD(openAchievementModal: (NSDictionary *)options
405 | resolve:(RCTPromiseResolveBlock)resolve
406 | rejecter:(RCTPromiseRejectBlock)reject){
407 |
408 | if(_isGameCenterAvailable==NO){
409 | reject(@"Error",@"Game Center is Unavailable", nil);
410 | return;
411 | }
412 |
413 | @try {
414 | GKGameCenterViewController* gcViewController = [[GKGameCenterViewController alloc]init];
415 | UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
416 | gcViewController.viewState = GKGameCenterViewControllerStateAchievements;
417 | // Get achievementIdentifier or use default achievementIdentifier
418 | NSString *achievementId;
419 | if(options[@"achievementIdentifier"])achievementId=options[@"achievementIdentifier"];
420 | else achievementId=_achievementIdentifier;
421 | gcViewController.leaderboardIdentifier = achievementId;
422 | //attaches to class to allow dismissal
423 | gcViewController.gameCenterDelegate = self;
424 | [rnView presentViewController:gcViewController animated:YES completion:nil];
425 | resolve(@"Successfully opened achievements");
426 | }
427 | @catch (NSError * e) {
428 | reject(@"Error",@"Error opening achievements.", e);
429 | }
430 | };
431 |
432 |
433 | /* --------------getAchievements--------------*/
434 |
435 | RCT_EXPORT_METHOD(getAchievements: (RCTPromiseResolveBlock)resolve
436 | rejecter:(RCTPromiseRejectBlock)reject){
437 |
438 | if(_isGameCenterAvailable==NO){
439 | reject(@"Error",@"Game Center is Unavailable", nil);
440 | return;
441 | }
442 |
443 | NSMutableArray *earntAchievements = [NSMutableArray array];
444 | [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error){
445 | if (error == nil) {
446 | for (GKAchievement* achievement in achievements) {
447 | NSMutableDictionary *entry = [NSMutableDictionary dictionary];
448 | entry[@"identifier"] = achievement.identifier;
449 | entry[@"percentComplete"] = [NSNumber numberWithDouble: achievement.percentComplete];
450 | entry[@"completed"] = [NSNumber numberWithBool:achievement.completed];
451 | entry[@"lastReportedDate"] = [NSNumber numberWithDouble:[achievement.lastReportedDate timeIntervalSince1970] * 1000];
452 | entry[@"showsCompletionBanner"] = [NSNumber numberWithBool:achievement.showsCompletionBanner];
453 | // entry[@"playerID"] = achievement.playerID;
454 | [earntAchievements addObject:entry];
455 | }
456 | resolve(earntAchievements);
457 | }else{
458 | reject(@"Error", @"Error getting achievements",error);
459 | }
460 | }];
461 | }
462 |
463 |
464 |
465 | /* --------------resetAchievements--------------*/
466 | RCT_EXPORT_METHOD(resetAchievements:(NSDictionary *)options
467 | resolve:(RCTPromiseResolveBlock)resolve
468 | rejecter:(RCTPromiseRejectBlock)reject){
469 | if(_isGameCenterAvailable==NO){
470 | reject(@"Error",@"Game Center is Unavailable", nil);
471 | return;
472 | }
473 |
474 | // Clear all progress saved on Game Center.
475 | if(!options[@"hideAlert"]){
476 | UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
477 | UIAlertController * alert = [UIAlertController
478 | alertControllerWithTitle:@"Reset Achievements?"
479 | message:@"Are you sure you want to reset your achievements. This can not be undone."
480 | preferredStyle:UIAlertControllerStyleAlert];
481 |
482 | UIAlertController *yesAlert = [UIAlertController alertControllerWithTitle:@"Success!"
483 | message:@"You successfully reset your achievements!"
484 | preferredStyle:UIAlertControllerStyleActionSheet];
485 |
486 | [yesAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
487 | [yesAlert dismissViewControllerAnimated:YES completion:nil];
488 | }]];
489 |
490 | UIAlertAction* yesButton = [UIAlertAction
491 | actionWithTitle:@"Reset"
492 | style:UIAlertActionStyleDefault
493 |
494 | handler:^(UIAlertAction * action) {
495 | //Handle your yes please button action here
496 | [GKAchievement resetAchievementsWithCompletionHandler: ^ (NSError * error){
497 | if(error != nil) {
498 | reject(@ "Error", @ "Error resetting achievements", error);}
499 | else {
500 | [rnView presentViewController:yesAlert animated:YES completion:nil];
501 | NSDictionary *json = @{
502 | @"message":@"User achievements not reset",
503 | @"resetAchievements":@true
504 | };
505 | resolve(json);
506 | }
507 | }];
508 | }];
509 |
510 | UIAlertAction* noButton = [UIAlertAction
511 | actionWithTitle:@"No!"
512 | style:UIAlertActionStyleDefault
513 | handler:^(UIAlertAction * action) {
514 | //Handle no, thanks button
515 | NSDictionary *json = @{
516 | @"message":@"User achievements not reset",
517 | @"resetAchievements":@false
518 | };
519 | resolve(json);
520 | }];
521 |
522 | [alert addAction:yesButton];
523 | [alert addAction:noButton];
524 |
525 | [rnView presentViewController:alert animated:YES completion:nil];
526 |
527 | }else{
528 | NSDictionary *json = @{
529 | @"message":@"User achievements reset",
530 | @"resetAchievements":@true
531 | };
532 | resolve(json);
533 | }
534 |
535 | }
536 |
537 |
538 | /* --------------submitAchievement--------------*/
539 |
540 | RCT_EXPORT_METHOD(submitAchievementScore:(NSDictionary *)options
541 | resolve:(RCTPromiseResolveBlock)resolve
542 | rejecter:(RCTPromiseRejectBlock)reject){
543 | if(_isGameCenterAvailable==NO) {
544 | reject(@"Error",@"Game Center is Unavailable", nil);
545 | return;
546 | }
547 | @try{
548 | NSString *percent = options[@"percentComplete"];
549 |
550 | float percentFloat = [percent floatValue];
551 | NSString *achievementId;
552 | if(options[@"achievementIdentifier"])achievementId=options[@"achievementIdentifier"];
553 | else achievementId=_achievementIdentifier;
554 |
555 | RCTLog(@"Will store: %@ (%f) on '%@'", percent, percentFloat, achievementId);
556 |
557 | if(!achievementId)return reject(@"Error",@"No Game Center `achievementIdentifier` passed and no default set", nil);
558 | BOOL showsCompletionBanner=YES;
559 | if(options[@"hideCompletionBanner"])showsCompletionBanner=NO;
560 | NSLog(@"showsCompletionBanner %d",showsCompletionBanner);
561 | GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: achievementId];
562 | if (achievement){
563 | achievement.percentComplete = percentFloat;
564 | achievement.showsCompletionBanner = showsCompletionBanner;
565 |
566 | NSArray *achievements = [NSArray arrayWithObjects:achievement, nil];
567 |
568 | [GKAchievement reportAchievements:achievements withCompletionHandler:^(NSError *error) {
569 | if (error != nil){
570 | reject(@"Error",@"Game Center setting Achievement", error);
571 | }else{
572 | // Achievement notification banners are broken on iOS 7 so we do it manually here if 100%:
573 | if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 &&
574 | [[[UIDevice currentDevice] systemVersion] floatValue] < 8.0 &&
575 | floorf(percentFloat) >= 100)
576 | {
577 | [GKNotificationBanner showBannerWithTitle:@"Achievement" message:@"Completed!" completionHandler:^{}];
578 | }
579 | resolve(achievements);
580 | }
581 | }];
582 | }
583 | } @catch (NSError * e) {
584 | reject(@"Error",@"Error setting achievement.", e);
585 | }
586 | }
587 |
588 |
589 | RCT_EXPORT_METHOD(invite:(NSDictionary *)options
590 | resolve:(RCTPromiseResolveBlock)resolve
591 | rejecter:(RCTPromiseRejectBlock)reject){
592 | if(_isGameCenterAvailable==NO){
593 | reject(@"Error",@"Game Center is Unavailable", nil);
594 | return;
595 | }
596 |
597 | GKMatchRequest *request = [[GKMatchRequest alloc] init];
598 | request.minPlayers = 2;
599 | request.maxPlayers = 4;
600 | request.recipients =@[@"G:8135064222"];
601 | request.inviteMessage = @"Your Custom Invitation Message Here";
602 | request.recipientResponseHandler = ^(GKPlayer *player, GKInviteeResponse response) {
603 | resolve(player);
604 | };
605 | }
606 |
607 | RCT_EXPORT_METHOD(getPlayerFriends:(RCTPromiseResolveBlock)resolve
608 | rejecter:(RCTPromiseRejectBlock)reject){
609 | if(_isGameCenterAvailable==NO){
610 | reject(@"Error",@"Game Center is Unavailable", nil);
611 | return;
612 | }
613 | resolve([GKLocalPlayer localPlayer].friends);
614 | }
615 |
616 | /*
617 | RCT_EXPORT_METHOD(challengeComposer:(int64_t) playerScore
618 | options:(NSDictionary *)options
619 | resolve:(RCTPromiseResolveBlock)resolve
620 | rejecter:(RCTPromiseRejectBlock)reject){
621 |
622 | GKLeaderboard *query = [[GKLeaderboard alloc] init];
623 | // Get achievementIdentifier or use default achievementIdentifier
624 | NSString *leaderboardId;
625 | if(options[@"leaderboardIdentifier"])leaderboardId=options[@"leaderboardIdentifier"];
626 | else leaderboardId=_leaderboardIdentifier;
627 |
628 | query.identifier = leaderboardId;
629 | query.playerScope = GKLeaderboardPlayerScopeFriendsOnly;
630 | query.range = NSMakeRange(1,100);
631 | [query loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
632 | NSPredicate *filter = [NSPredicate predicateWithFormat:@"value < %qi",playerScore];
633 | NSArray *lesserScores = [scores filteredArrayUsingPredicate:filter];
634 | // UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
635 | // *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
636 | // [self presentChallengeWithPreselectedScores: lesserScores];
637 | GKScore *gkScore = [[GKScore alloc] initWithLeaderboardIdentifier:leaderboardId];
638 | gkScore.value = playerScore;
639 | NSString *message=@"hey fag, face off?";
640 | //NSArray *players=@[@"high_scores"];
641 | NSMutableArray *players=@[@"G:8135064222"];
642 |
643 | // [gkScore issueChallengeToPlayers:players message:message];
644 | // GKScore *gkScore = [[GKInvite alloc] initWithLeaderboardIdentifier:leaderboardId];
645 |
646 | [gkScore challengeComposeControllerWithMessage:message
647 | players:players
648 | //players:[GKLocalPlayer localPlayer].friends
649 | completionHandler:^(UIViewController * _Nonnull composeController, BOOL didIssueChallenge, NSArray * _Nullable sentPlayerIDs) {
650 | if (error) reject(@"Error", @"Error reporting achievement",error);
651 | else resolve(sentPlayerIDs);
652 | }];
653 | }];
654 | }*/
655 | // Get achievementIdentifier or use default achievementIdentifier
656 | // NSString *achievementId;
657 | //
658 | // if(options[@"achievementIdentifier"])achievementId=options[@"achievementIdentifier"];
659 | // else achievementId=_achievementIdentifier;
660 | //
661 | // NSString *message=@"hey fag, face off?";
662 | // NSArray *players=@[@"high_scores"];
663 | // [self abc:@"Yoop"]
664 |
665 | // GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier:@"MyGame.bossDefeated"];
666 | // achievement.percentComplete = 100.0;
667 | // achievement.showsCompletionBanner = NO;
668 | //
669 | // [achievement reportAchievements: [NSArray arrayWithObjects:achievement, nil] WithCompletionHandler:NULL];
670 | // [self performSegueWithIdentifier:@"achievementChallenge" sender:achievement];
671 | //
672 |
673 | // [GKChallenge loadReceivedChallengesWithCompletionHandler:^(NSArray * _Nullable challenges, NSError * _Nullable error) {
674 | // <#code#>
675 | // }];
676 | // UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
677 | // *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
678 | // [UIViewController challengeComposeControllerWithMessage:message players:players
679 | //completionHandler:^(NSError *error) {
680 | // if (error) reject(@"Error", @"Error reporting achievement",error);
681 | // else resolve(@"opened challengeComposer!");
682 | //}];
683 | //
684 |
685 |
686 | //
687 | //- (void )prepareForSegue:(UIStoryboardSegue *)segue sender:(id)dsender
688 | //{
689 | // if ([segue.identifier isEqualToString:@"achievementChallenge"])
690 | // {
691 | //// MyAchievementChallengeViewController* challengeVC = (MyAchievementChallengeViewController*) segue.destinationViewController;
692 | //// UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
693 | //// [challengeVC performSegueWithIdentifier:@"startPlaying" sender:self];
694 | // //challengeVC.delegate = self;
695 | // //challengeVC.achievement = (GKAchievement*) sender;
696 | // }
697 | //}
698 | //
699 | //- (void) challengeViewController:(MyAchievementChallengeViewController*)controller wasDismissedWithChallenge:(BOOL)issued
700 | //{
701 | // [self dismissViewControllerAnimated:YES completion:NULL];
702 | // if (issued)
703 | // {
704 | // [controller.achievement issueChallengeToPlayers:controller.players message:controller.message];
705 | // }
706 | //}
707 |
708 | RCT_EXPORT_METHOD(challengePlayersToCompleteAchievement:(NSDictionary *)options
709 | resolve:(RCTPromiseResolveBlock)resolve
710 | rejecter:(RCTPromiseRejectBlock)reject){
711 | if(_isGameCenterAvailable==NO) {
712 | reject(@"Error",@"Game Center is Unavailable", nil);
713 | return;
714 | }
715 |
716 | GKAchievement *achievement;
717 | [achievement selectChallengeablePlayers:[GKLocalPlayer localPlayer].friends withCompletionHandler:^(NSArray *challengeablePlayers, NSError *error) {
718 | if (challengeablePlayers){
719 | resolve(challengeablePlayers);
720 | }
721 | }];
722 | }
723 |
724 |
725 | /* issued when the player completed a challenge sent by a friend
726 |
727 | - (void)player:(GKPlayer *)player didCompleteChallenge:(GKChallenge *)challenge issuedByFriend:(GKPlayer *)friendPlayer{
728 | NSLog(@"Challenge %@ sent by %@ completed", challenge.description , friendPlayer.displayName);
729 | }
730 | // issued when a friend of the player completed a challenge sent by the player
731 |
732 | - (void)player:(GKPlayer *)player issuedChallengeWasCompleted:(GKChallenge *)challenge byFriend:(GKPlayer *)friendPlayer{
733 | NSLog(@"Your friend %@ has successfully completed the %@ challenge", friendPlayer.displayName, challenge.description);
734 | }
735 |
736 | // issued when a player wants to play the challenge and has just started the game (from a notification)
737 |
738 | - (void)player:(GKPlayer *)player wantsToPlayChallenge:(GKChallenge *)challenge{
739 | //[self performSegueWithIdentifier:@"startPlaying" sender:self];
740 |
741 | UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
742 | [rnView performSegueWithIdentifier:@"startPlaying" sender:self];
743 | }
744 |
745 | // issued when a player wants to play the challenge and is in the game (the game was running while the challenge was sent)
746 |
747 |
748 | - (void)player:(GKPlayer *)player didReceiveChallenge:(GKChallenge *)challenge{
749 |
750 | NSString *friendMsg = [[NSString alloc] initWithFormat:@"Your friend %@ has invited you to a challenge: %@", player.displayName, challenge.message];
751 | UIAlertView *theChallenge = [[UIAlertView alloc] initWithTitle:@"Want to take the challenge?" message:friendMsg delegate:self cancelButtonTitle:@"Challenge accepted" otherButtonTitles:@"No", nil];
752 |
753 | [theChallenge show];
754 | }
755 |
756 |
757 |
758 |
759 | - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
760 | //if (buttonIndex == 0) [self performSegueWithIdentifier:@"startPlaying"sender:self];
761 | if (buttonIndex == 0) {
762 | UIViewController *rnView = [UIApplication sharedApplication].keyWindow.rootViewController;
763 | [rnView performSegueWithIdentifier:@"startPlaying" sender:self];
764 | }
765 | }
766 | */
767 | //-(void) submitAchievementScore:(NSString*)identifier percentComplete:(float)percent
768 | //{
769 | // if (isGameCenterAvailable == NO)
770 | // return;
771 | //
772 | // GKAchievement* achievement = [self getAchievement:identifier];
773 | // if (percent > achievement.percentComplete)
774 | // {
775 | // NSLog(@"new achievement %@ reported", achievement.identifier);
776 | // achievement.percentComplete = percent;
777 | // [achievement reportAchievementWithCompletionHandler:^(NSError* error) {
778 | // if (achievement.isCompleted) {
779 | // [delegate onReportAchievement:(GKAchievement*)achievement];
780 | // }
781 | // }];
782 | //
783 | // [self saveAchievements];
784 | // }
785 | //}
786 | //- (NSString*)getGameCenterSavePath{
787 | // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
788 | // return [NSString stringWithFormat:@"%@/GameCenterSave.txt",[paths objectAtIndex:0]];
789 | //}
790 | //
791 | //
792 | //- (void)saveAchievements:(GKAchievement *)achievement
793 | //{
794 | // NSString *savePath = [self getGameCenterSavePath];
795 | //
796 | // // If achievements already exist, append the new achievement.
797 | // NSMutableArray *achievements = [[NSMutableArray alloc] init];// autorelease];
798 | // NSMutableDictionary *dict;
799 | // if([[NSFileManager defaultManager] fileExistsAtPath:savePath]){
800 | // dict = [[NSMutableDictionary alloc] initWithContentsOfFile:savePath];// autorelease];
801 | //
802 | // NSData *data = [dict objectForKey:achievementsArchiveKey];
803 | // if(data) {
804 | // NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
805 | // achievements = [unarchiver decodeObjectForKey:achievementsArchiveKey];
806 | // [unarchiver finishDecoding];
807 | // //[unarchiver release];
808 | // [dict removeObjectForKey:achievementsArchiveKey]; // remove it so we can add it back again later
809 | // }
810 | // }else{
811 | // dict = [[NSMutableDictionary alloc] init];// autorelease];
812 | //
813 | // }
814 | // NSLog(@"saveeee%@",dict);
815 | //
816 | // [achievements addObject:achievement];
817 | //
818 | // // The achievement has been added, now save the file again
819 | // NSMutableData *data = [NSMutableData data];
820 | // NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
821 | // [archiver encodeObject:achievements forKey:achievementsArchiveKey];
822 | // [archiver finishEncoding];
823 | // [dict setObject:data forKey:achievementsArchiveKey];
824 | // [dict writeToFile:savePath atomically:YES];
825 | // //[archiver release];
826 | //}
827 | //
828 |
829 |
830 | //Enable the ability to close Achivments/Leaderboard Game Center Popup from React Native App
831 | - (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)viewController{
832 | [viewController dismissViewControllerAnimated:YES completion:nil];
833 | }
834 | //Enable the ability to close Achivments/Leaderboard Game Center Popup from React Native App
835 | - (void)gameCenterViewControllerDidCancel:(GKGameCenterViewController *)gameCenterViewController{
836 | //- (void)gameCenterViewControllerDidCancel:(GKGameCenterViewController *)viewController{
837 | [gameCenterViewController dismissViewControllerAnimated:YES completion:nil];
838 | }
839 |
840 |
841 | //-(void)updateAchievements{
842 | // NSString *achievementIdentifier;
843 | // float progressPercentage = 0.0;
844 | // BOOL progressInLevelAchievement = NO;
845 | //
846 | // GKAchievement *levelAchievement = nil;
847 | // GKAchievement *scoreAchievement = nil;
848 | //
849 | // if (_currentAdditionCounter == 0) {
850 | // if (_level <= 3) {
851 | // progressPercentage = _level * 100 / 3;
852 | // achievementIdentifier = @"Achievement_Level3";
853 | // progressInLevelAchievement = YES;
854 | // }
855 | // else if (_level < 6){
856 | // progressPercentage = _level * 100 / 5;
857 | // achievementIdentifier = @"Achievement_Level5Complete";
858 | // progressInLevelAchievement = YES;
859 | // }
860 | // }
861 | //
862 | // if (progressInLevelAchievement) {
863 | // levelAchievement = [[GKAchievement alloc] initWithIdentifier:achievementIdentifier];
864 | // levelAchievement.percentComplete = progressPercentage;
865 | // }
866 | //
867 | //
868 | // if (_score <= 50) {
869 | // progressPercentage = _score * 100 / 50;
870 | // achievementIdentifier = @"Achievement_50Points";
871 | // }
872 | // else if (_score <= 120){
873 | // progressPercentage = _score * 100 / 120;
874 | // achievementIdentifier = @"Achievement_120Points";
875 | // }
876 | // else{
877 | // progressPercentage = _score * 100 / 180;
878 | // achievementIdentifier = @"Achievement_180Points";
879 | // }
880 | //
881 | // scoreAchievement = [[GKAchievement alloc] initWithIdentifier:achievementIdentifier];
882 | // scoreAchievement.percentComplete = progressPercentage;
883 | //
884 | // NSArray *achievements = (progressInLevelAchievement) ? @[levelAchievement, scoreAchievement] : @[scoreAchievement];
885 | //
886 | // [GKAchievement reportAchievements:achievements withCompletionHandler:^(NSError *error) {
887 | // if (error != nil) {
888 | // NSLog(@"%@", [error localizedDescription]);
889 | // }
890 | // }];
891 | //}
892 |
893 | //
894 | //- (void)authenticateLocalPlayer
895 | //{
896 |
897 | // [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *viewController, NSError *error) {
898 | //
899 | // GKScore *score = [[GKScore alloc] initWithLeaderboardIdentifier:@"scoreLeaderboard"];
900 | // [score setValue:[[NSUserDefaults standardUserDefaults] integerForKey:@"highScore"]];
901 | //
902 | // [GKScore reportScores:@[score] withCompletionHandler:^(NSError *error) {
903 | // NSLog(@"Reporting Error: %@",error);
904 | // }];
905 | //
906 | // }];
907 | //}
908 |
909 | RCT_EXPORT_METHOD(loadSavedGameData:(NSDictionary *)options
910 | resolve:(RCTPromiseResolveBlock)resolve
911 | rejecter:(RCTPromiseRejectBlock)reject){
912 | GKLocalPlayer *mobSvcAccount = [GKLocalPlayer localPlayer];
913 |
914 | if(!mobSvcAccount.isAuthenticated){
915 | reject(@"Error",@"Can't load game: Game center is not initalized...", nil);
916 | return;
917 | }
918 |
919 | [mobSvcAccount fetchSavedGamesWithCompletionHandler:^(NSArray * _Nullable savedGames, NSError * _Nullable error) {
920 |
921 | if(error != nil) {
922 | NSLog(@"Failed to prepare saved game data: %@", error.description);
923 | reject(@"Error",@"Can't load game", nil);
924 | }
925 |
926 | GKSavedGame *savedGameToLoad = nil;
927 | for(GKSavedGame *savedGame in savedGames) { NSLog(@"Successfully downloaded saved game data");
928 | if([savedGame.name isEqualToString:options[@"name"]]) {
929 | if (savedGameToLoad == nil || savedGameToLoad.modificationDate < savedGame.modificationDate) {
930 | savedGameToLoad = savedGame;
931 | }
932 | }
933 | }
934 | if(savedGameToLoad == nil) {
935 | resolve(@{
936 | @"isConflict": @false,
937 | @"data": @""
938 | });
939 | return;
940 | }
941 | [savedGameToLoad loadDataWithCompletionHandler:^(NSData * _Nullable data, NSError * _Nullable error) {
942 | if(error == nil) {
943 | MobSvcSavedGameData *savedGameData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
944 | NSLog(@"Successfully downloaded saved game data");
945 | resolve(@{
946 | @"isConflict": @false,
947 | @"data": savedGameData.data
948 | });
949 | } else {
950 | NSLog(@"Failed to download saved game data: %@", error.description);
951 | reject(@"Error",@"Can't load game", nil);
952 | }
953 | }];
954 | }];
955 | }
956 |
957 |
958 | RCT_EXPORT_METHOD(uploadSavedGameData:(NSDictionary *)options
959 | resolve:(RCTPromiseResolveBlock)resolve
960 | rejecter:(RCTPromiseRejectBlock)reject){
961 | GKLocalPlayer *mobSvcAccount = [GKLocalPlayer localPlayer];
962 |
963 | if(!mobSvcAccount.isAuthenticated) {
964 | reject(@"Error",@"Can't save game: Game center is not initalized...", nil);
965 | return;
966 | }
967 | MobSvcSavedGameData *savedGameData = [[MobSvcSavedGameData alloc] init];
968 | savedGameData.data = options[@"data"];
969 | [mobSvcAccount saveGameData:[NSKeyedArchiver archivedDataWithRootObject:savedGameData] withName:options[@"name"] completionHandler:^(GKSavedGame * _Nullable savedGame __unused, NSError * _Nullable error) {
970 | if(error == nil) {
971 | NSLog(@"Successfully uploaded saved game data");
972 | resolve(@"Saved game data");
973 | } else {
974 | NSLog(@"Failed to upload saved game data: %@", error.description);
975 | reject(@"Error",@"Can't save game", nil);
976 | }
977 | }];
978 | }
979 |
980 |
981 |
982 |
983 | /*
984 | https://github.com/garrettmac/react-native-tweet/blob/master/Tweet/ios/RNTweet.m
985 | */
986 |
987 |
988 | /*
989 | //NSError *jsonError;
990 | // NSDictionary *json = [NSJSONSerialization
991 | // JSONObjectWithData:localPlayer
992 | // options:0
993 | // error:&jsonError];
994 | //NSDictionary *json = @{@"localPlayer":localPlayer};
995 |
996 |
997 |
998 | NSString *leaderboardIdentifier = @"StockShotLeaderboard";*/
999 | /*
1000 | GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
1001 | localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){
1002 | if (viewController != nil) {
1003 | [self presentViewController:viewController animated:YES completion:nil];
1004 | }
1005 | else{
1006 | if ([GKLocalPlayer localPlayer].authenticated) {
1007 | _gameCenterEnabled = YES;
1008 |
1009 | // Get the default leaderboard identifier.
1010 | [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {
1011 |
1012 | if (error != nil) {
1013 | NSLog(@"%@", [error localizedDescription]);
1014 | }
1015 | else{
1016 | _leaderboardIdentifier = leaderboardIdentifier;
1017 | }
1018 | }];
1019 | }
1020 |
1021 | else{
1022 | _gameCenterEnabled = NO;
1023 | }
1024 | }
1025 | };*/
1026 |
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 | /*
1034 |
1035 |
1036 |
1037 | -(void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
1038 | {
1039 | [gameCenterViewController dismissViewControllerAnimated:YES completion:nil];
1040 | }
1041 | */
1042 |
1043 |
1044 | /*
1045 |
1046 | -(void)updateAchievements{
1047 | NSString *achievementIdentifier;
1048 | float progressPercentage = 0.0;
1049 | BOOL progressInLevelAchievement = NO;
1050 |
1051 | GKAchievement *levelAchievement = nil;
1052 | GKAchievement *scoreAchievement = nil;
1053 |
1054 | if (_currentAdditionCounter == 0) {
1055 | if (_level <= 3) {
1056 | progressPercentage = _level * 100 / 3;
1057 | achievementIdentifier = @"Achievement_Level3";
1058 | progressInLevelAchievement = YES;
1059 | }
1060 | else if (_level < 6){
1061 | progressPercentage = _level * 100 / 5;
1062 | achievementIdentifier = @"Achievement_Level5Complete";
1063 | progressInLevelAchievement = YES;
1064 | }
1065 | }
1066 |
1067 | if (progressInLevelAchievement) {
1068 | levelAchievement = [[GKAchievement alloc] initWithIdentifier:achievementIdentifier];
1069 | levelAchievement.percentComplete = progressPercentage;
1070 | }
1071 |
1072 |
1073 | if (_score <= 50) {
1074 | progressPercentage = _score * 100 / 50;
1075 | achievementIdentifier = @"Achievement_50Points";
1076 | }
1077 | else if (_score <= 120){
1078 | progressPercentage = _score * 100 / 120;
1079 | achievementIdentifier = @"Achievement_120Points";
1080 | }
1081 | else{
1082 | progressPercentage = _score * 100 / 180;
1083 | achievementIdentifier = @"Achievement_180Points";
1084 | }
1085 |
1086 | scoreAchievement = [[GKAchievement alloc] initWithIdentifier:achievementIdentifier];
1087 | scoreAchievement.percentComplete = progressPercentage;
1088 |
1089 | NSArray *achievements = (progressInLevelAchievement) ? @[levelAchievement, scoreAchievement] : @[scoreAchievement];
1090 |
1091 | [GKAchievement reportAchievements:achievements withCompletionHandler:^(NSError *error) {
1092 | if (error != nil) {
1093 | NSLog(@"%@", [error localizedDescription]);
1094 | }
1095 | }];
1096 | }
1097 | */
1098 |
1099 |
1100 | /*
1101 |
1102 | -(void)updateAchievements{
1103 | NSString *achievementIdentifier;
1104 | float progressPercentage = 0.0;
1105 | BOOL progressInLevelAchievement = NO;
1106 |
1107 | GKAchievement *levelAchievement = nil;
1108 | GKAchievement *scoreAchievement = nil;
1109 |
1110 | if (_currentAdditionCounter == 0) {
1111 | if (_level <= 3) {
1112 | progressPercentage = _level * 100 / 3;
1113 | achievementIdentifier = @"Achievement_Level3";
1114 | progressInLevelAchievement = YES;
1115 | }
1116 | else if (_level < 6){
1117 | progressPercentage = _level * 100 / 5;
1118 | achievementIdentifier = @"Achievement_Level5Complete";
1119 | progressInLevelAchievement = YES;
1120 | }
1121 | }
1122 |
1123 | if (progressInLevelAchievement) {
1124 | levelAchievement = [[GKAchievement alloc] initWithIdentifier:achievementIdentifier];
1125 | levelAchievement.percentComplete = progressPercentage;
1126 | }
1127 |
1128 |
1129 | if (_score <= 50) {
1130 | progressPercentage = _score * 100 / 50;
1131 | achievementIdentifier = @"Achievement_50Points";
1132 | }
1133 | else if (_score <= 120){
1134 | progressPercentage = _score * 100 / 120;
1135 | achievementIdentifier = @"Achievement_120Points";
1136 | }
1137 | else{
1138 | progressPercentage = _score * 100 / 180;
1139 | achievementIdentifier = @"Achievement_180Points";
1140 | }
1141 |
1142 | scoreAchievement = [[GKAchievement alloc] initWithIdentifier:achievementIdentifier];
1143 | scoreAchievement.percentComplete = progressPercentage;
1144 |
1145 | NSArray *achievements = (progressInLevelAchievement) ? @[levelAchievement, scoreAchievement] : @[scoreAchievement];
1146 |
1147 | [GKAchievement reportAchievements:achievements withCompletionHandler:^(NSError *error) {
1148 | if (error != nil) {
1149 | NSLog(@"%@", [error localizedDescription]);
1150 | }
1151 | }];
1152 | }
1153 | */
1154 |
1155 | /*
1156 |
1157 | -(void)resetAchievements{
1158 | [GKAchievement resetAchievementsWithCompletionHandler:^(NSError *error) {
1159 | if (error != nil) {
1160 | NSLog(@"%@", [error localizedDescription]);
1161 | }
1162 | }];
1163 | }
1164 |
1165 | */
1166 |
1167 | /*
1168 | - (IBAction)showGCOptions:(id)sender {
1169 | ...
1170 |
1171 | [_customActionSheet showInView:self.view
1172 | withCompletionHandler:^(NSString *buttonTitle, NSInteger buttonIndex) {
1173 | if ([buttonTitle isEqualToString:@"View Leaderboard"]) {
1174 | ...
1175 | }
1176 | else if ([buttonTitle isEqualToString:@"View Achievements"]) {
1177 | ...
1178 | }
1179 | else{
1180 | [self resetAchievements];
1181 | }
1182 | }];
1183 | ....
1184 | }
1185 | */
1186 |
1187 |
1188 | /*
1189 | - (IBAction)showGCOptions:(id)sender {
1190 | ...
1191 | [_customActionSheet showInView:self.view
1192 | withCompletionHandler:^(NSString *buttonTitle, NSInteger buttonIndex) {
1193 |
1194 | if ([buttonTitle isEqualToString:@"View Leaderboard"]) {
1195 | [self showLeaderboardAndAchievements:YES];
1196 | }
1197 | else if ([buttonTitle isEqualToString:@"View Achievements"]) {
1198 | [self showLeaderboardAndAchievements:NO];
1199 | }
1200 | else{
1201 |
1202 | }
1203 | }];
1204 | ...
1205 | }*/
1206 | @end
1207 |
1208 |
1209 | @implementation MobSvcSavedGameData
1210 |
1211 | #pragma mark MobSvcSavedGameData implementation
1212 |
1213 | static NSString * const sgDataKey = @"data";
1214 |
1215 | + (instancetype)sharedGameData {
1216 | static id sharedInstance = nil;
1217 |
1218 | static dispatch_once_t onceToken;
1219 | dispatch_once(&onceToken, ^{
1220 | sharedInstance = [[self alloc] init];
1221 | });
1222 |
1223 | return sharedInstance;
1224 | }
1225 |
1226 | - (void)reset
1227 | {
1228 | self.data = nil;
1229 | }
1230 |
1231 | - (void)encodeWithCoder:(NSCoder *)encoder
1232 | {
1233 | [encoder encodeObject:self.data forKey: sgDataKey];
1234 | }
1235 |
1236 | - (nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder {
1237 | self = [self init];
1238 | if (self) {
1239 | self.data = [decoder decodeObjectForKey:sgDataKey];
1240 | }
1241 | return self;
1242 | }
1243 |
1244 | @end
1245 |
1246 |
1247 |
1248 | /*
1249 |
1250 |
1251 |
1252 | #import "GameCenterPlugin.h"
1253 | #import
1254 |
1255 | #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
1256 |
1257 | @interface GameCenterPlugin ()
1258 | @property (nonatomic, retain) GKLeaderboardViewController *leaderboardController;
1259 | @property (nonatomic, retain) GKAchievementViewController *achievementsController;
1260 | @end
1261 |
1262 | @implementation GameCenterPlugin
1263 |
1264 | - (void)dealloc {
1265 | self.leaderboardController = nil;
1266 | self.achievementsController = nil;
1267 |
1268 | [super dealloc];
1269 | }
1270 |
1271 | - (void)authenticateLocalPlayer:(CDVInvokedUrlCommand *)command {
1272 |
1273 | [self.commandDelegate runInBackground:^{
1274 |
1275 | if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
1276 | [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
1277 | if (error == nil) {
1278 | CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
1279 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1280 | } else {
1281 | CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
1282 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1283 | }
1284 | }];
1285 | } else {
1286 | [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *viewcontroller, NSError *error) {
1287 | CDVPluginResult *pluginResult;
1288 |
1289 | if ([GKLocalPlayer localPlayer].authenticated) {
1290 | // Already authenticated
1291 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
1292 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1293 | } else if (viewcontroller) {
1294 | // Present the login view
1295 |
1296 | CDVViewController *cont = (CDVViewController *)[super viewController];
1297 | [cont presentViewController:viewcontroller animated:YES completion:^{
1298 | [self.webView stringByEvaluatingJavaScriptFromString:@"window.gameCenter._viewDidShow()"];
1299 | }];
1300 |
1301 | } else {
1302 | // Called the second time with result
1303 | if (error == nil) {
1304 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
1305 | } else {
1306 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
1307 | }
1308 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1309 |
1310 | }
1311 |
1312 | }];
1313 | }
1314 | }];
1315 | }
1316 |
1317 | - (void)reportScore:(CDVInvokedUrlCommand *)command {
1318 |
1319 | [self.commandDelegate runInBackground:^{
1320 | NSString *category = (NSString *) [command.arguments objectAtIndex:0];
1321 | int64_t score = [[command.arguments objectAtIndex:1] integerValue];
1322 |
1323 | GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:category] autorelease];
1324 | scoreReporter.value = score;
1325 |
1326 | [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
1327 | CDVPluginResult *pluginResult;
1328 | if (!error) {
1329 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
1330 | } else {
1331 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
1332 | }
1333 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1334 | }];
1335 | }];
1336 | }
1337 |
1338 | - (void)openLeaderboardModal:(CDVInvokedUrlCommand *)command {
1339 | [self.commandDelegate runInBackground:^{
1340 | if ( self.leaderboardController == nil ) {
1341 | self.leaderboardController = [[GKLeaderboardViewController alloc] init];
1342 | self.leaderboardController.leaderboardDelegate = self;
1343 | }
1344 |
1345 | self.leaderboardController.category = (NSString *) [command.arguments objectAtIndex:0];
1346 | CDVViewController *cont = (CDVViewController *)[super viewController];
1347 | [cont presentViewController:self.leaderboardController animated:YES completion:^{
1348 | [self.webView stringByEvaluatingJavaScriptFromString:@"window.gameCenter._viewDidShow()"];
1349 | }];
1350 | }];
1351 | }
1352 |
1353 | - (void)openAchievementModal:(CDVInvokedUrlCommand *)command {
1354 | [self.commandDelegate runInBackground:^{
1355 | if ( self.achievementsController == nil ) {
1356 | self.achievementsController = [[GKAchievementViewController alloc] init];
1357 | self.achievementsController.achievementDelegate = self;
1358 | }
1359 |
1360 | CDVViewController *cont = (CDVViewController *)[super viewController];
1361 | [cont presentViewController:self.achievementsController animated:YES completion:^{
1362 | [self.webView stringByEvaluatingJavaScriptFromString:@"window.gameCenter._viewDidShow()"];
1363 | }];
1364 | }];
1365 | }
1366 |
1367 | - (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController {
1368 | CDVViewController *cont = (CDVViewController *)[super viewController];
1369 | [cont dismissViewControllerAnimated:YES completion:nil];
1370 | [self.webView stringByEvaluatingJavaScriptFromString:@"window.gameCenter._viewDidHide()"];
1371 | }
1372 |
1373 | - (void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController {
1374 | CDVViewController* cont = (CDVViewController *)[super viewController];
1375 | [cont dismissViewControllerAnimated:YES completion:nil];
1376 | [self.webView stringByEvaluatingJavaScriptFromString:@"window.gameCenter._viewDidHide()"];
1377 | }
1378 |
1379 | - (void)reportAchievementIdentifier:(CDVInvokedUrlCommand *)command {
1380 | [self.commandDelegate runInBackground:^{
1381 | NSString *identifier = (NSString *) [command.arguments objectAtIndex:0];
1382 | float percent = [[command.arguments objectAtIndex:1] floatValue];
1383 |
1384 | GKAchievement *achievement = [[[GKAchievement alloc] initWithIdentifier: identifier] autorelease];
1385 | if (achievement) {
1386 | achievement.percentComplete = percent;
1387 | [achievement reportAchievementWithCompletionHandler:^(NSError *error) {
1388 | CDVPluginResult *pluginResult;
1389 | if (!error) {
1390 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
1391 | } else {
1392 | pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:[error localizedDescription]];
1393 | }
1394 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1395 | }];
1396 | } else {
1397 | CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Failed to alloc GKAchievement"];
1398 | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
1399 | }
1400 | }];
1401 | }
1402 |
1403 | @end
1404 |
1405 |
1406 | */
1407 |
--------------------------------------------------------------------------------