所有需要合作的东西都需要一个统一的合理的协议,比如说http,代码规范,resful规范,都是一套大家公认的比较容易接受的协议,客户端之间通讯,app内部通讯也需要一套协议,以利于大家能够最快的理解,增加代码的一致性和规范性,检查bug的可能性。
一:协议定义
iOS系统中,app与app交互协议通常是 aaa://xxxxxx
比如说你的app打开微信app,需要使用
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"wechat://"]];
模仿一个协议,我们也可以新增两个参数
meituan://user?userName=张三&phoneNumber=178xxxxxxxx
meituan:// : 协议头,如果你的app希望被第三方app打开,需要制定自己的协议头,在info ->URL Types 中新增一个meituan,一个app可以自定义多个schemes
user :页面名称
?:类似于http中接名称后面要跟参数了
& :参数连接符
参数1:userName:姓名
参数2: phoneNumber:电话号码
二:从协议中获取参数
建立一个URLParser的类
@interface URLParser ()
@property (strong, nonatomic) NSArray *variables;
@end
- (instancetype)initWithURLString:(NSString *)string {
self = [super init];
if (self) {
NSString *urlString = string;
NSScanner *scanner = [NSScanner scannerWithString:urlString];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
NSString *tempString;
NSMutableArray *vars = [[NSMutableArray alloc] init];
// Ignore the beginning of the string and skip to the variables.
[scanner scanUpToString:@"?" intoString:nil];
while ([scanner scanUpToString:@"&" intoString:&tempString]) {
[vars addObject:tempString];
}
_variables = vars;
}
return self;
}
- (NSString *)valueForVariable:(NSString *)varName {
for (NSString *var in _variables) {
if ([var length] > [varName length] + 1 && [[var substringWithRange:NSMakeRange(0, [varName length] + 1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
NSString *varValue = [var substringFromIndex:[varName length] + 1];
return varValue;
}
}
return nil;
}
使用方法:
URLParser *urlParser = [[URLParser alloc] initWithURLString:url];
NSString *userName = [urlParser valueForVariable:@"userName"];
NSString *phoneNumber = [urlParser valueForVariable:@"phoneNumber"];
使用上面的方法传入一个url,就可以解析出userName,phoneNumber。
接着就可以根据写逻辑代码了