I made a function that extracts a user name from the device name.
The idea is to skip setup steps to allow the user to go straight to play upon starting the app the first time.
This is a sub-optimal approach, as I can never trust the device name to hold the name of the user. The question is: What is a better way to do this?
My function below gets the right name ...
It obviously does not get the name right if the user has changed the name of the device to something else than the default form.
- (NSString *) extractPlayerNameFromDeviceName: (NSString *) deviceName {
// get words in device name
NSArray *words = [deviceName componentsSeparatedByString:@" "];
NSMutableArray *substrings = [[NSMutableArray alloc] init];
for (NSString *word in words) {
NSArray *subwords = [word componentsSeparatedByString:@"'"];
[substrings addObjectsFromArray:subwords];
}
// find the name part of the device name
NSString *playerName = [NSString stringWithString: @""];
for (NSString *word in substrings) {
if ([word compare:@"iPhone"] != 0
&& [word compare:@"iPod"] != 0
&& [word compare:@"iPad"] != 0
&& [word length] > 2) {
playerName = word;
}
}
// remove genitive
unichar lastChar = [playerName characterAtIndex:[playerName length] - 1];
if (lastChar == 's') {
playerName = [playerName substringToIndex:[playerName length] - 1];
}
lastChar = [playerName characterAtIndex:[playerName length] - 1];
if (lastChar == '\'') {
playerName = [playerName substringToIndex:[playerName length] - 1];
}
return playerName;
}
I use it for suggesting a username in my app. This way, most users won't have to bother writing their usernames.
My app is not connected to any other service like iTunes or Facebook, but every user needs a user name. So how do I get the name?
I'd like to offer an improvement on Ricky Helegesson's answer. It has the following features;
Here is the code:
NSArray * nameFromDeviceName(NSString * deviceName)
{
NSError * error;
static NSString * expression = (@"^(?:iPhone|phone|iPad|iPod)\\s+(?:de\\s+)?|"
"(\\S+?)(?:['’]?s)?(?:\\s+(?:iPhone|phone|iPad|iPod))?$|"
"(\\S+?)(?:['’]?的)?(?:\\s*(?:iPhone|phone|iPad|iPod))?$|"
"(\\S+)\\s+");
static NSRange RangeNotFound = (NSRange){.location=NSNotFound, .length=0};
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:expression
options:(NSRegularExpressionCaseInsensitive)
error:&error];
NSMutableArray * name = [NSMutableArray new];
for (NSTextCheckingResult * result in [regex matchesInString:deviceName
options:0
range:NSMakeRange(0, deviceName.length)]) {
for (int i = 1; i < result.numberOfRanges; i++) {
if (! NSEqualRanges([result rangeAtIndex:i], RangeNotFound)) {
[name addObject:[deviceName substringWithRange:[result rangeAtIndex:i]].capitalizedString];
}
}
}
return name;
}
To use this for return a name;
NSString* name = [nameFromDeviceName(UIDevice.currentDevice.name) componentsJoinedByString:@" "];
This is somewhat complex, so I'll explain;
If a name ends in "s" without an apostrophe before "iPad" etc., I don't try to change it because there is not foolproof way of figuring out if the "s" is a part of the name or a pluralisation of the name.
Enjoy!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With