首先,我借鉴Type One Error的代码,从https://github.com/typeoneerror/GKAchievementNotification中抓取一些代码植入自己的项目。我们将采用GKAchievementNotification和GKAchievementHandler类,同时进行相应更新和修改。首先,若你在游戏中运用ARC,快速扫描代码,移除那些发行、保留和自动发行代码属性。若你不想进行扫描,试着将文件放入项目及修复不符编译程序的内容,然后再创建内容。 Type One Error类将展示类似于iOS 5所呈现的通知内容,但代码需获悉成就标题和描述是什么。为实现这点,你需要嵌入“showsCompletionBanner”目标。 GKAchievementDescription目标的优点是它们已根据用户语言设定进行本土化,因此采用此方式不存在任何本土化问题。 其弊端在于你无法只加载一个成就描述,你需要加载所有内容。我认为进行此操作的最佳时间是用户已在应用上认证Game Center,此时你需要通过异步调用获得这些消息。值得欣慰的是,苹果在此设有API调用,我将此放置在用户认证访问的CompletionHandler中。 若你采用Ray Wenderlich网站的代码,那么你就既能够运用此方法,又拥有新方法。将NSMutableDictionary * self.achievementsDescDictionary添加至所有处理游戏Game Center代码的类(游戏邦注:它会在随后的体验中存储成就数据)。 - (void)authenticateLocalUser { if (!gameCenterAvailable) return; NSLog(@”Authenticating local user…”); if ([GKLocalPlayer localPlayer].authenticated == NO) { [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) { if([GKLocalPlayer localPlayer].isAuthenticated){ [self retrieveAchievmentMetadata]; //Here is the new code } }]; } } //Here is the new method. - (void) retrieveAchievmentMetadata { self.achievementsDescDictionary = [[NSMutableDictionary alloc] initWithCapacity:2]; [GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler: ^(NSArray *descriptions, NSError *error) { if (error != nil) { NSLog(@"Error %@", error); } else { if (descriptions != nil){ for (GKAchievementDescription* a in descriptions) { [achievementsDescDictionary setObject: a forKey: a.identifier]; } } } }]; } “retrieveAchievmentMetadata”方法会初始化所有信息库,然后调用游戏所有成就描述,进行循环,将它们添加至信息库。这属于异步调用,所以不应减缓游戏或项目的启动。 现在我们握有各成就的标题和描述,因此能够修改原始代码创造iOS 4/5的善意通知,其将通过Type One Error代码连续展示所有成就。 - (void)reportAchievement:(NSString *)identifier percentComplete:(double)percentComplete { GKAchievement* achievement = [[GKAchievement alloc] initWithIdentifier:identifier]; achievement.percentComplete = percentComplete; if (percentComplete == 100.0) { //Show banners manually GKAchievementDescription *desc = [achievementsDescDictionary objectForKey:identifier]; //Update pull achievement description for dictionary [[GKAchievementHandler defaultHandler] notifyAchievement:desc]; //Display to user } [achievementsToReport addObject:achievement]; //Queue up the achievement to be sent [self save]; if (!gameCenterAvailable || !userAuthenticated) return; [self sendAchievement:achievement]; //Try to send achievement } - (void)sendAchievement:(GKAchievement *)achievement { [achievement reportAchievementWithCompletionHandler: ^(NSError *error) { dispatch_async(dispatch_get_main_queue(), ^(void) { if (error == NULL) { NSLog(@"Successfully sent archievement!"); [achievementsToReport removeObject:achievement]; //Remove Achievement from queue. } else { NSLog(@”Achievement failed to send… will try again \ later. Reason: %@”, error.localizedDescription); } }); }]; }如果你想让成就中显示为你在itunes connect中设置成就的自定义图片,首先将通知部分代码修改成如下代码: if (percentComplete == 100.0) { //Show banners manually GKAchievementDescription *desc = [achievementsDescDictionary objectForKey:identifier]; [desc loadImageWithCompletionHandler:^(UIImage *image, NSError *error) { if (error == nil) { [[GKAchievementHandler defaultHandler] setImage:desc.image]; //If image found, updates the image to the achievement image. } [[GKAchievementHandler defaultHandler] notifyAchievement:desc]; }]; }使用以上方式默认为横屏显示成就通知,如果想换成竖屏提示,那么这里Himi给出参考代码: (责任编辑:admin) |