Оповещение о входе в GameCenter

в игре, которую я разрабатываю с помощью GameCenter, я хочу обработать следующий сценарий:

  1. пользователь запускает игру. Ему отображается системное предупреждение, которое предлагает ему войти в GameCenter. Он игнорирует ее.
  2. через некоторое время пользователь хочет войти в GameCenter и нажимает на(например) пункт меню лидеров. Он выбирает отменить вместо входа в систему.
  3. процесс повторяется несколько раз. В конце концов пользователь хочет для входа в GameCenter. Он еще раз щелкает по пункту меню таблицы лидеров.

в моих тестах я обнаружил, что всплывающее окно предупреждения, вызванное вызовом "authenticateWithCompletionHandler" (как вызывается образцом GameCenterManager от Apple), который предлагает войти в GameCenter, появляется ограниченное количество раз (4 или 5). В последний раз, когда он появляется, он говорит: "Game Center отключен, войдите в приложение Game Center, чтобы включить "впоследствии". После вызова authenticateWithCompletionHandler уже вообще не видно-не подскажу вообще.

играя FruitNinja я попытался воспроизвести это. Однако в их случае всплывающее окно с надписью "Game Center Disabled" появляется каждый раз, когда я нажимаю на элемент GameCenter(например, достижения).

то, что я хотел бы сделать, это дублировать функциональность: то есть, если вы не вошли в GameCenter, чтобы стандартное предупреждение game center появлялось все время, когда вы нажимаете на Пункт меню таблицы лидеров.

есть ли способ узнать, появилось ли стандартное предупреждение "войти в game center" или заставить его появляться все время(а не только первые пару попыток)?

7 ответов


поведение что - то к эффекту, после n неудачных попыток-отключить GameCenter для приложения. Перезапуск приложения или вход в систему в gamecenter сам вернет его в сеть.

Я забыл, в каком документе я это прочитал, но есть документ Apple, который объясняет это поведение.


вот идея обойти эту проблему:

независимо от того, отменен ли запрос"GC authenticateWithCompletionHandler" -запрос

  • пользователь нажав "отмена" в диалоговом окне

или из-за того, что

  • GC отключен на устройстве (что происходит после того, как пользователь отменил alert-dialog ровно 3 раза (в iOS 5 по крайней мере))

вы всегда будете получать NSError с кодом 2 "запрошенная операция отменена.".

единственное различие, которое я мог найти,-это время, прошедшее между запросом authenticateWithCompletionHandler и выполнением обработчика завершения.

поэтому при отправке запроса я экономлю время:

requestTime = [NSDate date]; 

и в моем обработчике завершения я измеряю время:

NSDate* now = [NSDate date];
CFTimeInterval elapsedTimeSinceAuthenticationRequest = [now timeIntervalSinceDate:requestTime];
NSLog(@"time Elapsed: %f", elapsedTimeSinceAuthenticationRequest);

если пользователь отменил запрос, прошедшее время будет значительно больше по сравнению со временем, прошедшим, если GC отменил операцию. В моих тестах пользователю потребовалось не менее одной секунды, чтобы отменить диалог, тогда как запрос GC-cancelled занял менее 0,1 секунды (на моем iPhone 4)

конечно, эти значения могут варьироваться в зависимости от устройства, на котором выполняется код, и от того, чем еще занят процессор в данный момент. Один подводный камень я уже рассмотрен запуск приложения: Если вы отправляете authenticationRequest в applicationDidFinishLaunching как по предложению Apple, GC потребовалось гораздо больше времени, чтобы отменить запрос в моем случае, потому что устройство занято загрузкой представлений и всего, что необходимо для запуска приложения.

поэтому дайте мне знать, если вы попробовали это решение и если оно сработало для вас, как и я, как только я сделаю дальнейшее тестирование...


Я не мог найти хорошего ответа на это, поэтому я решил просто скопировать Сообщение, Как только я начну получать ошибку отмены. Это все еще находится в разработке, но в основном изменяет обратный вызов кнопки для отображения предупреждения об ошибке, а не отображения лидера.

просто примечание, не уверен, будет ли это одобрено или нет, так как я реплицирую сообщение об ошибке Apple.

-(void) gcLogin: (id) sender {
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
        if(error) {
            if([[error domain] isEqualToString:GKErrorDomain] && [error code] == GKErrorCancelled) {
                [ResourceManager showAlertWithTitle:@"GameCenter Disabled" message:@"Sign in with Game Center application to enable"];
                mGameCenterCancelled = YES;
            }
            NSLog(@"%@", [error description]);
        } else { 
            [self updateMenu];
            mGameCenterCancelled = NO;
        }
    }];
}

Я сам играю с Game Center прямо сейчас, я видел то же самое поведение. В документации ничего не говорится о диалоге, который появляется только первые пару раз. В моем случае я хотел бы заранее сказать, если пользователь уже вошел в Game Center, чтобы я мог вести себя соответствующим образом. Но теперь я не могу этого знать, прежде чем диалоговое окно будет показано пользователю.

поскольку мы работаем в песочнице во время разработки, это поведение, конечно, может быть чем-то, что ведет себя по-разному во время производства, но это нелегко выяснить.


может быть ссылка будет полезной (первые три абзаца): http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW9

основная точка находится в прямоугольнике "важно".


Я столкнулся с той же проблемой. Хотя я не мог найти способ заставить всплывающее окно для входа в Game Center, я нашел способ реализовать предупреждающее сообщение о том, что "gamecenter отключен" , когда пользователь нажимает на значок таблицы лидеров:

Если([localPlayer GKLocalPlayer].authenticated == NO)
{
// Запросить предупреждение о том, что game center отключен
}
иначе!--4--> {
// Продолжить открытие лидеров
}

надеюсь, что это помогает!


похоже, что iOS полностью отключит Game Center и предотвратит его запрос после того, как пользователь решит отключить Game Center (опция появится на вашем пятом 5th Game Center cancel sign in).

для восстановления устройства в исходное состояние, где снова появится приглашение войти. Просто войдите в приложение Game Center, используя обычную рабочую учетную запись Game Center (не тестер). Как только вы войдете, зарегистрируйтесь. Он должен начать подсказывать вам снова внутри вашего приложение.