These notices are being logged on behalf of my app (which implements GKSessionDelegate), and I could really make use of these events to help users with connection difficulties. Is there any way I can detect them? There aren't any public instance methods for the delegate that directly refer to these events.
I'm hoping there's some sort of generic event catch-all for delegates that I could rig up.
GKSessionTester[79766:307] BTM: attaching to BTServer
GKSessionTester[79766:307] <<< Session >>> +[GKBluetoothSupport _determineBluetoothStatus]: BT not available - try again later.
GKSessionTester[79766:307] BTM: posting no开发者_如何学JAVAtification BluetoothAvailabilityChangedNotification
As Gonzalo mentions in the comments, it looks like a notification is being posted with the name BluetoothAvailabilityChangedNotification
.
Cocoa's notifications system is based around NSNotificationCenter, which maintains a list of observers and forwards notifications based on names, which are simply NSStrings. It is very likely that you can receive notifications if you call:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(bluetoothAvailabilityChanged:)
name:@"BluetoothAvailabilityChangedNotification"
object:nil];
And implement the method:
- (void)bluetoothAvailabilityChanged:(NSNotification *)notification
{
// maybe [notification userInfo] has some useful info...
}
You might not receive any notifications if GameKit is using a separate notification center object.
Does this count as private API? I would say it's no worse than parsing your console output. You are not calling methods on undocumented classes, you are passively observing notifications posted with a given name.
Of course, Apple's opinion is the only one that matters. If I were in your shoes, I would make sure that:
- your app functions correctly if the notification is never posted (because a future iOS might not post it, or you might have to remove the code and resubmit without it);
- your app makes no assumptions about the NSNotification's
object
or contents of itsuserInfo
dictionary (because whatever they contain today might change in the future).
Alternatively, you could figure out a way to intercept your own app's STDOUT and STDERR (any solution that works on generic UNIX may work on iOS) and watch the text for relevant log messages.
精彩评论