iOS 通过url Scheme 打开App并传参
闲话就不多说了直接上代码了,以微信分享为例,参数包含title、content、url,以及type(判断是好友还是朋友圈)
打开App:
NSDictionary *dic = @{};
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"share://param?type=0&title=6ZKx6KKL5a2Q&content=6YKA6K+356CB5pivMzMz&url=http://www.baidu.com"] options:dic completionHandler:nil];
参数拼接在问号后面,其实和GET请求拼接参数的方式是一样的
注意:参数不能包含中文,如果想使用中文,可将中文进行base64编码后再进行拼接,使用的时候做一个解码即可
接收代码:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSString *urlStr = [url absoluteString];
if ([urlStr hasPrefix:@"share://"]) {
//把?号前面的数据替换为空,是方便后续字符串以&符号来分割
NSString *parameter = [urlStr stringByReplacingOccurrencesOfString:@"share://param?" withString:@""];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:parameter, @"parameter", nil];
//此处是外部请求后需要处理的事件,将参数传递下去即可
[HQTool share:dic];
}
return YES;
}
参数解析:
+ (void)share:(NSDictionary *)dic {
NSString *parameter = dic[@"parameter"];
//根据&符号将字符串分割成数组
NSArray *arr = [parameter componentsSeparatedByString:@"&"];
NSString *type = @"";
NSString *title = @"";
NSString *content = @"";
NSString *url = @"";
for (NSString *item in arr) {
NSArray *keyArr = [item componentsSeparatedByString:@"="];
for (NSString *key in keyArr) {
if ([key isEqualToString:@"type"]) {
type = keyArr[1];
}
if ([key isEqualToString:@"title"]) {
//base64解码
NSData *data = [[NSData alloc] initWithBase64EncodedString:keyArr[1] options:0];
title = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
if ([key isEqualToString:@"content"]) {
NSData *data = [[NSData alloc] initWithBase64EncodedString:keyArr[1] options:0];
content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
if ([key isEqualToString:@"url"]) {
url = keyArr[1];
}
}
}
}
参数拿到后,便可以实现后面的功能了。
提醒:如果打开App后需要进行跳转页面或者跳转微信,感觉很慢的话,可以将代码放到主线程中去执行,这样就会瞬间执行
补充:base64编码
//base64编码
- (NSString *)encodeString:(NSString *)string {
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSString *encodedStr = [data base64EncodedStringWithOptions:0];
return encodedStr;
}