2016-09-06 10:23:55 TianYou_Code 阅读数 12930
  • 苹果iOS应用UI控件开发

    本视频是传智播客iOS学院精心录制的免费精华版UI基础视频,该视频特点在于较大程度保证了知识点的完整性,视频的起点都是针对有一定OC基础的同学

    13939 人正在学习 去看看 传智

平常我们做iOS开发,会经常遇到打开其他的APP的功能。本篇文章讲的就是打开别人的APP的一些知识。我们的目标是:

  • 打开别人的APP
  • 让别人打开我们的APP
  • iOS9的适配问题
  • 使用URL Schemes传递数据


然后两句代码直接搞定:
<pre name="code" class="objc">    //创建一个url,这个url就是WXApp的url,记得加上://
    NSURL * url = [NSURL URLWithString:@"weixin://"];
    BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:url];
    //先判断是否能打开该url
    if (canOpen)
    {   //打开微信
        [[UIApplication sharedApplication] openURL:url];
    }else {
        <span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">您的设备未安装微信APP</span>
    }





2017-09-07 15:44:33 u010105969 阅读数 3416
  • 苹果iOS应用UI控件开发

    本视频是传智播客iOS学院精心录制的免费精华版UI基础视频,该视频特点在于较大程度保证了知识点的完整性,视频的起点都是针对有一定OC基础的同学

    13939 人正在学习 去看看 传智

今天又做了微信支付,对于客户端来说,微信支付和支付宝支付相比较还是没有多大差别的,只不过微信支付上传的参数多了些。(但听后台说微信支付较复杂)。

先说下微信支付的流程(个人的理解):(先附上官方文档吧:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

1.首先我们需要在微信开放平台中进行注册成为其开发者,然后在微信开发平台创建自己的应用,再给应用开通支付功能(这些都很常规了)。

2.我们需要往我们自己的项目中导入微信支付所需的几个框架(可以直接使用官方demo中指定框架,也可以通过cocoapods进行集成)。


3.在项目中做相应的配置,在URL Types中添加URL Schemes,填写的内容是我们从微信开发平台上创建的应用获取的。填写URL Schemes是为了支付成功后能从微信成功跳转回我们自己的App。


4.在项目中写代码:

先在AppDelegate中向微信注册我们的App:(首先需要导入微信头文件“WXApi.h”)

// 向微信注册

    [WXApi registerApp:@"wx2355549c49f5cf73"];

      在AppDelegate中对微信返回我们App进行处理:

// 仅支持iOS9以上系统

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options

{

    //6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK)的调用[如果用6.2api调用会没有回调],对国内平台没有影响

    BOOL result = [[UMSocialManager defaultManager handleOpenURL:url options:options];

    if (!result) {

        // 其他如支付等SDK的回调

        if ([url.host isEqualToString:@"safepay"]) {

            //跳转支付宝钱包进行支付,处理支付结果

            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {

                NSLog(@"result = %@",resultDic);

            }];

        }

        if ([url.scheme isEqualToString:@"wx2355549c49f5cf73"])

        {

            return  [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];

        }

    }

    return result;

}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

    BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url];

    if (!result) {

        // 其他如支付等SDK的回调

        if ([url.host isEqualToString:@"safepay"]) {

            //跳转支付宝钱包进行支付,处理支付结果

            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {

                NSLog(@"result = %@",resultDic);

            }];

        }

        if ([url.scheme isEqualToString:@"wx2355549c49f5cf73"])

        {

            return  [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];

        }

    }

    return result;

}


- (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) {

            NSLog(@"result = %@",resultDic);

        }];

    }

    if ([url.scheme isEqualToString:@"wx2355549c49f5cf73"])

    {

        return  [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];

    }

    

    return YES;

}

代码看着多实际都一样,也都是复制粘贴的,我的代码中还有支付宝回调的代码。

遵守微信协议(WXApiDelegate),在代理方法中处理支付回调的结果

//微信回调,有支付结果的时候会回调这个方法

- (void)onResp:(BaseResp *)resp

{

       //    支付结果回调

    if([resp isKindOfClass:[PayResp class]]){

        switch (resp.errCode) {

            case WXSuccess:{

                //支付返回结果,实际支付结果需要去自己的服务器端查询

                NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION" object:@"success"];

                [[NSNotificationCenter defaultCenter] postNotification:notification];

                

                break;

            }

            default:{

                NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION"object:@"fail"];

                [[NSNotificationCenter defaultCenter] postNotification:notification];

                break;

            }

        }

    }

}

支付结果以通知的方式发送出去。

接下来就是支付代码了,我们需要将商品的订单信息发送给后台然后让后台返回我们在跳转到微信支付页面所需要的参数(参数好几个)
在微信支付的控制器中同样需要导入微信头文件"WXApi.h"。我们在我们的App点击微信支付的时候首先需要判断用户是否安装了微信,如果安装了直接跳转,如果没有安装则需要给用户一个提示,代码:

 // 判断手机有没有微信

    if ([WXApi isWXAppInstalled]) {

        

        NSLog(@"已经安装了微信...");

    }else{

        NSLog(@"没有安装微信...");

        

    }

跳转到微信支付页面的代码:(那些参数如:appid、partnerid...都是我们从我们的后台那里获取的)

 [weakSelf WXPayWithAppid:appid partnerid:partnerid prepayid:prepayid package:package noncestr:noncestr timestamp:timestamp sign:sign];


#pragma mark 微信支付方法


- (void)WXPayWithAppid:(NSString *)appid partnerid:(NSString *)partnerid prepayid:(NSString *)prepayid package:(NSString *)package noncestr:(NSString *)noncestr timestamp:(NSString *)timestamp sign:(NSString *)sign{

    

    //需要创建这个支付对象

    PayReq *req   = [[PayReq alloc] init];

    //由用户微信号和AppID组成的唯一标识,用于校验微信用户

    req.openID = appid;

    // 商家id,在注册的时候给的

    req.partnerId = partnerid;

    // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你

    req.prepayId  = prepayid;

    // 根据财付通文档填写的数据和签名

    req.package  = package;

    // 随机编码,为了防止重复的,在后台生成

    req.nonceStr  = noncestr;

    // 这个是时间戳,也是在后台生成的,为了验证支付的

    NSString * stamp = timestamp;

    req.timeStamp = stamp.intValue;

    // 这个签名也是后台做的

    req.sign = sign;

    if ([WXApi sendReq:req]) { //发送请求到微信,等待微信返回onResp

        NSLog(@"吊起微信成功...");

    }else{

        NSLog(@"吊起微信失败...");

    }

}


我们在AppDelegate中将微信支付返回的支付结果(是否成功)以通知的方式进行了发送,我们在支付的控制器中要对该消息进行监听:

// 监听一个通知

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"ORDER_PAY_NOTIFICATION" object:nil];


对监听到的消息进行处理:

#pragma mark - 收到支付成功的消息后作相应的处理

- (void)getOrderPayResult:(NSNotification *)notification

{

    if ([notification.object isEqualToString:@"success"]) {

        NSLog(@"支付成功");

        [SVProgressHUD showSuccessWithStatus:@"支付成功"];

    } else {

        NSLog(@"支付失败");

        [SVProgressHUD showErrorWithStatus:@"支付失败"];

    }

    

}


到这里微信支付也就结束了,我们可以到微信商户中去确认下我们到底有没有支付成功。
本篇博客可这内容挺多,主要我粘贴的代码挺多,只要理清了微信支付的流程就会感觉本篇博客内容并不是很多。
希望帮助到那些需要帮助的朋友们!






2017-06-30 16:25:25 SHJSir 阅读数 21691
  • 苹果iOS应用UI控件开发

    本视频是传智播客iOS学院精心录制的免费精华版UI基础视频,该视频特点在于较大程度保证了知识点的完整性,视频的起点都是针对有一定OC基础的同学

    13939 人正在学习 去看看 传智

iOS应用可以使用 URL Schemes 进行应用间的跳转或实现网页打开应用的功能,这种跳转是协议跳转。

要应用间能跳转就要遵循URL Schemes协议。

要网页跳转应用网页就要遵循URL Schemes协议。

所以这就出现了微信或QQ等知名应用不能打开第三方应用的问题,不能打开是因为微信和QQ使用的是自己研发的QQ浏览器,他不遵循URL Schemes这个协议。

实例演示:(下载 卡惠应用 查看效果):注: kahui.huankaun.com 就是你服务器的域名

1,问题具备的场景

(1)第三方应用集成了友盟分享到QQ和微信的功能

(2)第三方应用分享了一个web页面到微信或QQ

(3)打开分享的web页面,点击上面的某一个按钮

(4)如果用户安装了该应用,直接打开应用根据web地址中的参数跳转到对应的页面

(5)如果用户没有安装应用,直接跳转到appStore

2,实用的技术:iOS9 之后提供的 Universal Links 功能

3,实现步骤

(1)创建一个json文件,名称必须为 apple-app-site-association,⚠️该文件不可带 .json 的后缀名

         apple-app-site-association 文件必须放在https服务器的根目录下,例:https://kahui.huankaun.com 这个路径下 ⚠️一定是根目录,也就是说该文件必须是一级目录,供下载使用

         apple-app-site-association 文件格式:如代码 1

         teamID:打开苹果官网,点击Account,点击左边栏的 Membership,查找teamID 如图 1

         paths:定义的web页面的地址,*表示 kahui.huankaun.com 这个路径下的任何子路径,也可以指定固定跳转的页面例:/index.php

(2)确保使用 https://kahui.huankaun.com/apple-app-site-association 这个链接可以在 苹果的验证网站 访问得到,正确的访问结果为 如图2


(3)进入开发者网站,找到你自己的bundleId,可以点击edit按钮,开启associate domains,并创建相应的provisioning Profiles,如图 3


(4)在项目的Capablities中开启Associated domains,添加 applinks:kahui.huankaun.com如图 4

(5)在appdelegate中实现上面这个方法,当使用Universal Links唤醒app时就执行这个方法如代码 2


(6)快捷验证,在备忘录中输入https://kahui.huankaun.com/...常按这个链接,出现使用第三方应用打开表示已经成功,如图 5


(7)当没有安装该应用时的处理方式是:上传该html文件到 kahui.huankaun.com 路径下,如代码 3

       













代码1
{
  "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "teamID.bundleId",
                "paths": ["*"]
            }
        ]
    }
}



代码2
- (BOOL)application:(nonnull UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * __nullable))restorationHandler{}

代码3
<!DOCTYPE html>
<html lang="en" >
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title>上新-跳转中...</title>

</head>
<body>
<script type="text/javascript">
        setTimeout(function(){
            window.location = "第三方在应用宝的下载链接"
        },3000)

</script>

</body>
</html>


  

2017-05-08 20:28:58 linshijun33 阅读数 16854
  • 苹果iOS应用UI控件开发

    本视频是传智播客iOS学院精心录制的免费精华版UI基础视频,该视频特点在于较大程度保证了知识点的完整性,视频的起点都是针对有一定OC基础的同学

    13939 人正在学习 去看看 传智

title: iOS/Android 微信及浏览器中唤起本地APP
date: 2017-05-10 10:19:20
tags:

需求概述

分享应用活动链接已经成为手机应用一个非常重要的推广传播形式。为了提高转化率,就需要让用户不管是在微信或者是浏览器中,都能在点击链接后, 唤起本地的 app 后 , 跳转到指定页面 。

虽然这个功能从用户体验方面来说是自然而然的,但是由于 iOS/Android 平台差异性,在实现过程中还是有些问题。

  1. 未安装 app 时,如何做好引导页,引导用户下载后打开 app 后,是否可以打开之前唤醒前指定的页面或内容

  2. 如何绕过微信的  scheme  屏蔽,在微信中唤醒 app 中,并打开指定页面

  3. iOS 专用的  universal link ,Android 专用的  App Links  的集成要求,有哪些局限性。

现实情况

在实施过程中,还是有两个地方是没办法忽略的:

scheme 被微信屏蔽了

除非一些和微信有合作的 app 可以进入到白名单,其他的应用在微信内都没办法通过自定义 scheme 协议直接唤起 app,前端页面需要对唤起场景进行判断。

浏览器无法明确地判断本地是否已经安装 app

目前的取巧方案就是通过  setTimeOut  设置超时时间,在超时时间内唤起 app,然后获得成功失败回调,如果获得的是失败的回调,则说明本地没有安装 app,需要跳转到商店下载页面。

实现方案

踩坑方案

鉴于在打开 url scheme 的方法中,iOS9 和 iOS8/iOS7 区别很大,Android 不同厂商的是适配也不同,这里介绍的踩坑方案都是前人实践总结出来的。

两种打开方式:

一、 直接跳转:点击链接或者修改  window.location 。
点击链接:

<a href="schemeUrl">唤醒你的APP</a>

修改 window.location:

window.location.href = schemeUrl;

这种情况,如果APP唤醒失败,或者APP未安装的话,很多时候都会跳到错误页,这很影响用户体验,而我们的要求可能是跳转到其他页面或者下载APP。

二、 iframe  跳转:在 body 上添加 iframe,设置 src 属性为跳转的 URL scheme

<a href="APP下载地址">下载或打开APP</a>
<script>
  $('a').click(function() {
      var ifr = document.createElement('iframe');
          ifr.src = '自定义 URL scheme';
          ifr.style.display = 'none';

      document.body.appendChild(ifr);
      setTimeout(function(){
          document.body.removeChild(ifr);
      }, 3000);
  });
</script>

这一种方法不会引起页面内容可见的变化,不会导致浏览器历史记录的变化,
实现过程是:点击 a 标签时,打开 自定义 scheme。若成功,就唤起 app,若失败,就到 href 属性,去到下载地址。

相应的,在 Android 客户端这边,需要在 manifest 文件里面配置 intent-filter,如下:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="自定义 URL scheme" />
</intent-filter>

注意这里的  intent-filter  的这几个配置不能再和 action.MAIN 放在一起。如果是在同一个 activity 中配置,那么可以配置两个 intent-filter ,比如

<!-- 第一个filter -->
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<!-- 第二个filter -->
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="mls" />
</intent-filter>

理论上,在 Android 上这两种方式应该都是可以顺利实现的。但是 Android 的 chrome 内核从 chrome 25 以后就弃用了 iframe,不再支持通过 js 触发(非人为点击)或者通过设置  iframe src  地址来触发 scheme 跳转。所以,后一种方法在适配上存在比较多的问题。故一般选择前面一种做法,即 href 的点击或者 window.location 跳转。

使用第一种方案,setTimeOut 派上用场。

$('a').click(function() {
    location.href = '自定义 URL scheme';
    t = Date.now();

    setTimeout(function(){
        if (Date.now() - t < 1200) {
            location.href = 'Android 下载地址';
        }
    }, 1000);

    return false;
 	}
}

理想过程是这样:浏览器尝试打开 URL scheme,在 1 秒计时后,检查当前时间,如果实际时间已过 1200 毫秒,说明唤起 app 成功(唤起 app 会让浏览器的定时器变慢);如果没超过 1200 毫秒,很可能是没有安装应用,就跳到下载地址。

但是这么做也是有问题的,因为 Android 系统是多任务系统,setTimeOut基本就没那么精准,不能起到理想效果。换一种方式, setInterval ,如果设置比较小的运行间隔(<30ms),在浏览器或者 webview 中,应用切换到后台,setInterval 会被很明显的延迟执行,比如设置一个运行间隔 20ms,总计运行 100 次的定时器,如果页面一直处于前台,则 100 次跑完,总耗时与 100x20=2000ms 不会有太大差异,但页面在后台运行时,此时间会明显超过 2000ms。可以利用这一点来实现是否成功打开 app 检测及回调。

function openApp(openUrl, appUrl, action, callback) {
    // 检查 app 是否打开
    function checkOpen(cb){
        var _clickTime = +(new Date());
        function check(elsTime) {
            if ( elsTime > 3000 || document.hidden || document.webkitHidden) {
                cb(1);
            } else {
                cb(0);
            }
        }
        // 启动间隔 20ms 运行的定时器,并检测累计消耗时间是否超过 3000ms,超过则结束
        var _count = 0, intHandle;
        intHandle = setInterval(function(){
            _count++;        
            var elsTime = +(new Date()) - _clickTime;
            if (_count>=100 || elsTime > 3000 ) {
                clearInterval(intHandle);
                check(elsTime);
            }
        }, 20);
    }
    
    // 在 iframe 中打开 app
    var ifr = document.createElement('iframe');
    ifr.src = openUrl;
    ifr.style.display = 'none';
    if (callback) {
        checkOpen(function(opened){
            callback && callback(opened);
        });
    }
    
    document.body.appendChild(ifr);      
    setTimeout(function() {
        document.body.removeChild(ifr);
    }, 2000);  
}

iOS9 上 iframe 也不可用

在 iOS 9 上,iframe 方案变得不可用。在打开自定义 URL scheme 时,会弹出对话框,询问是否用 xx 应用来打开。往往用户还没来得及点击打开,定时器又触发了,导致跳到 App Store。
可以在尝试打开URL scheme 后,再加一个页面跳转,这样对话框会被覆盖,再刷新页面,就能无需确认唤起 app:

$('a').click(function() {
    location.href = '自定义 URL scheme';
    location.href = '下载页';
    location.reload();
}

APP已安装这是没问题的,但如果APP未安装,跳 App Store 的请求会失败。 这时可以使用两个定时器:

$('a').click(function() {
    location.href = '自定义 URL scheme';
    setTimeout(function() {
        location.href = '下载页';
    }, 250);

    setTimeout(function() {
        location.reload();
    }, 1000);
}

universal link 和 App Links

这里的链接指的是深度链接 (deep learning) ,这是一种能够方便地通过传统的 http 链接来启动 app 或网站。通过唯一的网址,就可以链接一个特定的视图到你的 app 里面不需要特别的 scheme。

iOS 的 universal link

使用要求:
这里写图片描述
使用步骤:

  1. 添加域名到  Capabilities
    首先, 你必须在 Xcode 的 capabilities 里 添加你的 APP 域名, 必须用 applinks: 前置它:还添加一些你可能拥有的子域和扩展(www.domain.com, news.domain.com 等等)。这将使你的 APP 从你的域名请求一个特殊的 JSON 文件 apple-app-site-association。当你第一次启动 APP,它会从 https://domain.com/apple-app-site-association 下载这个文件。
    这里写图片描述

  2. 构建  apple-app-site-association  文件
    该文件必须存在且为了安全原因可使用 SSL 通过 GET 请求访问到。你可以打开一个文本编辑器然后写一个这样的简单 JSON 格式:
    这里写图片描述
    根据 paths 键设定一个允许的路径列表(你希望APP 作出反应的路径), 设置 * 号则只是打开 app 而已。
    TEBEJCSf9DF 这一串是具有团队标示的 bundle id。
    文件构建成功后,上传这个文件到你的域名根目录。

  3. 在 app 里处理通用链接
    为了在 app 里支持通用链接, 需要在 AppDelegate 里实现  [application(_:continueUserActivity:restorationHandler:)]  。 尽管这种方法可以用于许多不同的目的(比如 [Handoff]和 [搜索 API]), 我们将只关注如何处理接收到的通用链接。
    为了确保 app 可以翻译 URL 成实际的内容, 需要做下面几步:

  • 使用 [NSURLComponents]简单解析 webpageURL 到 host(如domain。com), 路径组成同理(如 ["/"]、“path”、“to"以及"thezoo”)。

  • 确保能识别 host。

  • 尝试将 pathComponents 匹配到 APP 的已知内容里。

  • 验证该内容实际上可以被呈现并呈现内容给用户。

Android 的 App Links

Android 手机上,打开链接通常会跳出选择框选择用什么浏览器打开,而使用 app links,当点击了链接,安卓系统会检查是否有一个 app 可以处理 url(比如 twitter.com),然后跟核对哪个app(s)可以处理该域名的链接,直接在应用内处理,这样我们就能避免弹框影响用户。

和 iOS 一样,Android 的深度链接也需要相关的域名来配合,有以下的条件:
这里写图片描述

想要让你的 app 处理链接,需要在 manifest 文件中使用 intent filter 声明 app 需要处理的 uri 模式。下面的例子,声明了一个  intent filter  能够处理 http://www.android.comhttps://www.android.com

<activity …>
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="www.android.com" />
    </intent-filter>
</activity>

配置  autoVerify 来触发系统自动校验。

如何验证成功?这就需要网站所有者必须声明和app的联系。网站所有者通过持有一个名为  assetlinks.json  的 Digital Asset Links JSON 文件来声明与一个 app 的联系,它在 domain 的well-known 位置:https://domain[:optional_port]/.well-known/assetlinks.json。
注意:系统通过加密的 HTTPS 协议来验证 json 文件,所以不管 intent filter 中是否声明了 https,请确保 json 文件能够通过 HTTPS 连接来获取。
Digital Asset Links JSON 文件声明了与此网站关联的 app,下面的示例 assetlinks.json 文件允许包名为 com.example 的app打开链接:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

sha256 可以通过 keytool 来获取。

预想可操作方案

  1. 链接页面里面有两个按钮:直接打开和下载。直接打开的话,判断本地是否存在 app 后直接启动 app,下载的话去到下载页面。前端需要设计两个页面(分享的页面,下载的页面)。

  2. 使用<a>标签的方式,来启动客户端。

  3. 区分渠道,判断浏览器内核区分是 Android 还是 iOS,在 Android 6.0 以上,可使用 app links,在 iOS9.0 以上,可使用 universal link.但是这两个都需要提供应用网站域名来绑定。其他系统版本通过自定义 scheme 来截取。

  4. 补充下 Android 的调用流程:
    这里写图片描述
    由于好多初始化工作都在 SplashActivity 里面做了,所以开启的流程也是从上到下一步一步开页面,数据也需要传递过去。遇到需要登录的时候,先跳登录页,再跳详情页,把登录页从栈中清掉,返回时,就能从详情页 DetailActivity 回到 MainActivity 了。

关注全栈公众号,遇见更好的自己。
在这里插入图片描述

2018-08-30 18:27:56 xiaomajia029 阅读数 15375
  • 苹果iOS应用UI控件开发

    本视频是传智播客iOS学院精心录制的免费精华版UI基础视频,该视频特点在于较大程度保证了知识点的完整性,视频的起点都是针对有一定OC基础的同学

    13939 人正在学习 去看看 传智

Question:最近做一个在微信和支付宝内置浏览器中运行的移动web界面,前几个月ios微信更新之后,微信将后退的按钮移至了底部横栏,遮挡住了原先底部的操作按钮。由于之前的页面设计是整屏显示禁止触摸滚动效果的,就想着是不是可以隐藏微信内置的底部横栏。

Answer:

1. 经过查资料,很多人说可以调用Weixin为H5应用提供开放原生能力的JS接口来隐藏/显示底部的状态栏。代码如下:

document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
    WeixinJSBridge.call('hideToolbar');        // 隐藏底部状态栏
    WeixinJSBridge.call('hideOptionMenu');     // 隐藏右上角的三个点的选项
    WeixinJSBridge.call('showToolbar');        // 显示底部状态栏
    WeixinJSBridge.call('showOptionMenu');     // 显示右上角的三个点的选项
});

但是实际使用过程中,发现无效,使用微信开发者工具调试,发现报错:“error:WeixinJSBridge.call方法无效”,在微信公众平台的企业微信中发现,该方法适用于企业微信,而在订阅号或者服务号的开发文档中暂未发现这个方法。

// 接口调用代码(JavaScript) --- from 微信公众平台-企业微信开发文档
function onBridgeReady(){
   WeixinJSBridge.call('hideToolbar');
}

if (typeof WeixinJSBridge == "undefined"){
    if( document.addEventListener ){
        document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    }else if (document.attachEvent){
        document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
        document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
}else{
    onBridgeReady();
}
// 返回说明
// 隐藏底部导航栏没有返回值。(需要显示顶部导航栏,请把hideToolbar换成showToolbar) 

2. 暂且将页面调整为可以滚动的状态==!!!目前没有看到合适的方法撒,于是,还是来个滚动条吧

ios调用微信支付

阅读数 67

没有更多推荐了,返回首页