精华内容
下载资源
问答
  • 系统应用和第三方应用跳转

    千次阅读 2016-06-20 16:27:53
    电话、短信、邮件、网页浏览。调用系统服务、系统应用跳转,三方应用跳转

    前言:

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如在应用中拨打电话,一些第三方软件会在应用内发送短信等。今天将和大家一起学习如何使用系统应用、使用系统服务完成上述功能。

    事实上,我们在前面学习的内容中就有调用过系统内置的应用。比如我们在点击textView的超链接文本时,默认使用系统浏览器来访问连接,还有前面学习到地图服务,我们也可以通过打开系统内置的地图应用来完成地图服务。在开发某些应用时,如果希望能够调用iOS系统内置的电话、短信、邮件、浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的系统应用。常用的协议如下:

    • 打电话:tel:或者tel://、telprompt:或telprompt://(拨打电话前有提示)。
    • 发短信:sms:或者sms://
    • 发送邮件:mailto:或者mailto://
    • 启动浏览器:http:或者http://

    但是实际开发中我们发现,调用系统内置的应用来完成上述系统服务也存在着一些弊端:除了打电话之外,当你点击了发送短信(或邮件)操作之后直接启动了系统的短信(或邮件)应用程序,我们的应用其实此时已经处于一种挂起状态,打完电话或是发送完短信(或邮件)之后无法自动回到应用界面。而且不能在我们自己开发的应用中制定短信(或邮件)的内容。这显然不符合我们的需求,我们需要在应用程序内部完成这些操作。


    1. 拨打电话

    拨打电话的功能实现相对简单,直接使用UIApplication的OpenURL:的方法并制定对应的协议就可以,打完电话后我们任然留在当前的应用界面。下面以一个简单的demo演示如何完成拨打电话的功能:

    示例代码:

    #import "ViewController.h"
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    // 打电话 tel: 或tel:// 协议
    - (IBAction)callPhone1:(id)sender {
        // 使用这个协议会直接拨打电话
        NSString *phoneNumber=@"10010";// 拨打的电话
    
        NSString *url=[NSString stringWithFormat:@"tel://%@",phoneNumber];
    
        [self openUrl:url];
    }
    
    // 打电话 telprompt:或telprompt:// 协议
    - (IBAction)callPhone2:(id)sender {
        // 这个协议在打电话前会先弹出一个对话框,提醒你是否打电话,然后在打完电话之后会回到程序中
        NSString *phoneNumber=@"10010";// 拨打的电话
        NSString *url=[NSString stringWithFormat:@"telprompt://%@",phoneNumber];
    
        [self openUrl:url];
    }
    
    #pragma mark - 私有方法
    -(void)openUrl:(NSString *)urlStr {
    
        // 注意url中包含协议名称,iOS根据协议确定调用哪个应用,例如发送邮件是“tel://”其中“//”可以省略写成“tel:”(其他协议也是如此)
        NSURL *url=[NSURL URLWithString:urlStr];
        UIApplication *application=[UIApplication sharedApplication];
        if(![application canOpenURL:url]){
            NSLog(@"无法打开\"%@\",请确保此应用已经正确安装.",url);
            return;
        }
        // 打开对应协议的应用
        [[UIApplication sharedApplication] openURL:url];
    }
    @end

    2. 发送短信

    如果我们在应用中直接调用发送短信的系统应用,在完成发送任务后,我们停留在了系统应用当中,当然我们也可以在程序内部完成短信的编辑和发送任务。利用iOS中的MessageUI.framework,它提供了关于短信的UI接口供开发者在应用程序内部调用。从框架名称不难看出这是一套UI接口,提供有现成的短信的编辑界面,开发人员只需要通过编程的方式给短信控制器设置对应的参数即可。

    在MessageUI.framework中用于发送短信的类是MFMessageComposeViewController。它继承于UINavigationController。下面介绍一下MFMessageComposeViewController使用步骤:

    • 创建MFMessageComposeViewController对象。
    • 设置收件人recipients、信息正文body,如果运行商支持主题和附件的话可以设置主题subject、附件attachments(可以通过canSendSubject、canSendAttachments方法判断运行商是否支持)
    • 设置代理messageComposeDelegate,注意这里不是delegate属性,因为delegate属性已经留给UINavigationController,MFMessageComposeViewController没有覆盖此属性而是重新定义了一个代理,实现代理方法获得发送状态。

    下面自定义一个发送短信的界面演示MFMessageComposeViewController的使用:我们可以定制短息控制器的相关参数,当我们弹出MFMessageComposeViewController的实例对象时,看到的就是短息的系统编辑界面,点击MFMessageComposeViewController 界面中的“发送”来完成短信发送工作,当然用户也可能点击“取消”按钮回到当前应用。当然,在我们完成发送任务之后还是可以回到当前应用的。

    示例代码:

    #import "ViewController.h"
    #import <MessageUI/MessageUI.h>
    
    @interface ViewController ()<MFMessageComposeViewControllerDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    // 发短信
    - (IBAction)snedMessage1:(id)sender {
    
        NSString *phoneNumber = @"10010";
        NSString *urlString = [NSString stringWithFormat:@"sms://%@",phoneNumber];
    
        NSURL *url = [NSURL URLWithString:urlString];
        UIApplication *application = [UIApplication sharedApplication];
        if(![application canOpenURL:url]){
            NSLog(@"无法打开\"%@\",请确保此应用已经正确安装.",url);
            return;
        }
        // 打开对应协议的应用
        [[UIApplication sharedApplication] openURL:url];
    }
    
    - (IBAction)sendMessage2:(id)sender {
    
        // 判断运营商是否能够发送文本
        if(![MFMessageComposeViewController canSendText]) {
    
            //显示提示框
            UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示信息" message:@"该设备不支持短信功能" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *alertAC = [UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleCancel handler:nil];
            [alertVC addAction:alertAC];
            [self presentViewController:alertVC animated:YES completion:nil];
            return;
        }
    
        // 1.初始化一个控制器MFMessageComposeViewController用来发送短信
        MFMessageComposeViewController *messageVC = [[MFMessageComposeViewController alloc] init];
    
        // 2.设置短信内容
        // 收件人,可以设置多个
        messageVC.recipients = @[@"10086",@"10010"];
        // componentsSeparatedByString:根据某个字符将字符串分开成为不同的字符串,并存放到一个数组中。
    
        // 短信内容
        messageVC.body = @"恭喜发财,红包拿来";
    
        // 判断运营商是否支持主题设置
        if ([MFMessageComposeViewController canSendSubject]) {
            NSLog(@"can send subject");
            // 添加主题到消息控制器
            messageVC.subject = @"我的主题";
        }
        // 判断硬件是否支持附件设置
        if ([MFMessageComposeViewController canSendAttachments]) {
            NSLog(@"can send attachments");
    
            // 注意,不能直接给attachments赋值,系统将其看作只读性质对象
            //        messageVC.attachments = @[];
    
            // 添加附件到消息控制器
            NSString *filePath = [[NSBundle mainBundle] pathForResource:@"attachment.png" ofType:nil];
            NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    
            // 方法一:可以看到我们给文件的命名
            [messageVC addAttachmentURL:fileURL withAlternateFilename:@"attachment"];
    
            // 方法二:可以看到指定的文件类型,比如看到一个图片
            /**
             *  attatchData:文件数据
             *  typeIdentifier:统一类型标识,标识具体文件类型,详情查看:帮助文档中System-Declared Uniform Type Identifiers
             *  fileName:展现给用户看的文件名称
             */
            [messageVC addAttachmentData:[NSData dataWithContentsOfURL:fileURL] typeIdentifier:@"public.image" filename:@"attachment.png"];
            /* 常用的类型标识
             public.movie:Base type for movies (video with optional audio or other tracks).
             public.audio:Base type for audio (no video).
             public.image:Base type for images.
             */
        }
    
        // 3. 设置代理,通过代理监听短信的发送状态,并且释放短信控制器,
        messageVC.messageComposeDelegate = self;//注意这里不是delegate而是messageComposeDelegate
    
        // 4. 弹出消息布局控制器
        [self presentViewController:messageVC animated:YES completion:nil];
    
        // MessageUI.framework框架功能强大,除了可以支持发送短信给多人之外,自定义的消息可以为图片,并且消息支持HTML格式。最重要的是,如果彼此的手机都是iOS设备,并且都开通了iMessage功能,彼此之间的短信走的是网络通道,而不是走运营商通道!
    }
    
    #pragma mark MFMessageComposeViewControllerDelegate
    // 发送完成,不管成功与否
    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
    {
        switch (result) {
            case MessageComposeResultCancelled:
                NSLog(@"取消发送");
                break;
            case MessageComposeResultSent:
                NSLog(@"发送成功");
                break;
            case MessageComposeResultFailed:
                NSLog(@"发送失败");
                break;
            default:
                break;
        }
    
        // 应该用下面的方法释放消息控制器,因为在面向对象程序开发中,有一个原则,谁申请,谁释放!
        [self dismissViewControllerAnimated:YES completion:nil];
    
        // 当然,此方法也可以正常工作,因为系统会将关闭消息发送给self
    //    [controller dismissViewControllerAnimated:YES completion:nil];
    }
    
    @end

    这里需要强调一下:

    • MFMessageComposeViewController的代理不是通过delegate属性指定的而是通过messageComposeDelegate指定的。
    • 可以通过两种方式来指定发送的附件,当然实现的效果也是不一样的,但是在这个过程中请务必指定文件的后缀,否则在发送后无法正确识别文件类别(例如如果发送的是一张jpg图片,在发送后无法正确查看图片)。
    • 无论发送成功与否代理方法都会执行,通过代理参数中的result来获得发送状态。
    • 释放消息控制器不能使用消息控制器本身调用dismiss的方法,因为在面向对象程序开发中,有一个原则,谁申请,谁释放!所以我们使用退出消息控制器的试图控制器来完成释放的任务。

    3. 发送邮件

    那么,熟悉了MFMessageComposeViewController之后,我们来看一下如何在应用中发送邮件。 邮件的发送实现起来和短信功能相类似,是由MessageUI.framework的另外一个类MFMailComposeViewController 来实现的。MFMailComposeViewController用法和步骤和MFMessageComposeViewController完全一致,只是功能不同。下面看一下MFMailComposeViewController的使用:

    示例代码:

    #import "ViewController.h"
    #import <MessageUI/MessageUI.h>
    
    @interface ViewController ()<MFMailComposeViewControllerDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    // 发邮件 mailto: 或 mailto:// 协议
    - (IBAction)sendEmail1:(id)sender {
    
        NSString *mailAddress = @"beverteacher@163.com";
        NSString *urlStr = [NSString stringWithFormat:@"mailto://%@",mailAddress];
    
        NSURL *url = [NSURL URLWithString:urlStr];
        UIApplication *application = [UIApplication sharedApplication];
        if(![application canOpenURL:url]){
            NSLog(@"无法打开\"%@\",请确保此应用已经正确安装.",url);
            return;
        }
    
        // 打开对应协议的应用
        [[UIApplication sharedApplication] openURL:url];
    }
    
    - (IBAction)sendEmail2:(id)sender {
    
        // 判断用户设备是否能够发送邮件
        if(![MFMailComposeViewController canSendMail]) {
    
            //显示提示框
            UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示信息" message:@"提醒用户设置邮箱" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *alertAC = [UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleCancel handler:nil];
            [alertVC addAction:alertAC];
            [self presentViewController:alertVC animated:YES completion:nil];
            return;
        }
    
        // 1.初始化化一个邮件控制器MFMailComposeViewController用来编辑和发送邮件
        MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
        // 设置代理
        mailVC.mailComposeDelegate = self;
    
        // 2.设置邮件内容
        // 收件人,可以设置多个
        [mailVC setToRecipients:@[@"beverteacher@163.com"]];
        // 抄送人
        [mailVC setCcRecipients:@[@"bvitzhaoyanfei@163.com"]];
        // 密送人
        [mailVC setBccRecipients:@[@"bvitzhaoyan@163.com"]];
    
        // 邮件主题
        [mailVC setSubject:@"我的工作日报"];
        // 邮件正文
        [mailVC setMessageBody:@"这是我的<font color=\"blue\">工作报告</font>,请审阅!<BR />P.S. 我的头像牛X吗?" isHTML:YES];
        // 附件
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"头像.png" ofType:nil];
        NSData *data = [NSData dataWithContentsOfFile:filePath];
        [mailVC addAttachmentData:data mimeType:@"image/png" fileName:@"头像.png"];//第二个参数是mimeType类型,jpg图片对应image/jpeg
    
        // 3. 弹出邮件控制器
        [self presentViewController:mailVC animated:YES completion:nil];
    }
    
    #pragma mark MFMailComposeViewControllerDelegate
    - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
    {
        switch (result) {
            case MFMailComposeResultSent:
                NSLog(@"发送成功.");
                break;
            case MFMailComposeResultSaved://如果存储为草稿(点取消会提示是否存储为草稿,存储后可以到系统邮件应用的对应草稿箱找到)
                NSLog(@"邮件已保存.");
                break;
            case MFMailComposeResultCancelled:
                NSLog(@"取消发送.");
                break;
    
            default:
                NSLog(@"发送失败.");
                break;
        }
        if (error) {
            NSLog(@"发送邮件过程中发生错误,错误信息:%@",error.localizedDescription);
        }
    
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    
    @end

    4. 网页浏览

    网页的浏览相对比较简单,我们使用application的openURL:方法打开一个合法连接就可以直接进入系统的内置浏览器,在应用内部浏览可以使用UIWebView加载网络请求,UIWebView的使用前文中也有介绍,在这里就不多做赘述了。

    示例代码:

    #import "ViewController.h"
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    // 调用浏览器
    - (IBAction)browser1:(id)sender {
    
        NSString *urlStr = @"http://www.baidu.com";
        NSURL *url = [NSURL URLWithString:urlStr];
        UIApplication *application = [UIApplication sharedApplication];
        if(![application canOpenURL:url]){
            NSLog(@"无法打开\"%@\",请确保此应用已经正确安装.",url);
            return;
        }
        // 打开对应协议的应用
        [[UIApplication sharedApplication] openURL:url];
    }
    
    - (IBAction)browser2:(id)sender {
    
        UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [webView loadRequest:request];
    
        [self.view addSubview:webView];
    }
    @end

    5. 第三方应用跳转

    从上面的几个示例中不难发现当openURL:方法只要指定一个URL Schame并且已经安装了对应的应用程序就可以打开此应用。当然,如果是自己开发的应用也可以调用openURL方法来打开。假设你现在开发了一个应用A,如果用户机器上已经安装了此应用,并且在应用B中希望能够直接打开A。那么首先需要确保应用A已经配置了Url Types,具体方法就是在plist文件中添加URL types节点并配置URL Schemas作为具体协议,配置URL identifier作为这个URL的唯一标识,如下图:
    这里写图片描述
    然后就可以调用openURL方法像打开系统应用一样打开第三方应用程序了:

    // 打开第三方应用
    - (IBAction)thirdPartyApplicationClick:(UIButton *)sender {
    
        NSString *urlStr = @"thirdParty://myparams";
        NSURL *url = [NSURL URLWithString:urlStr];
        // 打开对应协议的应用
        [[UIApplication sharedApplication] openURL:url];
    }

    注意:

    • 官方内置应用是默认授权跳转的,但是第三方应用的跳转需要用户额外给予授权,所以我们看到[[UIApplication sharedApplication] canOpenURL:url]反馈结果一直为NO,所以我们省掉了判断,首次打开第三方应用时系统会弹出一个AlertView获取第三方应用跳转的授权。
    • 从结果看出app的地址构成是: URL Scheme://URL identifier,但是单用URL Scheme 即可打开程序, 即URL identifier是可选的
    • myapp://后面的字可以为点”.”和等号”=” 不可以为空格和问号
    • stackoverflow上有人指出这是apple禁止的功能, 所以请谨慎使用, 但如果是客户问”设备能力”这方面的问题, 那么答案是”可以”, 但 不建议那么做.

    就像调用系统应用一样,协议后面可以传递一些参数,这样一来在应用中可以在AppDelegate的
    - (BOOL)application:(UIApplication )app openURL:(NSURL )url options:(NSDictionary

    /** @pramas  当用户通过其它应用启动本应用时,会回调这个方法
     *
     *  prams:   url //其它应用调用openURL:方法时传过来的
     *           app //打开本应用的应用程序
     *           options // 应用的配置参数
     *
     *  return:  bool // 是否允许打开本程序
     */
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
    
        NSLog(@"url:%@,source application:%@,params:%@",url,app,[url host]);
    
        return YES;// 是否打开
    }

    下面是常用APP的Url Scheme 前缀

    QQ mqq://
    微信是 weixin://
    网易新闻 newsapp://
    淘宝 taobao://
    点评 dianping:// dianping://search
    微博 sinaweibo://
    weico微博 weico://
    支付宝 alipay://
    豆瓣fm: doubanradio://
    微盘 sinavdisk://
    网易公开课 ntesopen://
    美团 imeituan://
    人人 renren://
    我查查 wcc://
    1号店 wccbyihaodian://
    有道词典 yddictproapp://
    知乎 zhihu://
    优酷 youku://
    ZAKER zakeripad://
    京东hd openApp.jdiPad://
    易迅 icson://;yixunipad://
    wunderlist wunderlist://
    支付宝 alipay://
    查找朋友 grenada://;findmyfriends://;fmf1://
    查找iphone fmip1://
    触宝拨号:dialer://
    蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID
    WIFI:prefs:root=WIFI(WIFI这几个字母一定要大写)
    定位服务:prefs:root=LOCATION_SERVICES
    备忘录:mobilenotes://
    高德地图:iosamap://
    今日头条 snssdk141://
    挖财记账 wacai://
    QQ音乐 :QQmusic://
    酷我音乐 com.kuwo.kwmusic.kwmusicForKwsing://
    酷狗音乐 kugouURL://
    京东 openApp.jdMobile://
    QQ音乐 qqmusic://
    QQ斗地主 tencent382://
    QQ浏览器 mttbrowser://
    QQ安全中心 qmtoken://
    QQ国际版 mqqiapi://
    搜狗输入法 com.sogou.sogouinput://
    搜狐视频 sohuvideo-iphone:// 或 sohuvideo://
    搜狐新闻 sohunews://
    设置 prefs:root=SETTING
    定位服务 prefs:root=LOCATION_SERVICES
    E-Mail MESSAGE://
    ifttt ifttt://
    名片全能王hd camcard://;CamCardHDOpenAPI://
    拉手团购hd LaShouGroupHDPay://
    美团hd iMeituan://
    evermemo evermemo://
    网易云课堂 wangyiyunketang://
    网易公开课 ntesopen://
    订票助手2 trainassistfree://
    pcalc lite pcalc://
    爱奇艺视频 QIYIHD-iPad://
    三国kill sgk://
    TuneIn Radio tunein:// 或 tuneinpro://
    OfficeSuite mobisystemsofficesuite://
    WPS Office KingsoftOfficeApp://
    Line line://
    1Password onepassword://
    mdict mdict://
    名片全能王camcard://
    支付宝alipay://
    豆瓣fm:doubanradio://
    微盘 sinavdisk://
    网易公开课ntesopen://
    我查查 wcc://
    1号店wccbyihaodian://
    有道词典yddictproapp://
    知乎zhihu://
    墨客 com.moke.moke-1://
    名片全能王 camcard://
    扫描全能王 camscanner://
    12306订票助手 trainassist://
    金山词霸 com.kingsoft.powerword.6://
    节奏大师 tencentrm://
    凤凰新闻 comIfeng3GifengNews://
    高铁管家 gtgj://
    飞信 fetion://
    豆瓣FM doubanradio://
    大智慧 dzhiphone://
    布卡漫画 buka://
    爱奇艺PPS ppstream://
    哔哩哔哩动画 bilibili://
    56视频 com.56Video://
    365日历 rili365://
    58同城 wbmain://
    遇见 iaround://
    陌陌 momochat://
    旺旺卖家版 wangwangseller://
    蜻蜓FM qtfmp://
    浦发银行 wx1cb534bb13ba3dbd://
    招商银行 cmbmobilebank://
    支付宝 alipay://
    建设银行 wx2654d9155d70a468://
    工商银行 com.icbc.iphoneclient://
    随手记 FDMoney://
    腾讯企业邮箱 qqbizmailDistribute2://
    腾讯手机管家 mqqsecure://
    腾讯视频 tenvideo:// 或 tenvideo2:// 或 tenvideo3://
    腾讯微博 TencentWeibo://
    天猫 tmall://
    天天星连萌 tencent100689806://
    天天爱消除 tencent100689805://
    天天酷跑 tencent100692648://
    天天飞车 tencent100695850://
    天天动听 ttpod://扇贝新闻 shanbaynews://
    扇贝单词 shanbay://
    扇贝单词hd shanbaywordshd://
    skype skype://
    搜狐视频hd sohu-SViPad://;sohuvideohd://
    teamviewer:teamviewer8://
    格志 griddiary://;sumi-interactive://
    淘宝hd taobao://;itaobao://;taobaohd://
    天猫 tmall://
    腾讯视频hd tenvideohd://;tenvideo2://
    同步推正版HD tbtui://;tuihd://
    航旅纵横pro umetrippro://
    mathpad myscriptmathpad://
    雅虎天气! yweather://
    一号店 ipadstore://
    优酷hd youkuhd://
    知乎 zhihu://
    欧陆词典pro eudic://
    拓词 towordsp://
    Clear(著名的Todo应用) clearapp://
    电话 mobilephone://
    猎豹浏览器:sinaweibosso.422729959://
    UC浏览器:ucbrowser://
    支付宝:alipay://
    新浪微博:weibo://
    优酷:youku://
    节奏大师:节奏大师tencentrm://
    刀塔传奇:刀塔传奇teiron2273://
    天天动听:ttpod://
    淘宝taobao://有道词典 yddict://
    掌阅iReader iReader://
    艺龙旅行 elongIPhone://
    迅雷+迅雷云播 thunder://
    熊猫公交 wb1405365637://
    携程无线 CtripWireless://
    无线苏州 SuZhouTV://
    唯品会 vipshop://
    微视 weishiiosscheme://
    微拍 wpweipai://
    旺信 wangxin://
    网易公开课 ntesopen://
    网易将军令 netease-mkey://
    万年历 youloft.419805549://
    土豆视频 tudou://
    同花顺 amihexin://
    天涯社区 tianya://
    天气通Pro sinaweatherpro://
    天气通 sinaweather://
    墨迹天气 rm434209233MojiWeather://
    腾讯新闻 qqnews://
    腾讯微云 weiyun://
    腾讯地图 sosomap://
    淘宝旅行 taobaotravel://
    人人 renrenios://PPTV pptv://
    爱奇艺视频 qiyi-iphone://
    暴风影音 com.baofeng.play://
    保卫萝卜2 wb2217954495://
    保卫萝卜 wb1308702128://
    百度云 baiduyun://
    百度音乐 baidumusic://
    百度视频 baiduvideoiphone:// 或 bdviphapp://
    百度糯米 bainuo://
    百度魔图 photowonder://
    百度魔拍 wondercamera://
    百度地图 baidumap://
    百度导航 bdNavi://
    百度视频hd BaiduVideoiPad://;baiduvideoipadapp://
    百度相册hd BaiDuCloudAlbumHD://
    百度浏览器hd bdbrowser://
    百度文库hd bdwenku://
    威锋网 com.weiphone.forum://
    新浪微博 weibo:// 或 sinaweibo://
    网易邮箱 neteasemail://
    百度输入法 BaiduIMShop://
    C浏览器 ucbrowser://
    一个one clover-one://
    当当hd dangdanghd://;ddhd://
    大众点评hd dianpinghd://
    多看阅读 duokan-reader://
    艺龙旅行hd elongiPad://
    圈点hd skitch://
    印象笔记hd enx://
    备忘录 mobilenotes://
    qq通讯录 tencentappqqpim://
    Chrome谷歌浏览器 googlechrome://
    Calendars 5 calendars://
    PDF Expert 5 pdfexpert5presence://
    Documents 5 rdocs://
    nPlayer nplayer-http://
    GPlayer gplayer://
    AVPlayer HD AVPlayerHD://
    AVPlayer AVPlayer://
    Ace Player aceplayer://

    展开全文
  • 1 前言 Internet的特点就是不断变化发展,目前网络上的信息量业务量都呈现爆炸性的增长...集群的组成部分也在发生变化,过去一台Web服务器必须处理大部分的静态内容,现在可以由应用服务、高性能数据库多媒体服

     

    1 前言

      Internet的特点就是不断变化发展,目前网络上的信息量和业务量都呈现爆炸性的增长趋势。不断增长的负荷和新需求的出现,使得用单台服务器处理应用服务的结构已成为过去,取而代之的是以单一虚拟IP地址(VIP)来代表整个服务器集群,由集群中的多台服务器来分摊处理访问流量。集群的组成部分也在发生变化,过去一台Web服务器必须处理大部分的静态内容,现在可以由应用服务、高性能数据库和多媒体服务器等协同服务器集群来支持复杂的Web应用。

       这些不断增长的服务集群和服务需求要求更高效率和更高服务质量的数据交换技术。数据交换技术已经历了过去的那种单纯的电路交换逐渐发展到二层、三层甚至更高层的交换结构的结合。交换的内部机制也从存储转发、直接连通过渡到路由交换、三层交换以及最新提出四层及更高层的交换。这些先进的交换技术在解决局域网和互联网络的带宽及容量问题上发挥了很好的作用。

    2 传统的二、三层交换

       传统的第二层交换技术是在最初的总线集线器和网桥的基础上发展而成的,一般用于局域网的数据交换上,是作为对共享式局域网提供有效的数据交换的解决方案而出现的,它可以使每个用户尽可能地分享到最大带宽。

       第二层交换技术是在OSI七层网络模型中的第二层,即在数据链路层上进行操作的。它对数据包的转发是建立在MAC(物理端口)地址的基础之上的,对于上层协议来说,它是透明的。交换机在转发数据包时无须知道数据包的IP地址,只需其物理地址即MAC地址。交换机在操作过程中不断地维护着一个简单的地址表,它说明了MAC地址和端口的对应关系,所以当交换机收到一个数据包时对比数据包的MAC地址就可以知道是哪个端口的数据包。整个过程全部是在硬件控制下实现的,因此速度相当快,大大地加速了数据包的传输。

       第二层交换非常有利于建立LAN内部或者VLAN之间的数据交换,可以大大提高数据在LAN中的通信速度。但是第二层交换只是一种简单的基于MAC层的数据交换,所以对于不同的IP子网之间的数据交换还是要经过路由器先进行路由。在有大量数据跨越子网的情况下,传统的路由器又成为了网络通信中的瓶颈,这个时候就引入了第三层交换的概念。

      第三层交换就是在OSI参考模型的第三层进行操作。第三层交换技术也称为IP交换技术、交换路由技术。这是一种利用第三层协议中的IP数据包头信息来加强第二层交换功能的机制。网络中的大量数据往往越过本地的网络在网际间传送,因而路由器常常不堪重负地成为瓶颈。在这种情况下要是在源地址和目的地址之间有一条更为直接的第二层通路,就没有必要每次都经过路由器的路由判断来转发数据包。第三层交换使用第三层路由协议确定传送路径,此路径可以只用一次,也可以存储起来,供以后使用,之后数据包通过一条虚电路不需要经过路由判断而直接快速发送,最终目的是将数据通信时的路由次数降至最低。这样的第三层交换式路由器比仅仅路由式的路由器性能上要提高非常多,一般称之为路由交换机。

      在第三层交换机连接的情况下,主机A跟主机B第一次通过交换机通信,中间的交换机便会把A和B的IP地址及它们的MAC地址记录下来,当其它主机如C要和A或B通信时,针对C所发出的寻址封包,第三层交换机送出一个回复告诉它A或B的MAC地址,以后C当然就会用A或B的MAC地址“直接”和它通信,不需要理会A、B和C是否属于不同的子网,这样就不用每次进行路由,避免每次路由操作这样一个速度相对比较慢的过程。

      将第二层交换和第三层交换结合在一起就成为一种通过第二层连接网络链路在子网中指引业务流,通过第三层交换或路由器将包从一个子网传到另一个子网。目前针对第二层、第三层结合的技术已提出了很多具体的实现方案,和以ATM为代表的链路层结合的MPLS、MPOA技术最为突出。

    3 第四层交换技术

      第二层与第三层交换产品在解决局域网和网络互联的QoS问题上发挥了很好的作用,但是对于当前的网络来说还是不够的,还需要进一步地提高QoS性能,这就需要在更高层上引入交换的概念。

      我们知道OSI协议参考模型定义了7层结构,网络层以上也就是第四层即传输层,传输层主要负责端对端的通信。传输层有很多的协议,常用的有TCP、UDP协议,这些协议承载了许多不同的业务,这些业务通常是由一些诸如HTTP、FTP、NFS、Telnet等协议表示,这些协议的类型由TCP或UDP端口地址来决定,就如同第二层的传输是依靠MAC地址来寻址,第三层的传输是依靠IP地址来寻址,那么第四层的主要表示就是传输层的端口地址。通过端口地址可以区分数据包是由哪个传输层协议传送的。

      分配端口号的清单可以在RFC1700中找到。TCP/UDP端口号提供的附加信息可以为网络交换机所利用,这是第四层交换的基础。

      第四层交换中数据包的传输不仅仅依据MAC地址(第二层交换)或源/目标IP地址(第三层路由),还依据TCP/UDP端口地址(第四层地址),也就是说第四层交换除了考虑三层的逻辑地址外还要考虑对端口地址的处理。如同上面所描述的那样,端口地址代表了不同的业务协议,所以第四层交换不仅仅进行了物理上的交换,还包括了业务上的交换。所以说第四层交换的交换域是由源端和终端IP地址、TCP和UDP端口共同决定。因此,第四层交换机是真正的“会话交换机”。

      由于带有业务信息,所以第四层交换机就带有了业务智能,可以做出向何处转发会话传输流的决定。对于Internet服务提供商或内容提供商来说,第四层交换的这个功能是尤其重要的。不断增长的负荷和需求的出现,使得用单台服务器处理应用服务的结构已成为过去,一般网络的服务提供商采用多种不同系统来构架一种应用的大型企业数据中心,数据在很多服务器上进行镜像复制。第四层交换在这样的情况下是大有可为的,可以将会话转入性能最佳的目的机器上。

      第四层交换尤其可以应用在以单一虚拟IP地址(VIP)来代表整个服务器集群的情况下。具有第四层功能的交换机能够起到与服务器相连接的"虚拟IP"(VIP)前端的作用。每台服务器和支持单一或通用应用的服务器组都配置同样的一个VIP地址。这个VIP地址作为对外提供统一服务的目的地。当某用户申请应用时,用户请求的数据包先通过第三层路由器发送到具有第四层交换功能的交换机,然后第四层交换机可以根据会话和应用层信息做出转发决定,将用户的请求根据不同的规则转发到"最佳"的服务器上。将"最佳"服务器地址中的IP取代VIP,并将连接请求传给相应服务器。因此,第四层交换技术是用于传输数据和实现多台服务器间负载均衡的理想机制。

      第四层交换技术通过硬件来实现可以做成第四层交换机,它可以实现基于端到端的服务质量要求对所有联网设备的负载进行细致的均衡,以保证客户机与服务器之间数据平滑地流动。

      第四层交换技术的关键问题是如何确定传输流转发给哪台最可用的服务器,也就是策略选择问题。选择策略可以根据不同的需要来制定,对高优先权的业务应首先保证它的QoS,将这种业务引向最大可利用的服务器中。而QoS要求小的就可以作为一般负载处理。目前应用神经网络的学习算法实现在学习中动态的调整策略是一种非常好的实现方法。

    4 应用交换技术

      在第四层交换大大地提高了网络性能和QoS保证之后,在更高的层次上也引入了交换的概念,可以称之为第七层交换技术,或者高层智能交换。

      这时候的交换突破了一般意义上的交换的概念,开始进入以进程和内容级别为主的交换范围。高层由于和应用相关,我们说这时候的交换就有了智能性。交换机具有了区别各种高层的应用和识别内容的能力。这时的交换机不仅能根据数据包的IP地址或者端口地址来传送数据,而且还能打开数据包,进入数据包内部并根据包中的信息做出负载均衡、内容识别等判断。

      对于某一个端口来说,我们在第四层交换时候可以对端口进行分析来获得较好的QoS,但是对于通过TCP/IP端口的传输流我们没有办法识别,只能对所有属于这个端口的传输流统一对待,而服务提供商或许需要其中的某些传输流具有高的QoS优先处理权或者将某些流引向性能高的处理机中。而第七层的智能交换能够实现进一步的控制,即对所有传输流和内容的控制。这种交换机可以打开传输流的应用/表示层,分析其中的内容,因此可以根据应用的类型而非仅仅根据IP和端口号做出更智能的流向决策。其中的一个典型例子就是根据URL的具体内容的识别交换。

      第七层交换技术可以定义为数据包的传送不仅仅依据MAC地址(第二层交换)或源/目标IP地址(第三层路由)以及依据TCP/UDP端口(第四层地址),而是可以根据内容(表示/应用层)进行。这样的处理更具有智能性,交换的不仅仅是端口,还包括了内容,因此,第七层交换机是真正的"应用交换机"。

      这类具有第七层认知的交换机可以应用在很多方面,比如保证不同类型的传输流被赋予不同的优先级。它可以对传输流进行过滤并分配优先级,使你不必依赖于业务或网络设备来达到这些目的,譬如,网络电子商务提供商使用80端口提供用户服务,但是对于不同的Web请求他们希望不同对待,比如浏览一般商品的Web请求的级别比用户发出的定购Web请求要低一些,而且处理起来也不一样。这样需要识别80端口中的具体的URL内容来进行判断,赋予不同的优先权交换到不同的处理器上去。更进一步,可能需要对不同级别的用户的Web请求给予不同QoS优先权,这样就需要对数据请求的内容进行识别,这时候对交换的智能要求就非常高了。

      目前关于第七层交换功能还没有具体的标准。第七层交换功能和目前很多类似的技术具有很大的互补性,它可以和其他的网络服务和谐地共存。但是第七层交换和类似的解决方案之间最大的优势,也就是交换技术具有的最大优势,就是高速而且不影响智能处理。采用第七层交换技术可以以交换的线速度做出更智能性的传输流内容的决策。用户将自由地根据得到的信息就各类传输流和其目的地做出决策,从而优化网络访问,为最终用户提供更好的服务。

    5 高层交换技术与Web交换机

      高层交换技术的一个典型应用就是Web交换机。目前Internet网上提供应用的主要方式就是网站,在网站上的信息量和访问量急剧增长的前提下,怎样为用户提供更多的服务,使每个用户都可以得到QoS保证是一个越来越重要的问题。网站的运营商们正在尝试通过架构新的体系结构以适应其业务的增长。

      怎样将数据中心的各种设备,包括各种互联网服务器、防火墙、高速缓冲服务器、数据仓库和网关等组织起来提供对外界面一致和QoS保证的服务,同时提供管理、路由和负载均衡传输成为一个焦点问题。所以必须提供一种处于网络中心地位的交换机,来组织数据中心,我们称之为Web交换机,Web交换机的基本功能是:
    · 组织数据中心;
    · 提供对外一致的服务界面;
    · 管理数据的流向、路由;
    · 负载均衡;
    · 提供QoS和CoS(服务等级);
    · 请求会话定向。

      可以看出所需要的Web交换技术仅仅用传统的交换机是无法实现的,必须结合高层交换机的技术来实现。为了实现上述的功能Web交换机必须检查4~7层的协议字段,获取信息来处理数据流的管理和定向。

      Web交换机的设计比较复杂,目前Web交换机也只是采用了三层以上的高层交换技术的部分功能。主要的Web交换机设计方案有三种:集中式CPU模式、分布式处理系统和二级混合模式。每种设计方案是采用不同的方法把交换、控制和状态共享组合,因此各有优缺点。

    6 结束语

      本文探讨了目前出现的高层交换技术,可以看出由于网络的快速发展,高层交换技术的应用正在成为一种趋势,尤其是第四层交换发展迅速,已经有很多产品出现。但是更高层的交换产品由于其复杂性目前还处于一种概念或者说是实验阶段,要实现商用化还有很大的距离,但是综合它们其中一部分优点的Web交换机已经得到了应用,必将成为一个发展趋势。
      
     

    展开全文
  • 区块链应用场景

    万次阅读 多人点赞 2019-09-05 18:47:11
    要么是统一由一个中心进行信息发布分发,要么是彼此之间定时批量对账(典型的每天一次),对于有时效性要求的信息共享,难以达到实时共享。 信息共享的双方缺少一种相互信任的通信方式,难以确定收到的信息是否是...

    一、应用场景:信息共享

    这应该是区块链最简单的应用场景,就是信息互通有无。

    1、传统的信息共享的痛点

    要么是统一由一个中心进行信息发布和分发,要么是彼此之间定时批量对账(典型的每天一次),对于有时效性要求的信息共享,难以达到实时共享。

    信息共享的双方缺少一种相互信任的通信方式,难以确定收到的信息是否是对方发送的。

    2、区块链 + 信息共享

    首先,区块链本身就是需要保持各个节点的数据一致性的,可以说是自带信息共享功能;其次,实时的问题通过区块链的P2P技术可以实现;最后,利用区块链的不可篡改和共识机制,可构建其一条安全可靠的信息共享通道。

    也行你会有这样的疑问:解决上面的问题,不用区块链技术,我自己建个加密通道也可以搞定啊!但我想说,既然区块链技术能够解决这些问题,并且增加节点非常方便,在你没有已经建好一套安全可靠的信息共享系统之前,为什么不用区块链技术呢?

    3、应用案例

    举下我们腾讯自己的应用--公益寻人链,借用如下一张好图,可以看到,区块链在信息共享中发挥的价值。

    浅谈区块链的七大应用场景

    二、应用场景:版权保护

    1、传统鉴证证明的痛点

    流程复杂:以版权保护为例,现有鉴证证明方式,登记时间长,且费用高。

    公信力不足:以法务存证为例,个人或中心化的机构存在篡改数据的可能,公信力难以得到保证。

    2、区块链 + 鉴证证明

    流程简化:区块链应用到鉴证证明后,无论是登记还是查询都非常方便,无需再奔走于各个部门之间。

    安全可靠:区块链的去中心化存储,保证没有一家机构可以任意篡改数据。

    3、应用案例

    区块链在鉴权证明领域的应用有版权保护、法务存证等,下面以版权保护为例,简单说下如何区块链如何实现版权登记和查询。

    (1)电子身份证:将“申请人+发布时间+发布内容”等版权信息加密后上传,版权信息用于唯一区块链ID,相当拥有了一张电子身份证。

    (2)时间戳保护:版权信息存储时,是加上时间戳信息的,如右雷同,可用于证明先后。

    (3)可靠性保证:区块链的去中心化存储、私钥签名、不可篡改的特性提升了鉴权信息的可靠性。

    2016年8月,由Onchain、微软(中国)、法大大等多个机构在北京成立了电子存证区块链联盟“法链”。

    2017年12月,微众银行、仲裁委(广州仲裁委)、杭州亦笔科技有限公司共同推出的仲裁联盟链,用于司法场景下的存证;2018年3月,广州首个“仲裁链”判决书出炉。

    三、应用场景:物流链

    浅谈区块链的七大应用场景

    商品从生产商到消费者手中,需要经历多个环节(流程可能如上图所示),跨境购物则更加复杂;中间环节经常出问题,消费者很容易购买的假货。而假货问题正是困扰着各大商家和平台,至今无解。

    1、传统是防伪溯源手段

    以一直受假冒伪劣产品困扰的茅台酒的防伪技术为例,2000年起,其酒盖里有一个唯一的RFID标签,可通过手机等设备以NFC方式读出,然后通过茅台的APP进行校验,以此防止伪造产品。 咋一看,这种防伪效果非常可靠。但2016年还是引爆了茅台酒防伪造假,虽然通过NFC方式验证OK,但经茅台专业人士鉴定为假酒。后来,在“国酒茅台防伪溯源系统”数据库审计中发现80万条假的防伪标签记录,系防伪技术公司人员参与伪造;随后,茅台改用安全芯片防伪标签。

    但这里暴露出来的痛点并没有解决,即防伪信息掌握在某个中心机构中,有权限的人可以任意修改。(备注:茅台的这种防伪方式,也衍生了旧瓶回收,旧瓶装假酒的产业,防伪道路任重而道远)。

    2017年05月贵阳数博会上,小马哥就建议茅台防伪使用区块链;那么区块链和物流链的结合有什么优势呢?

    2、区块链+物流链

    区块链没有中心化节点,各节点是平等的,掌握单个节点无法实现修改数据;需要掌控足够多的节点,才可能伪造数据,大大提高伪造数据的成本。

    区块链天生的开放、透明,使得任何人都可以公开查询,伪造数据被发现的概率大增。

    区块链的数据不可篡改性,也保证了已销售出去的产品信息已永久记录,无法通过简单复制防伪信息蒙混过关,实现二次销售。

    物流链的所有节点上区块链后,商品从生产商到消费者手里都有迹可循,形成完整链条;商品缺失的环节越多,将暴露出其是伪劣产品概率更大。

    3、应用案例

    目前,入局物流链的玩家较多,包括腾讯、阿里、京东、沃尔玛等。 据说,阿里的菜鸟在海淘进口应用区块链上,走在了前面,已经初步实现海外商品溯源,国际物流及进口申报溯源、境内物流溯源;下一步就是生产企业溯源了。下图是网上流传的关于阿里的菜鸟在海淘场景运用区块链的示意图。

    浅谈区块链的七大应用场景

    另据最新消息,在3月份的第三届全球物流技术大会上,腾讯与中国物流与采购联合会(简称“中物联”)正式签署战略合作协议,并发布了区块链物流平台。强强联合,想象空间很大。

    四、应用场景:供应链金融

    1、传统的供应链单点融资

    在一般供应链贸易中,从原材料的采购、加工、组装到销售的各企业间都涉及到资金的支出和收入,而企业的资金支出和收入是有时间差的,这就形成了资金缺口,多数需要进行融资生产。我们先来看个简单的供应链(复杂的我也不了解(⊙o⊙)),如下图:

    浅谈区块链的七大应用场景

    我们再来看看图中各个角色的融资情况:

    核心企业或大企业:规模大、信用好,议价能力强,通过先拿货后付款,延长账期将资金压力传导给后续供应商;此外,其融资能力也是最强的。

    一级供应商:通过核心企业的债权转让,可以获得银行的融资。

    其他供应商(多数是中小微企业):规模小、发展不稳定、信用低,风险高,难以获得银行的贷款;也无法想核心企业一样有很长的账期;一般越小的企业其账期越短,微小企业还需要现金拿货。这样一出一入对比就像是:中小微企业无息借钱给大企业做生意。

    2、区块链+供应链金融

    面对,上述供应链里的中小微企业融资难问题,主要原因是银行和中小企业之间缺乏一个有效的信任机制。

    假如供应链所有节点上链后,通过区块链的私钥签名技术,保证了核心企业等的数据可靠性;而合同、票据等上链,是对资产的数字化,便于流通,实现了价值传递。

    浅谈区块链的七大应用场景

    如上图所示,在区块链解决了数据可靠性和价值流通后,银行等金融机构面对中小企业的融资,不再是对这个企业进行单独评估;而是站在整个供应链的顶端,通过信任核心企业的付款意愿,对链条上的票据、合同等交易信息进行全方位分析和评估。即借助核心企业的信用实力以及可靠的交易链条,为中小微企业融资背书,实现从单环节融资到全链条融资的跨越,从而缓解中小微企业融资难问题。

    3、应用案例

    比较成熟的还没看到,目前腾讯也已入局。

    五、应用场景:跨境支付

    1、传统跨境支付

    浅谈区块链的七大应用场景

    跨境支付涉及多种币种,存在汇率问题,传统跨境支付非常依赖于第三方机构,大致的简化模型如上图所示,存在着两个问题;

    流程繁琐,结算周期长:传统跨境支付基本都是非实时的,银行日终进行交易的批量处理,通常一笔交易需要24小时以上才能完成;某些银行的跨境支付看起来是实时的,但实际上,是收款银行基于汇款银行的信用做了一定额度的垫付,在日终再进行资金清算和对账,业务处理速度慢。

    手续费高:传统跨境支付模式存在大量人工对账操作,加之依赖第三方机构,导致手续费居高不下,麦肯锡《2016全球支付》报告数据显示,通过代理行模式完成一笔跨境支付的平均成本在25美元到35美元之间。

    2、区块链+跨境支付

    这些问题的存在,很大原因还是信息不对称,没有建立有效的信任机制。

    浅谈区块链的七大应用场景

    如上图所示,区块链的引入,解决了跨境支付信息不对称的问题,并建立起一定程度的信任机制;带来了两个好处。

    效率提高,费用降低:接入区块链技术后,通过公私钥技术,保证数据的可靠性,再通过加密技术和去中心,达到数据不可篡改的目的,最后,通过P2P技术,实现点对点的结算;去除了传统中心转发,提高了效率,降低了成本(也展望了普及跨境小额支付的可能性)。

    可追溯,符合监管需求:传统的点对点结算不能不规模应用,除了信任问题,还有就是存在监管漏洞(点对点私下交易,存在洗黑钱的风险),而区块链的交易透明,信息公开,交易记录永久保存实现了可追溯,符合监管的需求。

    3、应用案例

    应用现状:Ripple、Circle、招商银行等已经入局。

    六、应用场景:资产数字化

    1、实体资产存在的问题

    实体资产往往难以分割,不便于流通

    实体资产的流通难以监控,存在洗黑钱等风险

    2、区块链实现资产数字化

    资产数字化后,易于分割、流通方便,交易成本低

    用区块链技术实现资产数字化后,所有资产交易记录公开、透明、永久存储、可追溯,完全符合监管需求

    3、应用案例

    还是以腾讯的微黄金应用为例,继续借用腾讯区块链官网(trustsql.qq.com)上的图片,可以看到,在资产数字化之后,流通更为方便了,不再依赖于发行机构;且购买0.001g黄金成为了可能,降低了参与门槛。

    浅谈区块链的七大应用场景

    七、应用场景:代币

    本来不像把代币加进来的,但说到区块链,始终绕不开代币;因区块链脱胎于比特币,天生具有代币的属性,目前区块链最成功的应用也正是比特币

    1、传统货币存在的问题

    传统的货币发行权掌握在国家手中,存在着货币滥发的风险

    元朝自1271年建立后,依然四处征战,消耗大量的钱财和粮食,为了财政问题,长期滥发货币,造成严重通货膨胀,多数百姓生活在水生火热中,导致流民四起,国家大乱,1368年,不可一世的元朝成了只有97年短命鬼,走向了灭亡。

    1980年津巴布韦独立,后因土改失败,经济崩溃,政府入不敷出,开始印钞;2001年时100津巴布韦币可兑换约1美元;2009年1月,津央行发行100万亿面值新津元(如下图)加速货币崩溃,最终津元被废弃,改用“美元化”货币政策。2017年津巴布韦发生政变,总统穆加贝被赶下台。

    浅谈区块链的七大应用场景

    传统的记账权掌握在一个中心化的中介机构手中,存在中介系统瘫痪、中介违约、中介欺瞒、甚至是中介耍赖等风险。

    2013年3月,塞浦路斯为获得救助,对银行储户进行一次性征税约58亿欧元, 向不低于10万欧元的存款一次性征税9.9%,向低于10万欧元的一次性征税6.75%。

    2017年4月,民生银行30亿假理财事件暴露,系一支行行长伪造保本保息理财产品所致,超过150名投资者被套。

    2、区块链如何解决这些问题

    浅谈区块链的七大应用场景

    比特币解决了货币在发行和记账环节的信任问题,我们来看下比特币是如何一一破解上面的两个问题。

    滥发问题:比特币的获取只能通过挖矿获得,且比特币总量为2100万个,在发行环节解决了货币滥发的问题; 账本修改问题:比特币的交易记录通过链式存储和去中心化的全球节点构成网络来解决账本修改问题。

    链式存储可以简单理解为:存储记录的块是一块连着一块的,形成一个链条;除第一个块的所有区块都的记录包含了前一区块的校验信息,改变任一区块的信息,都将导致后续区块校验出错。因为这种关联性,中间也无法插入其他块,所以修改已有记录是困难的。

    而去中心化节点可以简单理解为:全球的中心节点都是平等的,都拥有一模一样的账本,所以,任一节点出问题都不影响账本记录。而要修改账本,必须修改超过全球一半的节点才能完成;而这在目前看来几乎不可能。 既然账本无法修改,那要是记账的时候作弊呢? 首先,比特币的每条交易记录是有私钥签名的,别人伪造不了这个记录。你能修改的仅仅自己发起的交易记录。

    其次,是关于记账权问题:比特币的记账权,通过工作量证明获得,可以简单理解为:通过算法确定同一时刻,全球只有一个节点获得了记账权,基本规律是谁拥有的计算资源越多,谁获得记账权的概率越大,只有超过全网一半的算力,才可能实现双花。

    备注:比特币的模式是不可复制的,比特币已经吸引了全球绝大多数的算力,从而降低51%攻击发生等问题;其他的复制品基本无法获得相应的算力保证。

    目前,比特币还存在着51%和效率低等问题有待解决,另外,关于交易本身的信任问题是个社会问题,比特币是没有解决的,也解决不了的。

    3、应用案例

    最具代表性的当然是比特币,也不用多说了。

    备注:代币这块真的不看好,比特币目前吸引了全球绝大部分的算力,有独一无二的算力资源作为支撑还稍好一点,其他的代币和传统的货币相比,其背后缺乏国家和武力为其做信用背书,且夺取了国家发币带来的各种好处(如宏观调控),仔细想想就知道有多不靠谱。

    浅谈区块链的七大应用场景

    结论

    区块链应用的场景肯定还有很多,但很多都还不大明朗,暂时就先梳理以上7种场景,顺便归纳一下。

    浅谈区块链的七大应用场景

    区块链这么火,但实际应用的案例却少之又少;我认为,并非区块链技术目前存在的问题阻碍了其大范围的应用,也不是区块链可以应用的场景非常少,区块链商用牵扯到各方的利益,其最大的难题可能远在技术之外。

    展开全文
  • 现在,3部分将带您完成在Android模拟器或真实设备中构建运行应用程序的步骤。 我们将首先使用Gradle构建应用程序的应用程序包(APK)文件。然后,我将向您展示如何在Android模拟器或实际设备(在本例中为Kindle ...

            在Android Studio的第2部分中,您使用Android Studio创建了第一个动画移动应用程序。现在,第3部分将带您完成在Android模拟器或真实设备中构建和运行应用程序的步骤。

    我们将首先使用Gradle构建应用程序的应用程序包(APK)文件。然后,我将向您展示如何在Android模拟器或实际设备(在本例中为Kindle Fire平板电脑)上设置和运行该应用程序。我还将向您展示如何解决Android Studio模拟器设置中的几个问题,包括臭名昭著的等待超时错误。

    请注意,此系列已针对Android Studio 3.2.1进行了更新。

    构建您的Android应用

    如果按照第2部分中的说明进行操作,那么您已经将源代码和资源文件加载到了Android Studio项目中。现在,您已经准备好首次构建该应用程序。

    如果还没有,请启动Android Studio。菜单栏提供了一个Build菜单,您将使用该菜单访问Gradle并构建示例应用程序。

    生成菜单中选择生成项目。您应该在状态栏上看到Gradle Build Running消息。一段时间后,您应该会看到Gradle Build Finished消息。单击此消息,将出现“ **事件日志”**窗口。

    图1

    图1.事件日志显示没有问题

    建立Android应用程序的方法不止一种。例如,您可以从“ **生成”**菜单中选择“ 重建项目 ” 。另一种方法是实际运行应用程序。如有必要,Gradle将在安装APK和运行该应用之前自动重建该应用。

    使用“构建”菜单执行更多操作

    Android Studio的“ 构建”菜单可让您执行多个构建任务。例如,您可以使用Generate Signed Bundle / APK 菜单项来构建签名的 app bundle 或APK。

    运行您的Android应用

    在本节中,我将向您展示如何通过两种方式运行Android应用程序:首先在模拟设备上,然后在实际设备上。在我的示例中,我将使用Amazon Kindle Fire HD平板电脑,但说明通常应适用于您选择的设备。

    在模拟设备上运行您的Android应用

    您可以通过在“ 运行”菜单中选择“运行”应用程序来运行示例应用程序(W2A)或任何其他应用程序。或者,您可以单击工具栏上的绿色三角形按钮。无论哪种方式,Android Studio都会弹出“ **选择部署目标”**的对话框。

    图2

    图2.必须运行Android Debug Bridge(ADB)才能运行Android应用程序

    初始化Android调试桥后,图2中的消息将替换为所有已连接的USB设备和已被Android Studio检测到的运行模拟器的列表。

    图3

    图3.选择设备或模拟器以运行该应用程序

    在这种情况下,Android Studio尚未检测到任何已连接的USB设备或模拟器,因此您需要配置新的虚拟设备。单击创建新的虚拟设备将启动如图4所示的对话框。

    图4

    图4.使用“虚拟设备配置”对话框选择要仿真的设备

    选择想要模拟的设备。在此示例中,我选择了Nexus 5X(默认)。选择后,单击“ 下一步”

    出现的“ 系统映像”界面让您选择此设备模拟的系统映像。我单击了Other Images选项卡,然后单击IceCreamSandwich-图5中突出显示的行。

    图5

    图5.选择一个用于设备模拟的系统映像

    您需要单击下载链接以下载所选的任何系统映像。该映像默认情况下未安装。在安装系统映像之前,还将接受许可协议。

    图6

    图6.接受许可协议,然后单击Next

    您必须接受许可协议才能继续。接受许可协议后,将显示“ **组件安装程序”**界面。此时,正在下载并安装系统映像组件。

    图7

    图7.安装完成后,单击完成

    在继续之前,最好检查一下您的工作。使用“ **后退”**按钮返回安装对话框,然后返回“ **Android虚拟设备”(AVD)**界面。在这里,您可以确认更改将运行模拟设备AVD的设置。

    图8

    图8.保留默认设置,然后单击Finish

    对于此示例,我选择保留默认设置。您可以保留默认值或进行任何必要的更改,然后单击“ 完成”。现在,您应该返回到“ **选择部署目标”**对话框。

    图9

    图9. Nexus 5X API 15在Android虚拟设备列表中可用

    选择你创建的模拟器,然后单击“ 确定”

    对Android设备模拟器进行故障排除

    不幸的是,在安装的这一点上,您可能会收到一条消息,提示不支持即时运行。在我的情况下,状态栏显示“ **正在等待目标设备联机”**消息,并出现一个空的模拟器窗口。

    图10

    图10.黑屏

    模拟器窗口出现后不久qemu-system-armel.exe,负责创建此窗口的基于Windows的程序崩溃了。(从第1部分中回想起,我正在使用64位Windows操作系统。)

    图11

    图11.有关崩溃的可执行文件的Windows通知

    起初,我不确定如何解决此问题。幸运的是,下一次我运行Android Studio时,在Android Studio主窗口的右下方区域中观察到一条IDE和Plugin Updates消息。

    图12

    图12.单击Update链接,然后按照说明更新Android模拟器

    我单击了更新链接,并按照说明更新了模拟器,从而生成了一个新qemu-system-armel.exe文件。

    之后没有再次崩溃,但我很快遇到了另一个障碍。

    等待目标设备上线

    当我尝试在模拟器中运行该应用程序时,状态栏再次显示“ **正在等待目标设备联机”**消息,然后显示空白的模拟器窗口。

    最终,Android Studio放弃等待,并显示错误消息:等待设备时出错:等待模拟器上线300秒超时。

    当我搜索这些消息时,发现许多其他人都遇到了此问题。一些开发人员通过启用AVD的图形处理单元硬件解决了此问题。我们需要进行一些探索才能弄清楚这一点,因此,我将分享我的经验教训,并希望为您节省一些时间。

    启用AVD的图形处理单元

    AVD由位于.avd扩展名目录中的几个文件和目录组成。例如,我创建的AVD位于C:\USERS\Jeff\.android\avd\Nexus_5X_API_15.avd中。

    此目录包含一个config.ini文件,该文件存储AVD的配置设置。有两个设置引起了我的注意:

    hw.gpu.enabled=no
    hw.gpu.mode=off
    

    我将这些条目更改为以下内容:

    hw.gpu.enabled=yes
    hw.gpu.mode=on
    

    启用图形处理单元可以解决问题:下次尝试运行该应用程序时,我看到了运行正常的Nexus 5X模拟设备。

    图13

    图13.解锁设备以查看应用程序

    我使用鼠标向右滑动锁定图标来解锁设备。此时,模拟器显示了示例应用程序的主要活动。

    图14

    图14.单击Animate按钮以运行动画

    如何使用AVD Manager?

    如果您像我一样,可能希望可以通过AVD Manager更改模拟器设置。例如,AVD的配置屏幕上有一个图形下拉列表框,其中包含软件-GLES 1.1(默认设置)和硬件-GLES 2.0条目。我尝试选择“ 硬件-GLES 2.0”,但所做的更改没有保留。我成功更改hw.gpuconfig.ini文件中的条目。

    在实时设备上运行Android应用

    通过Android Studio缓慢的模拟器运行应用程序可能会非常令人沮丧。一种解决方案是使用更快的第三方模拟器,例如GenyMotion的Android Studio插件。另一个解决方案是使用实际的Android设备。

    几年前,我购买了运行Android 4.0.3(API级别15)的第一代Amazon Kindle Fire HD 7“平板电脑。我仍然使用该平板电脑运行不需要最新Android API的Android应用程序。

    在研究如何将Kindle Fire平板电脑与Android Studio 3.2.1结合使用时,我从网上找到了两个有用的指南:设置Fire Tablet的开发环境通过ADB连接到Fire Tablet。我将总结将Kindle Fire设备连接到Android Studio的过程,但是如果您需要更多信息,请参考这些指南。

    首先,如果您是像我这样的Windows用户,则需要先卸载再将Kindle Fire平板电脑连接到开发计算机时安装的非ADB驱动程序,而无需先启用ADB。然后,安装亚马逊的USB驱动程序。

    接下来,下载Kindle Fire USB驱动程序。下载的ZIP存档包含一个Fire_Devices ADB drivers.exe应用程序。

    执行Fire_Devices ADB drivers.exe并遵循说明。我最后找到一个包含必要驱动程序文件的目录C:\Program Files (x86)\Amazon.com\Fire_Devices\Drivers

    安装驱动程序后,我需要在平板电脑上启用ADB。然后,将平板电脑连接到开发计算机。如果您需要将平板电脑连接到Android Studio的其他说明,请参阅Amazon指南。

    完成所有设置后,启动Android Studio,加载您的Android项目,然后运行该应用程序。这次,“ **选择部署目标”**对话框应在“ 连接的设备”部分显示一个Amazon KFTT条目。选择此项,然后单击“ 确定”。Android Studio通过指示Gradle来构建应用程序来做出响应。完成后,它将安装应用程序的APK并在设备上运行该应用程序。

    图15

    图15.单击Animate执行动画

    第三部分总结

    您已经使用Android 3.2.1或更高版本编写,构建和运行了第一个Android Studio应用程序,并且在此过程中进行了一些故障排除。下一步,我建议尝试所学知识。使用前三篇Android初学者教程中的示例和源代码来开发自己的新项目。在学习使用Android Studio及其内置功能的来龙去脉时,请保持项目简单,但要挑战自己进行练习。

    当然,您可以使用Android Studio做更多的事情。本系列的最后一篇文章介绍了三个内置工具,用于记录,调试和整理Android应用程序。我还将使用三个生产力插件(包括Project Lombok)扩展Android Studio。

    在此之前,祝您编程愉快!

    展开全文
  • 现实中,应用往往包含很多功能,这些功能无法通过一个页面展示,所以应用往往是‘多页面应用’。而且,用户在这些页面之间来回切换,开发者要做的就是保证用户的操作顺畅。最好的解决办法就是虽然逻辑上是‘多页面...
  • Android 将自己的应用改为系统应用

    万次阅读 多人点赞 2016-11-30 16:19:11
    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少...一种:使用ADB命令将app安装在system/app目录下转载:android 将自己的应用改为系统应用这种方法的原理就是:1、把apk文件移动到
  • 生态环境敏感性是指生态系统对区域内自然人类活动干扰的敏感程度,它反映区域生态系统在遇到干扰时,发生生态环境问题的难易程度可能性的大小,并用来表征外界干扰可能造成的后果,即在同样干扰强度或外力作用下...
  • 企业微信接入三方应用(以服务商身份)

    万次阅读 多人点赞 2019-07-27 17:20:15
    最近在搞企业微信的东西,刚开始对这个的确没有任何的概念,属于两眼...首先,要明确两个概念,就是微信企业微信不是一个东西(虽然有些信息互通)、企业微信应用和服务商的三方应用也不是一个东西(虽然也有...
  •  企业微信三方应用与企业微信自建应用也不相同,一定要区分! !! 本地测试完成,没问题了,直接提交上线,就OK啦!!!1.官网地址:https://work.weixin.qq.com/,首先(注册/)登陆,然后点击右上角,服务商...
  • docker入门(利用docker部署web应用)

    万次阅读 多人点赞 2019-05-26 10:44:15
    前言:本课程是在慕课网上学习 一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1.3 什么是Docker 二章 了解docker 2.1 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,037,451
精华内容 414,980
关键字:

和第七应用一样的