今天我们的应用里加入了网页拉起app的功能,具体的用处是,在wap中的详情界面查看视频,如果需要到手机 app中观看的话就点击一个按钮打开app,并将界面定在该视频的详情页里。
下面我来说下怎么用WAP拉起app,首先我们需要做的就是定一个协议,在app中的URL Schemes中添加一个标记:
如上图所示,identifier随便填,当然,最好填标志性的东西,比如bundleid之类的,URL Schemes就是一个关键的标志了,需要用到它来拉起app,现在就按“xxxxx”为例,设置好这些应用内的设置就完毕了,接着就需要wap来操作了,不过我们本地也是可以来测试的,在模拟器运行完成后,打开Safari浏览器,在搜索框中键入“xxxxx://”之后回车就可以拉起应用,那么拉起后怎么来进行传值呢?比如说我跳转到视频详情页,肯定要传视频的ID,这么来传“xxxxx://要传的信息”,把要传的信息放在后面就可以了,传好之后就是接收了,在Appdelegate中写一个方法:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return YES; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return YES; }
在以上两个方法中来获取到拉起app后传入的url,但是博主在使用的时候,发现
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
这个方法收不到传入的参数,经测试,
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
可以收到消息,这里先说使用,具体为什么上面那个方法收不到传递的信息大家私下可以查一下,那么在这里来对参数进行处理:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSString *urlStr=[url absoluteString]; return YES; }
拿到了传入的参数,你以为这样就完了么?不,并没有,这里在使用中会发生问题,我们拿到了之后,就比如说博主,怎么来跳转到详情页呢?视频的ID博主拿到了,怎么来用呢?博主这里是这么写的,先把url存入本地,然后在进入首页刷新出界面后查找url是否为空,当不为空时把视频ID传入跳转的详情页,获取到拉起app前视频的信息并播放,你以为这就完了么?依然没有,这是在app没有打开的情况下主页会刷新,然而当app在后外的时候,拉起app主页已经存在,下载数据没有进行,所以不会触发跳转详情这一步(为了杜绝像博主这样把是否传入信息这个判断依据写在下载首页信息结束后刷新界面的地方,所以说明下),这时博主不得不该用通知的方式来执行,你以为这就是结束么?并没有,加入通知后,会发现,在app完全退出的情况,通知的时候首页还没出现,通知未注册,所以还是不能触发这个操作,也许你已经发现了,既执行通知又在首页下载结束后那里进行判断来执行操作,这样,当app不在后台时就在首页数据加载完毕后根据传入url是否存在来执行操作,当app在后台时就通过通知来执行,完美:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSString *urlStr=[url absoluteString]; [[NSUserDefaults standardUserDefaults]setValue:urlStr forKey:@"webToApp"]; [[NSUserDefaults standardUserDefaults]synchronize]; [[NSNotificationCenter defaultCenter]postNotificationName:@"webToApp" object:nil]; return YES; }
一定要记得在首页数据加载完毕后判断来执行操作哦,整个步骤就是这样。
最近使用过一次,发生了异常,原因是捕获外部URL的方法变成了下面这个:
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
注意下替换哦。