什么是Scheme?原来还可以这样应用!

Scheme定义

Scheme 编程语言是一种Lisp方言,诞生于1975年,由 MIT 的 Gerald J. Sussman 和 Guy L. Steele Jr. 完成。它是现代两大Lisp方言之一;另一个方言是Common Lisp。

Scheme遵循极简主义哲学,以一个小型语言核心作为标准,加上各种强力语言工具(语法糖)来扩展语言本身。

MIT曾用Scheme作为计算机系入门课程的编程语言。计算机程序语言界著名的魔法书《计算机程序的构造和解释》(又称SICP)正是利用Scheme来解释程序设计。

历史悠久的Scheme依然活跃,拥有针对各种计算机平台和环境的实现,例如Racket、Guile、MIT Scheme、Chez Scheme等。Guile是GNU工具体系里最重要的部件之一,被许多自由软件和开源软件作为内置脚本语言使用。

历史与特点:

Lisp 语言历史悠久,在计算机程序语言里,年龄仅次于Fortran。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算,由MIT 的John McCarthy于1960年开发出了Lisp (list processing)语言。该语言起初为表处理而设计,后来广泛用于人工智能。Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现了递归。1994年时众多Lisp版本得到了相当的统一,统一之后的版本称为Common LISP。Common Lisp带有庞大的函数库,语言的规范长达千页以上,包括面向对象的 CLOS。

Scheme语言的规范很短,总共只有50页,甚至连Common Lisp 规范的索引的长度都不到,但是却被称为是现代编程语言王国的皇后。它与以前和以后的 Lisp 实现版本都存在一些差异。现特征如下:

(1)括号嵌套:Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号体现了最基本的数学思想——递归。

(2)语法简洁:Scheme语言的规范很短,总共只有50页。

(3)函数编程语言

一个函数(Function)是这个编程语言中所谓的第一等的公民。也就是说函式可以像一个 int 或者 float 一样被很方便的传递来传递去。这也就是所谓“Functional编程语言”中,Functional 一词的由来。

(4)自动内存管理

(5)支持尾递归:提高了递归效率

(6)continuation

(7)可移植性好

Scheme开发的程序有很好的可移植性,这是由于Scheme在不同的计算机平台有相应的解释器和编译器。

(8)脚本语言

由于scheme语法简洁,一个Scheme解释器可以非常的小巧。Scheme可以作为脚本语言而内嵌于一些工具之中。

(9)数据结构

I.数字

下面都是合法的数字表示方法:47,1/3,2.3,4.3e14,1+3i。

II.字符

字符前面需要用#\做前缀。如下面都是合法字符:#\a #\A #\b #\B #\space #\newline

III.字符串:由双引号括起来的字符组成字符串。如:"A little string"

IV布尔值:布尔值True和False分别用 #t 和 #f 表示。

V.列表:用圆括号括起来的,可以包含任何数据类型的称为列表。如:(a little (list of) (lists))

VI.数组(vector):用#为前缀,如:#(1 2 "string" #\x 5)

VII.函数(或称为过程):把函数作为一种数据类型,是包括Scheme语言在内的Lisp的特色。

VIII.符号

符号除了不能够以数字开头的任何字符可组成符号。如:Symbols: this-is-a-symbol foo a32 c$23*4&7+3-is-a-symbol-too!

IX.注释 分号开始一行注释。 如:(+ 3 1) ;return 4

Scheme应用实例

今天小编给大家讲解的这个例子是关于shareinstall的。我们知道,Shareinstall其实是一个APP的推广辅助工具,它主要的作用就是进行渠道统计。另外,它还提供了免填二维码、一键跳转、自动渠道打包、自动建立社区关系等功能。而scheme语言主要应用在一键跳转功能上。

以IOS SDK为例,ShareInstall通过标准的scheme、universal link等技术,在app安装的情况下,从各种浏览器(微信、QQ、新浪微博、钉钉等主流社交软件的内置浏览器)唤醒 app 并传递自定义参数,避免重复安装。

我们可以从universal link配置作为载体,去观察scheme的活跃性。如下:

Universal link是iOS9的一个新特性,通过Universal link,App可以通过各种浏览器跳转到App(例如微信内可不通过safari,一键跳转到App),真正实现一键跳转到相应界面。 备注:iOS9以上推荐使用Universal link。

(1)配置developer.apple.com的相关信息 

到苹果开发者中心,为当前的App ID开启Associated Domains服务: 

(2)配置Xcode

在Xcode中配置ShareInstall为当前应用生成的关联域名:Associated Domains 开关打开,添加 Domains:applinks:f6bkarebhf22eb.shareinstall.com

 在AppDelegate中的continueUserActivity方法中调用,用来处理Universal link。

//Universal Links 通用链接
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    //判断是否通过ShareInstall Universal Links 唤起App
    if ([ShareInstallSDK continueUserActivity:userActivity]) {
        return YES ;
    }else{
        //其他代码
        return YES;
    }
}

(3)配置App的URL Scheme

iOS系统中App之间是相互隔离的,通过URL Scheme, App之间可以相互调用,并且可以传递参数。 备注:iOS9以下通过Url Scheme实现拉起。

(4) 在Xcode里选中Target—Info—URL Types, 配置shareInstall为当前应用生成的Url Scheme,如图所示:

identifier 配置为 com.ShareInstall,URL Schemes从shareInstall获取(dekf0466)。 注:identifier 一定要配置为com.ShareInstall 

(5) URL Scheme相关代码配置

注意:当需要在shareInstall这个方法中处理第三方回调的时候(比如支付宝、微信回调等),请注意区分。

//iOS9以下 URI Scheme
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

    //判断是否通过ShareInstall URL Scheme 唤起App
    if ([ShareInstallSDK handLinkURL:url]) {
         return YES;
    }else{
        //其他代码
        return YES;
    }

    return YES;
}

//iOS9以上 URL Scheme
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(nonnull NSDictionary *)options
{
    //判断是否通过ShareInstall URL Scheme 唤起App
    if ([ShareInstallSDK handLinkURL:url]) {

        return YES;
    }else{
        //其他代码
        return YES;
    }

    return YES;
}

(6)获取唤醒参数,直达具体页

通过在url中附带具体的参数,唤醒app并跳转到具体页。

- (void)getWakeUpParamsFromSmartInstall: (id) params withError: (NSError *) error{
NSLog(@"唤醒参数params=%@",params);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL shceme 进来的" message:[self DataTOjsonString:params] delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
//弹出提示框(便于调试,调试完成后删除此代码)
[alert show];
}

(7) 其他代码配置

如果做测试,获取参数,则必须在Appdelegate.h加上如下测试代码。

#pragma mark 将oc数据类型转成NSString
-(NSString *)DataTOjsonString:(id)object
{
    if (!object) {
        return null;
    }

    NSString *jsonString = null;
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object
                                                       options:NSJSONWritingPrettyPrinted
                                                         error:&error];
    if (! jsonData) {
        NSLog(@"Got an error: %@", error);
    } else {
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    return jsonString;
}

一键跳转的优势

通过 URL Scheme 和 Universal Links 实现了在不同浏览器中拉起APP。这样Shareinstall SDK就减少了应用的代码冗余,提供了通用的一键拉起接口,使用户有了更加舒适的体验,同时给移动开发者对自己产品的管理和推广,也提供了便利。

 

你可能感兴趣的:(什么是Scheme?原来还可以这样应用!)