不得不说,友盟的客服以及论坛服务很不周到,特别是最近要获取友盟微信分享是否成功的状态,在分享回调里根本拿不到,回调根本不走。于是查看友盟论坛,提问的人很多,解答的完全没有,再咨询在线客服,回复答不到点子上,或者就要你看文档或demo,然而你的demo也有问题啊。
问题描述:本项目集成了友盟分享,微信支付等,要实现从APP跳转到微信,再从微信返回APP,需要在AppDelegate里实现-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options (iOS9之后的方法);同时,在分享的时候调用友盟的分享API,其中有completion回调,本来理应在这里检测到分享是否成功的,但是此completion却根本不走。咨询友盟客服,对方只提到要在前面说的AppDelegate代理方法里处理,到底怎么做,看文档。。。
系统回调友盟文档:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { //6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响 BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url options:options]; if (!result) { // 其他如支付等SDK的回调 } return result; }
demo里也是一样,因为他们只想到怎么实现友盟的功能,关键我这里还集成了微信支付,两者都会走以上代理,所以要做到区分!
友盟分享调起的API:
//调用分享接口 [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) { if (error) { UMSocialLogInfo(@"************Share fail with error %@*********",error); }else{ if ([data isKindOfClass:[UMSocialShareResponse class]]) { UMSocialShareResponse *resp = data; //分享结果消息 UMSocialLogInfo(@"response message is %@",resp.message); //第三方原始返回的数据 UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); }else{ UMSocialLogInfo(@"response data is %@",data); } } }];
问题关键:同时集成了友盟分享和微信支付,都走同一个代理方法,需要做到区分,否则分享回调不走!
解决方法:
扫描二维码关注公众号,回复:
556151 查看本文章
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { // DLog(@"url = %@ \n options = %@",url,options); if ([url.host isEqualToString:@"safepay"]) { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; return YES; }else if ([options[UIApplicationOpenURLOptionsSourceApplicationKey] isEqualToString:@"com.tencent.xin"] && [url.absoluteString containsString:@"pay"]) { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; }else{ return [[UMSocialManager defaultManager] handleOpenURL:url]; } }关键就在于第二个if判断中的 [url.absoluteString containsString:@"pay"],之前没写这句,所有不管是微信支付还是微信分享,都会走到第二个return,导致分享的return(第三个)没有走到。这里出错就导致分享时的回调也没有走。
虽然不管是微信支付还是微信分享,返回APP时都会带有com.tencent.xin字段,但是url是不同的,区分就在这里。