It doesn't matter whether wifi is on or off if you also have a cellular connection. The GC code will use whichever network access is available. If neither is available when you call 'reportScoreWithCompletionHandler:^(NSError *error)' it will report the score the next time the network becomes available.
You didn't say whether your code has ever worked. A common error is that the leaderboard identifier in your code doesn't exactly match the leaderboard ID in iTunesConnect. If they don't match the score will never be successfully reported but it won't tell you what the problem is.
Also note that the score should be a 64-bit value. Maybe you are reporting a 32-bit value.
Also be sure you aren't submitting the score before the local player is authenticated.
Are you checking the error code? If the 'error' you get back from 'reportScoreWithCompletionHandler:^(NSError *error)' is not NULL then something is wrong with your code. Its value may not be helpful (when it isn't NULL) but at least you know that something didn't work.
In my experience, in sandbox mode, the leaderboards usually update fairly quickly (less than a minute) but not instantly. But some days something is wrong with the server and the update takes hours or doesn't work at all. I've read that the production GC server is more reliable and updates faster than the sandbox server.
For what it may be worth here's the code I've been using to report scores. It seems to work:
-(void) submitScore:(int64_t)score category:(NSString *)leaderboardIdentifier {
if (!!! [GKLocalPlayer localPlayer].authenticated ) {
CCLOG(@"GKLocalPlayer is not authenticated");
return;
}
GKScore *gkScore = [[[GKScore alloc] initWithCategory:leaderboardIdentifier] autorelease];
gkScore.value = score;
[gkScore reportScoreWithCompletionHandler:^(NSError *error) {
[self setLastError:error];
}];
}