一直都有接触要设置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. rmmod: can't change directory to “3.4.79+”,no such file or directory

    直接在/lib/modules目录下,在该目录下建立3.4.79+这个文件夹即可

  2. 邻面合并(merging)

    邻面合并(merging) 题目描述 给定一个N×MN×M的网格,每个格子上写有0或1.现在用一些长方形覆盖其中写有1的格子,长方形的每条边都要与坐标轴平行.要求:每个写着1的格子都要被覆盖,长方形不 ...

  3. Android使用圆角

    圆角Button 效果图 绿色Button 定义button_green.xml资源文件位于drawable文件夹下,可用作button的background属性 button_green.xml: ...

  4. StringTokenizer:字符串分隔用法简介

    StringTokenizer:字符串分隔解析类型 属于:java.util包. 1.构造函数. 1. StringTokenizer(String str) :构造一个用来解析str的StringT ...

  5. sokect数据压缩实现

    上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情况下需要把数据对象进行压缩然后在传输,此时就需要压缩这些对象流,此时就 可以GZIPInputSt ...

  6. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---31

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  7. 《手把手教你学C语言》学习笔记(7)---程序的输入与输出

    程序设计中,为了观察程序的运行状态和结构,需要输出指定的内容:为了让程序能够更加灵活,可以根据需求输入内容,让计算机处理和运行:所以程序的输入输出就显的尤为重要.主要包括printf和scanf函数. ...

  8. getchar吸收回车

    #include "stdio.h" int main() { int a; char b,c; scanf("%d",&a); c = getchar ...

  9. springBoot 快捷键

    设置idea导入包 勾选标注 2 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化导入的包,比如自动去掉一些没有用到的包. 勾选标注 1 选项,IntelliJ IDEA 将在我 ...

  10. Netty内存池

    参考资料:http://blog.csdn.net/youaremoon/article/details/47910971 主要思想:buddy allocation,jemalloc