URL Scheme与openURL

URL Schemes

URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。

设置一个URL Schemes:选中App工程->Info->URL Types里添加,可以添加多个。

在Info.plist里是这样的:

打开App的代码是这样的:

1 NSURL *url = [NSURL URLWithString:@"testapp://"];
2 [[UIApplication sharedApplication] openURL:url];

如果两个应用有URL Schemes是相同的,后安装的应用的URL Schemes会把早安装的应用的URL Schemes覆盖掉。

在safari中打开

注册了URL Schemes的应用,用safari浏览器也是可以打开的。用这个可以来验证应用是否设置了想要的URL Schemes
方法:直接在safari的地址栏输入testapp://, enter就可以打开了

canOpenURL

canOpenURL方法判断能否打开这个url,然后再用openURL方法打开该URL的。这样可以带来更好的用户体验。

1 if ([[UIApplication sharedApplication] canOpenURL:url]) {
2         [[UIApplication sharedApplication] openURL:url];
3 }

iOS9的时候苹果加强了权限,只有在info.plist文件中加入了URL Schemes白名单才能使用canOpenURL:方法来判断是否能打开该url。该白名单的上限是50个。

白名单在这添加(图中是接入FacebookSDK后添加的项):

对应的Info.plist:

使用URL Schems传递数据

URL Schemes除了可以用来打开APP之外,还可以用来在两个App之间传递少量的数据。

1 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
2
3 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
4
5 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can‘t open for some reason

url可以这么写:testapp://www.abc.com/abc?title=hello&content=helloworld,以上三个方法的url就会接收到后面的参数信息,这样就实现了app间的数据传递。

以下是这三个回调的区别:

  • 3个回调的功能基本一样,都是在别人通过URL Schemes打开应用的时候会执行的。
    不同之处:
  • A回调是在iOS2.0的时候推出的,参数只有url
  • B回到是在iOS4.2的时候推出的,参数有url sourceApplication annotation.
  • C回调是iOS9.0的时候推出的,参数有url optionsoptions有下面几个key
    // Keys for application:openURL:options:
    UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsSourceApplicationKey NS_AVAILABLE_IOS(9_0);   // value is an NSString containing the bundle ID of the originating application
    UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsAnnotationKey NS_AVAILABLE_IOS(9_0);   // value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController‘s annotation property
    UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsOpenInPlaceKey NS_AVAILABLE_IOS(9_0);   // value is a bool NSNumber, set to YES if the file needs to be copied before use
  • 这几个回调是有优先级的。C>B>A。也就是说,如果你3个回调都实现了,那么程序只会执行C回调。其他回调是不会执行的。(当然,iOS9以下只会执行B回调)。

最后,在接入多个sdk的时候,sdk之间可能会重写openurl方法,可能会导致A把B盖住了,B的openurl回调再也调用不起来。

举个例子,项目接入了shareSDK和facebookSDK,就发现facebookSDK的登录回调一直拉不起来。

如何验证这一点,可以在回调处打断点,如下图:

如果根本断不到,多半就是被别的干掉了,搜下项目里还有没有类似的AppController里也实现了这个函数,看看别的sdk是怎么干掉的,要么做取舍,要么花力气做兼容。

整理自(http://www.jianshu.com/p/0811ccd6a65d),与自己趟坑的一些体会。

时间: 2024-10-19 14:26:25

URL Scheme与openURL的相关文章

Xcode6.4注册URL Scheme步骤详解

URL Scheme的作用 我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的.但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的.我们可以通过系统的OpenURL来打开该app,并可以传递一些参数. 例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝.如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载

通过注册的URL Scheme向目标APP传递参数

通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了. 昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法: - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url { // 接受传过来的参数 NSSt

iOS App 自定义 URL Scheme 设计(转自COCOACHINA)

在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个程序. 例如在 iPad 上浏览网页,并且 iPad 已经安装了 淘宝 HD,那么就打开下面这个链接就会在淘宝 HD 中查看这个商品的详细信息,也可以方便的使用淘宝 HD 进行购买.收藏等操作. 在淘宝 HD 中查看商品“2012西藏卓明谷方舟登舰卡(船票)” 当然,如果你在 Mac OS X 中打

URL Scheme的作用是应用间调用

URL Scheme的作用 我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的.但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的.我们可以通过系统的OpenURL来打开该app,并可以传递一些参数. 例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝.如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载

【转】通过自定义的URL Scheme启动你的App

http://blog.csdn.net/ba_jie/article/details/6884818原文地址:http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html 添加一个叫URL types的键值. 给其下的Item 1添加一个URL identifier,格式为Reverse Domain Name:com.mycompany.myapp. 再加一个U

IOS之URL Scheme的使用

本文转载自(下载示例代码请打开第一个链接): http://www.cocoachina.com/industry/20140522/8514.html http://blog.csdn.net/wbw1985/article/details/26264029 1 URL Scheme是什么 与Android的URL Scheme类似,是为方便app之间互相调用而设计的.你可以通过一个类似URL的链接,通过系统的OpenURL来打开该app,并可以传递一些参数.每个URL必须能唯一标识一个APP

自定义URL Scheme完全指南

iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme 注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件.当该文件显示在右边窗口,在列表上点击鼠标右键,选择 Add Row: 向下滚动弹出的列表并选择 URL types. 点击左

iOS不同应用切换中URL Scheme的使用介绍

URL Scheme是iOS SDK提供给开发者的通过URL打开系统或第三方应用的方式,iOS开发中常见的几种需求,比如分享到微信微博,或调用支付宝支付之类的调用其他应用,以及调用完后,第三方应用对自己的回调都需要用到URL Scheme的知识,关于URL Scheme有这么几点需要了解 一.怎么通过一个应用的URL Scheme打开对应应用的对应页面 从一个应用切换到另一个应用所调用的关键方法是UIApplication的单例方法openURL: UIApplication.sharedApp

url scheme系列一----基本使用

url scheme是什么,能做什么? url cheme,用于两个独立的App之间,让A应用能够打开B应用 A应用打开B应用时,告诉B应用当前这个传入的scheme要干什么,所需要的参数 URL Schemes 是一个数组,允许应用定义多个 URL schemes ,每一个scheme对应不同的业务操作 url scheme操作步骤一.根据要调用的App规定的scheme和参数格式进行拼接,最终打开的url /** * 生成完整的 scheme url */ - (NSString*)_gen