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
今天小编给大家讲解的这个例子是关于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就减少了应用的代码冗余,提供了通用的一键拉起接口,使用户有了更加舒适的体验,同时给移动开发者对自己产品的管理和推广,也提供了便利。