一直都有接触要设置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. 使用 Python 获取 Linux 系统信息

    探索platform模块 platform模块在标准库中,它有很多运行我们获得众多系统信息的函数.让我们运行Python解释器来探索它们中的一些函数,那就从platform.uname()函数开始吧: ...

  2. hihoCoder 1133 二分·二分查找之k小数(TOP K算法)

    #1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很 ...

  3. mongodb学习(3)--- NodeJs使用mongoose操作mongodb

    转载: https://cnodejs.org/topic/50c145ed637ffa4155c7eaee 首先对于以下错误说明(有写 db.close): Error: db object alr ...

  4. JavaScript中in的用法

    JavaScript中的in 操作符是对Object(对象)操作的,并不是针对数组. in 的右边必须是对象变量 例如:var data = {id:1, name:'AAA'};if('name' ...

  5. HDU3001 Travelling

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  6. 【HDOJ5532】Almost Sorted Array(签到)

    题意:给定一个n个数的数列,问删掉一个数之后剩余部分是否可以单调不增或单调不减 n<=1e5,a[i]<=1e5 思路:预处理一下前后缀是否合法 #include<cstdio> ...

  7. js,add script async? loaded ok.

    function loadScript(url, callback){ var script = document.createElement_x("script") script ...

  8. 关于mysql编码问题

    1 查看MySQL编码 SHOW VARIABLES LIKE 'char%';

  9. python fromkeys的坑

    有个不定长的列表,想把列表中的每个值当做字典的key, 初始值为空列表,于是想到了fromkeys这个方法 In [337]: l = ['a','b','c'] In [338]: res = di ...

  10. ngrx/store effects 使用总结2:列表展示

    第一个计数器案例:http://www.cnblogs.com/axel10/p/8589122.html 完成了计数器案例后,现在开始比较能够完整的展示angular2+开发流程的案例:在线获取用户 ...