您的位置:首页 > 移动开发

iOS开发-网页/app打开另一个app

2016-08-23 19:20 435 查看
最近产品经理新加了个需求,要求在手机浏览器浏览网页,购物支付的时候调用我们自己的app,在App内支付,此时我们公司扮演的角色就是微信或支付宝.在跟web开发的同事商量后决定采用自定义协议的方式解决问题,废话不多说,开始搞起.


一 理清思路

对移动端来说,不管从网页打开Myapp,还是从app打开Myapp,需要对方知道我们的URL Scheme,因此需要配置Myapp的URL Scheme,配置好告诉web开发的同事.web开发的同事可以监听web界面上用户点击支付按钮,然后通过URL Scheme打开Myapp.同时可以跟web开发的同事商定好URL Scheme的格式,例如:myAPP://myapp/param?payment_id=支付ID&money=金额&tid=订单ID&title=付款&mobile=手机号码,方便传参数.



二 打开app后的处理

网页或者app调起Myapp的时候会调用AppDelegate的代理方法:

(BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation


在这个方法里,可以拿到对应的url,对参数进行处理后跳到对应的界面进行处理.



- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if ([url.host isEqualToString:@"diandong"]){//自定义URL
NSLog(@"url == %@",url);
NSString *urlStr = url.absoluteString;
if (urlStr == nil || [urlStr isEqualToString:@""]) {
return YES;
}
NSRange range = [urlStr rangeOfString:@"mypay://diandong/param?"];
//1.参数处理
NSUInteger location = range.location;
if (location != NSNotFound) {
NSString *str = [urlStr substringFromIndex:location + range.length];
NSArray *array = [str componentsSeparatedByString:@"&"];
NSMutableDictionary * parmDic = [NSMutableDictionary dictionary];
for (NSString * string in array) {
NSArray *array = [string componentsSeparatedByString:@"="];
[parmDic setObject:array[1] forKey:array[0]];
}
// 2.发出通知
[WDDNotificationCenter  postNotificationName:@"MypayZhifu" object:nil userInfo:parmDic];
return YES;
}


对参数处理后跳转到对应界面时我想到了两个方案,方案一是使用通知,把参数传到对应的控制器,此方法在Myapp处于后台的时候完全有效,但是在Myapp在没有启动的时候就出现了问题,原因就在于[WDDNotificationCenter postNotificationName:@”MypayZhifu” object:nil userInfo:parmDic];发出通知的时候,对应的控制器还没有被创建,隐藏不能接收到通知.于是我采用了方案二:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if ([url.host isEqualToString:@"diandong"]){//自定义URL
NSLog(@"url == %@",url);
NSString *urlStr = url.absoluteString;
if (urlStr == nil || [urlStr isEqualToString:@""]) {
return YES;
}
NSRange range = [urlStr rangeOfString:@"mypay://diandong/param?"];
//1.参数处理
NSUInteger location = range.location;
if (location != NSNotFound) {
NSString *str = [urlStr substringFromIndex:location + range.length];
NSArray *array = [str componentsSeparatedByString:@"&"];
NSMutableDictionary * parmDic = [NSMutableDictionary dictionary];
for (NSString * string in array) {
NSArray *array = [string componentsSeparatedByString:@"="];
[parmDic setObject:array[1] forKey:array[0]];
}
//2.跳转到原生支付界面
[self gotoPayWith:parmDic];
return YES;
}


-(void)gotoPayWith:(NSMutableDictionary*)dic
{
UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
[rootNav popToRootViewControllerAnimated:NO];
if (dic.allKeys.count != 0) {
NSString *title =  [NSString stringWithString:[dic[@"title"] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[dic setObject:title forKey:@"title"];
NSString*string =dic[@"money"];
string = [string substringToIndex:string.length-1];
[dic setObject:string forKey:@"money"];
YiDingPayController * vc = [[YiDingPayController alloc]init];
vc.parmDic = dic;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[rootNav pushViewController:vc animated:YES];
});
}
}


三运行效果

在UC中打开我们的网站,用户点击立即支付,成功打开Myapp并且跳到对应的控制器



在safari中输入:mypay://同样可以打开Myapp并跳转





ok到此需求基本搞定,但是我突然想到怎样样让Myapp支付完成跳转回对应的浏览器,我们知道,当app打开MyApp后可以把app的URL Scheme传过来,经过我们解析处理后可以通过[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”app的URL Scheme”]]来回跳到app,但是网页中打开Myapp怎么才能跳回到对应的浏览器呢?跟web开发的同事商量后暂时也没有解决的思路,有想法的小伙伴可以加我qq:1291349760,相互学习共同成长.接下来我会分享在iOS开发中怎么修改cookies来保存用户的信息.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息