拼搏

拼搏

如何在HTML网页中调起APP,urlscheme代码大全

admin

本文目录一览

用urlscheme打开微信支付,回调怎么做

微信支付的回调
首先,支付回调API的方法,这个方法中完全是按照 文档写的,自己基本上不需要操作
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{

//如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
}[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
}];
}
if ([sourceApplication isEqualToString:@"com.tencent.xin"]) {
//微信支付回调
return [WXApi handleOpenURL:url delegate:self];
}

//跳转处理
BOOL result = [UMSocialSnsService handleOpenURL:url];
if (result == FALSE) {
//调用其他SDK,例如支付宝SDK等
}
return result;

}

最后微信会调用下面这个方法,我是在这个方法中做的操作,由于这个方法是在AppDelegate中,如果在这里跳转到自己指定的页面,有些困难,
于是就在这个方法中发通知到调起支付的页面,再进行页面跳转操作。
//回调方法
-(void) onResp:(BaseResp*)resp
{
NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
NSString *strTitle;

if([resp isKindOfClass:[SendMessageToWXResp class]])
{
strTitle = @"发送媒体消息结果";
}

if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
strTitle = [NSString stringWithFormat:@"支付结果"];

switch (resp.errCode) {
case WXSuccess:{
strMsg = @"恭喜您,支付成功!";

[MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"success"}];

break;
}
case WXErrCodeUserCancel:{
strMsg = @"已取消支付!";
[MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"cancle"}];
break;
}
default:{

strMsg = [NSString stringWithFormat:@"支付失败 !"];
[MYNotificationCenter postNotificationName:@"weixinPaystatusSuccess" object:nil userInfo:@{@"status":@"cancle"}];
break;
}
}

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

[alert show];
}

}

由于我们的取消和失败,2种状态的处理结果都是一样的,所以就用了相同的通知。
由于在调起支付页面,在调起前就已经注册了通知,现在支付完后,就可以收到支付状态的通知了。下面就很简单了吧
最后在说一下,
由于我们的付款性质不一样,所以就遇到了同样的支付成功状态,由于不同的支付类型要跳转的页面也是不同的,这就要求在AppDelegate中的那个处理方法中识别出,不同的支付类型,(如充值,购物等)但是这个方法是微信api回调的方法,它只返回成功,取消,失败等状态。那就只能是支付前做个识别标示,但是由于支付跳到api了,脱离了应用,这个识别标示又无法直接传过来。我想的方法就是保存一个支付标示:
[[NSUserDefaults standardUserDefaults] setObject:@"CHONGZHI" forKey:@"PAYTYPE"];
在每个类型的支付调起方法中,保存一下不同的key,然后再那个
-(void) onResp:(BaseResp*)resp

如何找出iOS App的URL Scheme

 方法一.Windows7系统下,用itools查找
  1.用itools查看iOS设备的应用程序,

  2.浏览(打开)‘微博’app

  3.打开Weibo.app文件夹,找到info.plist文件,

  4.打开info.plist文件,找到keyCFBundleURLSchemes/key一行,下面一行string…/string中间的都是‘微博’app的URL Scheme。

  方法二.在越狱iOS6系统下,用iFile查找
  1.打开iFile,通过路径/var/mobile/Applications下找到‘微博’文件夹(如果Applications目录下是乱码,请在偏好设置中设定显示应用名)。

  2.进入‘微博’文件夹中。

  3.打开Weibo.app文件夹

  4.找到并用文本形式打开Info.plist文件。

  5. 找到keyCFBundleURLSchemes/key一行,下面一行string…/string中间的都是‘微博’app的URL Scheme。

  转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦

Android 跨应用间调用: URL Scheme

如何在HTML网页中调起APP,urlscheme代码大全-第1张-游戏-拼搏

Android中的自定义的 URL Scheme 是一种页面内跳转协议,也可以被称为 URLRouter ,就是通过类似打开网页的方式去通过路由打开一个Activity,而非直接通过显式Intent方式去进行跳转。这样隐式intent的方法跳转好处如下:

上文已经说过, URL Scheme 是就通过类似打开网页的方式去通过路由打开一个Activity,其协议格式和我们打开网页输入的网址类似。

一个完整的完整的URL Scheme协议格式由scheme、host、port、path和query组成,其结构如下所示:

其中scheme既可以是Android中常见的协议,也可以是我们自定义的协议。Android中常见的协议包括content协议、http协议、file协议等,自定义协议可以使用自定义的字符串,当我们启动第三方的应用时候,多是使用自定义协议。

如下是一个自定义协议的URI:

通过上面的路径 Scheme、Host、port、path、query全部包含:

URL Scheme 的使用方法简要言之就是先在manifest中配置能接受Scheme方式启动的activity;当需要调用时,将Scheme协议的URi以Data的形式加入到Intent中,隐式调用该activity。

1). 在AndroidManifest.xml中对activity 标签增加intent-filter设置Scheme

上面的设置中可以看到,MainActivity包含多个intent-filter设置,第一个是正常的启动,也就是在应用列表中启动;第二个是通过 URL Scheme 方式启动,其本身也是隐式Intent调用的一种,不同在于添加了data属性,定义了其接受 URL Scheme 协议格式为 urlschemel://auth_activity

这里需要说明下, URL Scheme 协议格式中,组成URI的这些属性在data 标签中都是可选的 ,但存在如下的依赖关系:

当我们将intent对象中的Uri参数与intent-filter中的data标签指定的URI格式进行对比时,我们只对比intent-filter的data标签指定的部分,例如:

需要注意的是,intent-filter的data标签在指定path的值时,可以在里面使用通配符*,起到部分匹配的效果。

2). 使用URL启动Activity

当然可以在网页中调用

或者是在JS中调用

3.)如何判断URL Scheme是否有效

有时候需要把一些辅助性的、较为独立的APP在Home Launcher中隐藏起来,只允许一些特定的APP调用。这个时候,我们可以利用 URL Scheme 协议来做到这一点,设置AndroidManifest.xml中对activity 标签如下

因为Home Launcher列出的应用图标要求必须有Activity同时满足

上面的配置中有多余的category和data限制存在,所以并不匹配,不会在Home Launcher出现,但是可以使用 URL Scheme 来启动。

这样就可以将一组APP设置一个统一的入口,然后根据实际需要在调用不同子APP,即所谓的 APP业务组件化 , URL Scheme 在其中有着重要的作用,更进一步讨论会在以后的文章中呈现,敬请期待。

参考文献:
http://blog.csdn.net/iispring/article/details/48481793
http://blog.csdn.net/hb707934728/article/details/53196419
http://www.cnblogs.com/whoislcj/p/5825333.html

xcode 的url schemes在哪

  注册URLScheme
  1.在info.plist里添加URLtypes
  每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择AddRow,然后选择URLtypes。如图所示:

  2.添加URLSchemes
  添加完URLtypes,点击展开。右键选择AddRow,添加URLSchemes:

  3.设置URLSchemes
  设置URLSchemes为iOSDevTip

  4.设置URLIdentifier
  URLIdentifier是自定义的URLscheme的名字,一般采用反转域名的方法保证该名字的唯一性,比如com.iOSStrongDemo.www

  添加成功启动提示

iOS 唤起APP之URL Scheme

简单的说,由于苹果选择使用沙盒机制来保障用户的隐私和安全,APP只能访问自己沙盒数据,但同时也阻碍了应用间合理的信息共享。因此苹果提供了一个可以在APP之间跳转的方法: URL Scheme 。如果你的APP需要其他APP访问某些功能或者数据,那么你需要在你的APP定义一个相应的 URL Scheme 。当别的APP使用 URL Scheme 进行访问时,系统会根据 URL Scheme 进行匹配,从而来拉起对应的APP。

如果想要更清晰的认识 URL Scheme 电话,我们需要了解下面几个概念:

这样一对比就容易很明白的理解出了URL Scheme的真正含义,它是为了在iOS系统中定位对应的App然后执行对应的操作,复杂的URL Scheme还可以传递参数。

所以说了那么多,有一种跳转方式可以既满足跳转的动态需求,也可以灵活的传递参数。这种方式就是使用URL Scheme进行动态跳转。这也是我非常推荐的一种使用方式。并且在一些组件化开发的尝试中,这种跳转方式也带来了很多便利。

第三方应用可以通过①给自己发送 URL Scheme 请求来证明没有被劫持,如果没有收到自己的 URL Scheme,就可以及时给用户发送提醒;②利用 MobileCoreServices 服务中的 applicationsAvailableForHandlingURLScheme() 来查看所有注册了该 URL Schemes 的应用和处理顺序,从而检测自己、或者别人的 URL Scheme 是否被劫持。

注册自定义URL Scheme有两种方式

这两种注册方式本质上其实是一样的只是位置不同。

我们需要在APPdelegate中实现相应的代理方法:

iOS 9.0以下
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
iOS 9.0以上
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

下面我们通过Safari来验证:

在应用中调用URL Scheme需要是以下方法:

iOS10.0以下使用该方法:
- (BOOL)openURL:(NSURL*)url NS_DEPRECATED_IOS(2_0, 10_0, "Please use openURL:options:completionHandler: instead") NS_EXTENSION_UNAVAILABLE_IOS("");
iOS10.0以上使用该方法:
- (void)openURL:(NSURL*)url options:(NSDictionaryUIApplicationOpenExternalURLOptionsKey, id *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
还有一个方法可以判断对应URL Scheme是否存在一般和上述方法一起使用:
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);

下面来验证一下:

如何在HTML网页中调起APP

对于app打开而言最常规的打开就是通过url scheme的方式去打开你的app,如下的

myapp://
myapp://open
myapp://type=1id=2sdeo223lwe

这些抛出都是以url的方式进行抛出,app捕捉到这些抛出去做相应的处理,本文对app的处理不做详细描述,app开发请自行谷歌百度。对于前端而言抛出的方式也有很多,而最理想的方式是通过iframe的src对其进行链抛出,来!说的在多都没有代码来的清晰,请看下面。

//实际上就是新建一个iframe的生成器
var??createIframe=(function(){
??var?iframe;
????return?function(){
????????if(iframe){
????????????return?iframe;
????????}else{
????????????iframe?=?document.createElement('iframe');
????????????iframe.style.display?=?'none';
????????????document.body.appendChild(iframe);
????????????return?iframe;??????
????????}
????}
})()

之后我们还需要一个url scheme:

//生成一个url?scheme,假设我们约定的scheme是myApp://type=1id=iewo212j32这种形式的

var?baseScheme?=?"myApp://"
var?createScheme=function(options){
????var?urlScheme=baseScheme;
????for(var?item?in?options){
????????urlScheme=urlScheme+item?+?'='?+?encodeURIComponent(options[item])?+?"";
????}
????urlScheme?=?urlScheme.substring(0,?urlScheme.length?-?1);
????return?encodeURIComponent(urlScheme);
}

这种scheme形式的其实不是最好的,根据我们踩过的坑,觉得约定为与http协议相近可能更好一些,具体的协议需要前端人员自己去和app端人员约定。

ok万事具备,iframe有了,urlScheme也有了,该去打开app了

var?openApp=function(){
????var?localUrl=createScheme();
????var?openIframe=createIframe();
????if(isIos()){
????????//判断是否是ios,具体的判断函数自行百度
????????window.location.href?=?localUrl;
????????var?loadDateTime?=?Date.now();
????????setTimeout(function?()?{
????????????var?timeOutDateTime?=?Date.now();
????????????if?(timeOutDateTime?-?loadDateTime??1000)?{
????????????????window.location.href?=?"你的 页面";
????????????}
????????},?25);
????}else?if(isAndroid()){
????????//判断是否是android,具体的判断函数自行百度
????????if?(isChrome())?{
????????????//chrome浏览器用iframe打不开得直接去打开,算一个坑
????????????window.location.href?=?localUrl;
????????}?else?{
????????????//抛出你的scheme
????????????openIframe.src?=?localUrl;
????????}
????????setTimeout(function?()?{
????????????window.location.href?=?"你的 页面";
????????},?500);
????}else{
????????//主要是给winphone的用户准备的,实际都没测过,现在winphone不好找啊
????????openIframe.src?=?localUrl;
????????setTimeout(function?()?{
????????????window.location.href?=?"你的 页面";
????????},?500);
????}
}

以上就是你要打开scheme的主要代码了,好吧,实际上不只是打开app,还要实现未打开的时候跳到 页去。其中安卓实际上无论有没有打开都会跳到 页去,而ios........好吧!按照网上的说法是浏览器失焦后会挂起脚本,呵呵,这是多老的ios版本的表现了,实际上现在的ios已经没有这么做,有些版本会跟安卓的表现一样,而有些则是直接跳转根本不会去打开,还有打开的时候那个恶心的系统弹窗是什么鬼。好吧,实际上至此你会发现,ios9.0以上的有些打不开直接跳,有些打得开还会有允许弹窗,而微信则是无论如何都打不开,实际上微信会在他的浏览器里拦截掉所有未经其允许的scheme包括app store。


转自:《怎么在网页中打开你的app》@AlfredMou -- segmentfault

iOS开发 如何创建快捷方式

Safari有一个“添加至屏幕”的功能,其实就是在桌面上添加了一个网页书签,App可以使用这个功能来实现创建桌面快捷方式。

一、运用基本技术点
JavaScript
Data URI Schema
Socket基本知识
Base64编码
二、基本原理
程序内部创建一个简单的Web站点,通过这个站点调用Safari,站点将自定义的Html页面返回给Safari,此时利用Safari的“添加至主屏幕”功能,将自定义的Html制作成桌面书签,当用户点击桌面图标时,则运行自定义的Javascript来进行跳转至App。
三、什么是 data URI scheme?
假设你有以下的图像:
A .png
把它在网页上显示出来的标准方法是:

这 种取得资料的方法称为 http URI scheme ,同样的效果使用 data URI scheme 可以写成:

换句话说我们把图像档案的内容内置在 HTML 档案中,节省了一个 HTTP 请求。
网页优化的一大首要任务是减少HTTP 请求 (http request) 的次数,例如通过合并多个JS文件,合并CSS样式文件。除此之外,还有一个data URL 的密技,让我们直接把图像的内容崁入网页里面,这个密技的 名称是 data URI schema 。
Data URI scheme 的语法
我们来分析一下这句 img 标签的语法:
它包含以下部分:
data – 取得数据的协定名称
image/png – 数据类型名称
base64 – 数据的编码方法
iVBOR…. – 编码后的数据
: , ; – data URI scheme 指定的分隔符号
四、什么是 Base64 编码?
简单地说它把一些 8-bit 数据翻译成标准 ASCII 字符,网上有很多免费的 base64 编码和解码的工具。
五、Socket基本知识
自行脑补,这里我用了iOS中很棒的一个HttpServer第三方框架CocoaHttpServer。
六、实现
上面基本知识介绍完毕,下面开始撸代码。
iOS 的代码很简单,我们使用CocoaHttpServer创建一个本地的站点即可。
点击事件

- (IBAction)action:(id)sender
{
[DDLog addLogger:[DDTTYLogger sharedInstance]];
_httpServer = [[HTTPServer alloc] init];
[_httpServer setType:@"_http._tcp."];
NSString *webPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Web"];
DDLogInfo(@"Setting document root: %@", webPath);
[_httpServer setDocumentRoot:webPath];
[self startServer];
}

创建HttpServer
- (void)startServer
{
// Start the server (and check for problems)
NSError *error;
if([_httpServer start:error])
{
DDLogInfo(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
// open the url.
NSString *urlStrWithPort = [NSString stringWithFormat:@"http://localhost:%d",[_httpServer listeningPort]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStrWithPort]];
}
else
{
DDLogError(@"Error starting HTTP Server: %@", error);
}
}

ok。核心代码来了…

创建一个index.html文件,里面内容如下:

什么意思呢?

页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面跟的是时间(单位秒),把这句话加到指定网页的里一般也用在实时性很强的应用中,需要定期刷新。

这个文件放在文件夹WEB目录下,切记这个文件在工程中是实体文件夹,folder references。
接下来我们会再创建一个content.html的文件,但是这个文件不会放在WEB文件夹内,而是转换成data URI schema 放在上面的重定向到指定网页的位置。
以下是我demo的content.html文件的内容:

相信稍微做过前端开发的同学们都看懂是什么意思了,我这里大概讲一下。
上面这那几个meta标签其实就是为了设置样式,更多详情请看苹果 文档关于这部分的介绍。
下面这个link就是快捷方式的启动图标,这个是经过Base64编码的。
再下面的title就是快捷方式的名称。
接下来body标签中的超链接就是我demo的URL Schemes,通过URL Schemes来跳转进我们的App。下面的span标签用来占位,我们使用JS代码来控制它的显示内容。
这段JS代码的意思就是检测iOS WebApp是否运行在全屏模式。
iOS上的Safari浏览器可以让Web应用程序全屏显示,以取得类似本地应用的显示效果。但是这需要用户把Web应用程序的图标添加到主屏幕才可以。作为开发者,为了更好的显示效果,我们可能希望自己开发的Web应用程序在非全屏状态下运行时提示用户把Web应用程序的图标添加到主屏幕。要检测Web应用程序当前是否运行在全屏状态,只要检测window.navigator.standalone是否为true就可以了,如果这个属性为true则表示Web应用程序当前运行在全屏状态,否则运行在非全屏状态。检测到Web应用程序运行在非全屏状态时就可以提示用户把Web应用程序的图标添加到主屏幕。
最后再把content.html里的这段代码通过这个网站转换成data URI schema 放在index.html中,就完成了。

标签 如何在html网页中调起app

urlscheme代码大全