一直都有接触要设置app的url scheme,从最早的facebook開始。

当时的理解是SSO用的,当授权成功之后,facebook app或者safari能够利用给定的url scheme来回调程序。依照Facebook dev页的指南,在Info.plist中增加url scheme。


怎样在info.plist中增加url scheme

直接将info.plist用源代码打开,增加例如以下代码:

<key>CFBundleURLTypes</key>

   <array>

       <dict>

           <key>CFBundleURLName</key>

           <string>com.xxxx.xxxx</string>

           <key>CFBundleURLSchemes</key>

           <array>

               <string>yourURLScheme</string>

           </array>

       </dict>

   </array>

当然也能够在xCode中增加URL Type的row,只是遇到过xCode不自己主动提示补全,自己写的话,会无效,所以还是比較信任源代码~

直接在xCode中操作加入URL Types

再后来xCode的project属性Info页签以下有专门的URL Types条目加入URL Types。在Identifier中填入BundleID,URL Schemes中填入相应的Scheme。


Scheme的作用在之前facebook的使用中已经领悟了一部分,可是还有其它强大的功能,比方你想要在iOS设备的safari中输入一个URL(后面你会知道。就是你自定义的URL Schemes)就能直接打开你的设备。就和启动众多系统应用一样!

!没错,你的DIAO丝程序也能像挂着苹果老爹光环的“高帅富”应用一样启动。

系统URL Schemes

Stock

Some of these URL schemes doesn't work anymore in the latest iOS. Let's hope they get reintroduced.

itms-apps:// – Open the App Store

maps:// – Open the Maps app

sms:// – Open the compose window of the Messages app

music:// – Go to the currently playing song in the Music app

youtube:// – Open the YouTube app

itms-books:// – Open the iBooks app

facetime://

prefs:root=General&path=Bluetooth

prefs:root=General&path=AUTOLOCKS

prefs:root=NOTIFICATIONS_ID

prefs:root=General&path=USAGE

prefs:root=General&path=Bluetooth

prefs:root=AIRPLANE_MODE

prefs:root=Brightness

prefs:root=Wallpaper

prefs:root=INTERNET_TETHERING

prefs:root=CASTLE

prefs:root=CASTLE&path=STORAGE_AND_BA

prefs:root=General&path=About

prefs:root=General&path=USAGE/CELLULAR_USAGE

prefs:root=MUSIC&path=EQ

prefs:root=General&path=Network

prefs:root=LOCATION_SERVICES

prefs:root=Phone&path=CallerID

prefs:root=Phone&path=CallForwarding

prefs:root=Safari

prefs:root=General&path=Assistant

prefs:root=General&path=Keyboard

prefs:root=Sounds

prefs:root=General&path=Network/VPN

prefs:root=WIFI


想要实现上面的功能,在应用中只增加scheme是不够的,还须要针对该scheme做相应的处理,有点类似广播通讯的原理,输入scheme后发出广播。你须要写接收该广播以及处理的代码。

  1. 不要实现applicationDidFinishLaunching:方法
  2. 实现application:didFinishLaunchingWithOptions:方法。并在当中检查url。假设能处理该url则返回YES。否则不做处理返回NO。
  3. 实现application:handleOpenURL:,处理url。成功返回YES,否则返回NO。

在iOS4中。URL分下面两种方式传入app中

  1. 假设是启动程序。则application:didFinishLaunchingWithOptions:被运行,返回YES当且仅当application:handleOpenURL:运行返回YES。

  2. 假设程序由后台挂起变为活动。则application:didFinishLaunchingWithOptions:不会被运行,可是application:handleOpenURL:会被运行。


处理代码例如以下:

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

   NSLog(@"%@", [url absoluteString]);

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

       return YES;

   }

   return NO;

}



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

   ...

   NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];

   if ([self application:application handleOpenURL:url]) {

       return YES;

   }

   return NO;

// End of application:didFinishLaunchingWithOptions:

注意:

在iOS4.2之后,application:handleOpenURL:将被DEPRECATED

能够使用

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

       sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

sourceApplication

The bundle ID of the application that is requesting your application to open the URL (url).

sourceApplication即为调用者发送给接收者的Bundle ID,比方MobileSafari就是com.apple.mobilesafari

annotation

A property-list object supplied by the source application to communicate information to the receiving application.

调用者发给接收者的plist对象


假设该程序没有被安装。那么在Safari中打开我们希望能跳转到下载界面。须要实现这个功能,我们能够利用JS的window.location和setTimeout函数。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<body>

<script>

window.location = "URL Scheme:";

setTimeout( function(){ window.location="http://App Store地址";   } , 1500);

</script>

</body>

</html>

将该代码保存为index.html。放于站点上,利用Safari打开该文件。则可以实现假设安装了该应用,则打开。否则可以直接跳转到App Store的App下载页面。

注意

JS中的URL Scheme不要包括非转义字符,比方'-./'等,假设有非转义字符则须要转义后输入到Safari,直接在Safari中输入URL Scheme打开应用,假设提示

Safari打不开该网页,由于这是一个本地文件

那么非常有可能由于你的URL Scheme中包括了非转义字符,最好全为英文字母数字最好。

代码怎样调用

     NSURL *url = [NSURL URLWithString:@"URL Scheme://"];

[[UIApplication sharedApplication] openURL:url];

iOS的URLScheme的更多相关文章

  1. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  2. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  3. 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析

    作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...

  4. IOS开发基础知识--碎片32

    1:动画属性UIViewAnimationOptions说明 a:常规动画属性设置(可以同时选择多个进行设置) UIViewAnimationOptionLayoutSubviews:动画过程中保证子 ...

  5. iOS界面跳转的一些优化方案

    原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...

  6. (iOS)项目总结-项目中遇到的各种的问题和解决方法

    前言: 一到公司报道那时,便着手独立的去完成了一个项目,其中的辛酸泪也是不足为外人道也.这次算是一个新型的app,仍然是独立开发,但心境和想法却是完全的不同.下面说一次以前做开发时常常忽略的知识,也算 ...

  7. Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)

    下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableVie ...

  8. 史上最全的常用iOS的第三方框架

    文章来源:http://blog.csdn.net/sky_2016/article/details/45502921 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片 ...

  9. 常用iOS的第三方框架

    图像:1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等 ...

随机推荐

  1. 【bzoj2127】happiness 网络流最小割

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  2. sql 学习相关问题

    ---恢复内容开始--- 1.sql上面改变列的数据类型是 ALTER TABLE table_nameALTER COLUMN column_name datatype mysql上面是ALTER ...

  3. pat 团体天梯赛 L3-010. 是否完全二叉搜索树

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  4. CodeForces Round #402 (Div.2) A-E

    2017.2.26 CF D2 402 这次状态还算能忍吧……一路不紧不慢切了前ABC(不紧不慢已经是在作死了),卡在D,然后跑去看E和F——卧槽怎么还有F,早知道前面做快点了…… F看了看,不会,弃 ...

  5. 【CodeChef】PARADE(费用流,最短路)

    题意: 思路: #include<cstdio> #include<iostream> #include<algorithm> #include<cstrin ...

  6. 关于Struts2中param的作用

    1.页面传参与配置传参的区别: 如果页面Form表单的参数在Action类中有相应的setter方法,则会优先取页面Form表单传过来的值,如果页面没有该属性同名的参数,则会从配置文件中取同名的参数值 ...

  7. 使用layer的iframe层提交表单后,需要关闭当前的iframe层,然后刷新父页面的方法2

    <input type="button" onclick="edit(${it.id?c})" class="layui-btn layui-b ...

  8. bytearray和file的后端上传方式

    public static String readAndUpload(String serverpath,String imgid) { if(serverpath==null){ serverpat ...

  9. Mysql varchar长度问题

    http://dinglin.iteye.com/blog/914276 http://www.cnblogs.com/fakis/archive/2011/03/07/1976532.html   ...

  10. addEventListener与attachEvent

    一.attachEvent和addEventListener (一)addEventListener addEventListener() 方法用于向指定元素添加事件句柄.使用 removeEvent ...