Ja, es ist möglich, das Game Center-Begrüßungsbanner programmgesteuert in Ihrer App zu unterdrücken, zumindest unter iOS 7. Mein Ansatz basiert auf einigen Beobachtungen:
- Das Banner wird als zusätzliches UIWindow in Ihrer UIApplication angezeigt.
- Dieses Fenster scheint immer bei Index 1 zu erscheinen (vorausgesetzt, Ihre App verwendet nur ein Fenster.)
- Das Banner ist auf dem iPad 66 Pixel hoch, auf dem iPhone 64 Pixel.
- Das Banner enthält eine 42 x 42 Pixel große Unteransicht für das Game Center-Symbol.
- Es ist bekannt, wann das Banner wahrscheinlich erscheint. (dh innerhalb weniger Sekunden nach dem Erstellen eines GKLocalPlayer-Objekts beim Start, um die Authentifizierung zu testen.)
So können Sie die Fenster Ihrer Anwendung in diesen wenigen Sekunden einfach wiederholt abfragen und darauf warten, dass das zusätzliche Fenster angezeigt wird. (Das Beobachten von Schlüsselwerten ist wahrscheinlich der "richtige" Weg, dies zu tun, aber ich bin faul.) Wenn das Fenster angezeigt wird, testen Sie, ob es eine Unteransichtshierarchie wie oben beschrieben enthält, was darauf hinweist, dass es sich wahrscheinlich um das Game Center-Banner handelt. Wenn ja, setzen Sie das Alpha des Fensters auf 0. Das war's.
Hier ist ein Code, der dies in meiner App erreicht. Ich rufe diese Methode sofort nach dem Versuch auf, den lokalen Player zu authentifizieren, und sie ruft sich einige Sekunden lang selbst auf, bis das Banner gefunden (und ausgeblendet) wird, oder es tritt eine Zeitüberschreitung auf:
- (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];
}
Hin und wieder flackert eine einzelne Pixelzeile am oberen Bildschirmrand, bevor das Banner ausgeblendet wird. Im Allgemeinen scheint diese Methode jedoch gut genug zu funktionieren. Verwenden Sie auf eigenes Risiko und genießen Sie!