Я искал эту информацию в Интернете и в документах Apple, но не смог найти ответ... Знаете ли вы, есть ли способ скрыть сообщение «Добро пожаловать обратно, имя_игрока» от Game Center при аутентификации игрока?
Благодарю вас!
Я искал эту информацию в Интернете и в документах Apple, но не смог найти ответ... Знаете ли вы, есть ли способ скрыть сообщение «Добро пожаловать обратно, имя_игрока» от Game Center при аутентификации игрока?
Благодарю вас!
Нет, нет. Вы не можете изменить поведение сервисов iOS (частью которых является GameCenter) без джейлбрейка устройства и их переподключения. И из любопытства - зачем вам это?
Да, можно программно подавить приветственный баннер Game Center из вашего приложения, по крайней мере, в iOS 7. Мой подход основан на нескольких наблюдениях:
Таким образом, вы можете просто несколько раз опрашивать окна вашего приложения в течение этих нескольких секунд, ожидая появления дополнительного окна. (Наблюдение за ключом и значением, вероятно, является «правильным» способом сделать это, но я ленив.) Когда появится окно, проверьте, содержит ли оно иерархию подпредставления, как описано выше, что указывает на то, что это, вероятно, баннер Game Center. Если это так, установите альфа окна на 0. Вот и все.
Вот некоторый код, который выполняет это в моем приложении. Я вызываю этот метод сразу после попытки аутентифицировать локального игрока, и он вызывает себя в течение нескольких секунд, пока не найдет (и не скроет) баннер, или же истечет время ожидания:
- (void)suppressGCBanner:(id)object {
int osVersion = [[[UIDevice currentDevice] systemVersion] intValue];
if (osVersion != 7) return; // only tested against iOS 7
static int iter = 0; // try for 4 seconds, typically takes about one second for banner to appear
static int origWindowCount = 0;
NSArray* windows = [UIApplication sharedApplication].windows;
if (origWindowCount == 0) origWindowCount = (int)[windows count];
BOOL ipad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
float bannerHeight = ipad ? 66.0f : 64.0f; // GC banner has height 66 on iPad, 64 on iPhone
if ([windows count] > origWindowCount) {
NSLog(@"suppressGCBanner: found extra window, testing");
UIWindow* window = [windows objectAtIndex:1]; // in my testing, the GC banner is always at index 1
for (UIView* view in [window subviews]) {
CGRect frame = view.frame;
NSLog(@"subview size: %f, %f", frame.size.width, frame.size.height);
if (frame.size.height != bannerHeight) continue;
for (UIView* subview in [view subviews]) {
CGRect frame = subview.frame;
NSLog(@"sub-subview size: %f, %f", frame.size.width, frame.size.height);
if (frame.size.width == 42.0f && frame.size.height == 42.0f) { // Game Center icon is 42x42
NSLog(@"found GameCenter banner: hiding. iter = %i", iter);
window.alpha = 0.0f; // make the window invisible!
return;
}
}
}
}
if (++iter > 200) {
NSLog(@"suppressGCBanner: timeout, bailing");
return;
}
// ____ otherwise recurse
[self performSelector:@selector(suppressGCBanner:) withObject:nil afterDelay:0.02f];
}
Время от времени вы увидите мерцающую линию в один пиксель в верхней части экрана, прежде чем баннер будет скрыт, но в целом этот метод работает достаточно хорошо. Используйте на свой страх и риск и наслаждайтесь!
Вот более короткая версия для Swift:
//Call it right after create this object:
let localPlayer = GKLocalPlayer.localPlayer()
suppressGCBanner(0, originalWindowCount: UIApplication.sharedApplication().windows.count)
////////////////////////////////////////////////////////////////////////
static func suppressGCBanner(iteration: Int, originalWindowCount: Int) {
let windows = UIApplication.sharedApplication().windows
if windows.count > originalWindowCount {
let window = windows[1]
if window.respondsToSelector("currentBannerViewController") || window.respondsToSelector("bannerSemaphore") {
print("Found banner, killing it \(iteration)")
window.hidden = true
return
}
}
if iteration > 200 {
print("suppressGCBanner: timeout, bailing")
return
}
runThisAfterDelay(seconds: 0.02, after: {
suppressGCBanner(iteration + 1, originalWindowCount: originalWindowCount)
})
}
static func runThisAfterDelay(seconds seconds: Double, after: () -> ()) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue(), after)
}
Вы можете выйти из Game Center, если это для вас вариант. Большинство игр основаны на реакции, и уведомление, блокирующее 15% экрана на 3 секунды, явно не будет оценено.
Вот рабочая версия, адаптированная для swift3:
NameOfYourClass.suppressGCBanner(0, originalWindowCount: UIApplication.shared.windows.count)
static func suppressGCBanner(_ iteration: Int, originalWindowCount: Int) {
let windows = UIApplication.shared.windows
if windows.count > originalWindowCount {
let window = windows[1]
if window.responds(to: Selector("currentBannerViewController")) || window.responds(to: Selector("bannerSemaphore")) {
print("Found banner, killing it \(iteration)")
window.isHidden = true
return
}
}
if iteration > 200 {
print("suppressGCBanner: timeout, bailing")
return
}
runThisAfterDelay(seconds: 0.02, after: {
suppressGCBanner(iteration + 1, originalWindowCount: originalWindowCount)
})
}
static func runThisAfterDelay(seconds: Double, after: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
after()
}
}