自定义URL Scheme完全指南

iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用。

注册自定义 URL Scheme

 

注册自定义 URL Scheme 的第一步是创建 URL Scheme — 在 Xcode Project Navigator 中找到并点击工程 info.plist 文件。当该文件显示在右边窗口,在列表上点击鼠标右键,选择 Add Row:

 

向下滚动弹出的列表并选择 URL types。

 

 

点击左边剪头打开列表,可以看到 Item 0,一个字典实体。展开 Item 0,可以看到 URL Identifier,一个字符串对象。该字符串是你自定义的 URL scheme 的名字。建议采用反转域名的方法保证该名字的唯一性,比如com.yourCompany.yourApp。

 

 

点击 Item 0 新增一行,从下拉列表中选择 URL Schemes,敲击键盘回车键完成插入。

 

 

注意 URL Schemes 是一个数组,允许应用定义多个 URL schemes。

 

 

展开该数据并点击 Item 0。你将在这里定义自定义 URL scheme 的名字。只需要名字,不要在后面追加 :// — 比如,如果你输入 iOSDevApp,你的自定义 url 就是 iOSDevApp://

 

 

此时,整个定义如下图:

 

 

虽然我赞同 Xcode 使用描述性的名字的目的,不过看到创建的实际的 key 也是非常有用的。这里有一个方便的技巧,右键点击 plist 并选择 Show Raw Keys/Values,就能看到以下效果:

 

 

还有另一种有用的输出格式,XML,因为可以非常容易的看到字典和原始数组及其包括的实体的结构。点击 plist 并选择 Open As – Source Code:

 

 

从 Safari 中调用自定义 URL Scheme

 

定义了 URL scheme,我们可以运行一个快速测试来验证应用是否如我们所期望的被调用。在这之前,我创建了一个准 UI 以辨别带有自定义 URL 的应用。该应用只有一个 UILabel,带有文本 “App With Custom URL”。下载源代码(http://iosdevelopertips.com/downloads/#customURLScheme)

 

 

使用模拟器调用应用的步骤:

 

  • 在 Xcode 中运行应用

  • 一旦应用被安装,自定义 URL scheme 就会被注册

  • 通过模拟器的硬件菜单中选择 Home 来关闭应用

  • 启动 Safari

  • 在浏览器地址栏输入之前定义的 URL scheme(如下)

 

 

此时 Safari 将会关闭,应用会被带回到前台。祝贺你刚刚使用自定义 URL scheme 调用了一个 iPhone 应用。

 

从另一个 iPhone 应用中调用自定义 URL Scheme

 

让我们看看如何从另一个应用中调用自定义 URL scheme。我又创建了一个非常简单的 iPhone 应用,它只有一个 UILabel 和一个 UIButton — 前者显示了一段信息,告诉你这个应用将要通过自定义 URL scheme 来调用另一个应用,按钮则开始这个行为。下载源代码(http://iosdevelopertips.com/downloads/#customURLScheme)

 

 

buttonPressed 方法中的代码处理 URL 调用:

 

- (void)buttonPressed:(UIButton *)button

{

  NSString *customURL = @"iOSDevTips://";

 

  if ([[UIApplication sharedApplication]

    canOpenURL:[NSURL URLWithString:customURL]])

  {

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];

  }

  else

  {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"

                          message:[NSString stringWithFormat:

                            @"No custom URL defined for %@", customURL]

                          delegate:self cancelButtonTitle:@"Ok"

                          otherButtonTitles:nil];

    [alert show];

  }

}

 

第5行代码检查自定义 URL 是否被定义,如果定义了,则使用 shared application 实例来打开 URL (第 8 行)。openURL:方法启动应用并将 URL 传入应用。在此过程中,当前的应用被退出。

 

通过自定义 URL Scheme 向应用传递参数

 

有时你需要通过自定义 URL 向应用中传递参数。让我们看看该如何完成这个工作。

 

NSURL 作为从一个应用调用另一个的基础,遵循 RFC 1808(https://tools.ietf.org/html/rfc1808) (Relative Uniform Resource Locators) 标准。 因此你所熟悉的基于网页内容的 URL 格式在这里也适用。

 

在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法:

 

- (BOOL)application:(UIApplication *)application

  openURL:(NSURL *)url

  sourceApplication:(NSString *)sourceApplication

  annotation:(id)annotation

 

从一个应用传递参数到另一个的诀窍是通过 URL。例如,假设我们使用以下的 URL scheme,想传递一个名为 “token”的参数和一个标识注册状态的标志,我们可以像这样创建一个 URL:

 

NSString *customURL = @"iOSDevTips://?token=123abct&registered=1";

 

在 web 开发中,字符串 ?token=123abct&registered=1 被称作查询询串(query string)。

 

在被调用(设置了自定义 URL)的应用的 app delegate 中,获取参数的代码如下:

 

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

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

{

  NSLog(@"Calling Application Bundle ID: %@", sourceApplication);

  NSLog(@"URL scheme:%@", [url scheme]);

  NSLog(@"URL query: %@", [url query]);

 

  return YES;

}

 

以上代码在应用被调用时的输出为:

 

 

Calling Application Bundle ID: com.3Sixty.CallCustomURL

URL scheme:iOSDevTips

URL query: token=123abct&registered=1

 

注意 “Calling Application Bundle ID”,你可以用这个来确保只有你定义的应用可以与你的应用直接交互。

 

让我们改变一下代码,来验证发起调用的应用的 Bundle ID 是否合法:

 

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

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

{

  // Check the calling application Bundle ID

  if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"])

  {

    NSLog(@"Calling Application Bundle ID: %@", sourceApplication);

    NSLog(@"URL scheme:%@", [url scheme]);

    NSLog(@"URL query: %@", [url query]);

 

    return YES;

  }

  else

    return NO;

}

 

有一点要特别注意,你不能阻止其他应用通过自定义 URL scheme 调用你的应用,然而你可以跳过后续的操作并返回 NO,就像上面的代码那样。也就是说,如果你想阻止其它应用调用你的应用,创建一个与众不同的 URL scheme。尽管这不能保证你的应用不会被调用,但至少大大降低了这种可能性。

 

转载于:https://www.cnblogs.com/YanPengBlog/p/5719374.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6 音频格式—— AAC

目录 前言 01 AAC是什么? 02 为什么需要进行AAC进行音频压缩处理? 03 AAC的特点以及优势 04 AAC格式详解: 4.1. ADIF的数据结构: 4.1.1 ADIF Header具体的表格: 4.2. ADTS的结构(重点): …

Android开发笔记——ListView模块、缓存及性能

ListView是Android开发中最常用的组件之一。本文将重点说明如何正确使用ListView,以及使用过程中可能遇到的问题。 ListView开发模块图片缓存可能遇到的问题一、ListView开发模块 从项目实践的角度来看,ListView适合“自底向上”的开发模式,即…

python实现excel筛选功能并输出_python如何实现excel按颜色筛选功能

离岛 2020-07-09 09:37 已采纳 不太了解具体需求,提供一些示例代码和思路供你参考: 整体思路:首先已知excel中的颜色值,根据编码实现颜色筛选的功能 示例: 1、首先安装pip install openpyxl 2、示例代码可以获取Excel中…

C学习杂记(七)extern声明可省略变量类型

工作三年,看C的书也不少。第一次知道extern可以省略变量类型。 b.c有一个全局变量unsigned int data_length,a.c想要调用它,通常使用: extern unsigned int data_length; 在声明时可以把外部变量类型去掉:extern da…

linux 内存取证_【取证流程】电子数据证据远程勘验

原创:弘连网络电子数据证据远程勘验在日常的取证工作中必不可少,但由于存在信息安全差、数据可能被篡改的问题。取证过程中,有明确的取证要求来确保取证过程的规范显得至关重要,今天我们就一起来回顾下遇到远程勘验的取证场景&…

python2 print_Python2和Python3中print的不同点

在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异 主要体现在以下几个方面: 1.python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构; 2.Python2打印时可以不加括号&#xff…

java 与 c#的 中 字符串比较“==”与“equals”的差异

.net中,其字符串特有的驻留机制,保证了在同一进程中,相同字符序列的字符串,只有一个实例,这样能避免相同内容的字符串重复实例化,以减少性能开销。 先来回顾一下c#中的代码: public static void…

visual studio 2019 未能在命名空间“System.IO.Ports”中找到类型名“SerialPort”

在vs2019以前的版本,只要using System.IO.Ports就可以用SerialPort。 这里需要自己手动添加相关引用。 工具–>Nuget包管理器(N)–>管理解决方案的Nuget程序包(N) –>浏览,左边搜索SerialPort 右…

python开发环境功能介绍_第一模块 第3章 Python介绍与环境配置

python入门(全为重点) 1. 编程语言介绍 编程语言分类、总结 2. python介绍 3. 解释器多版本共存 4. 运行python程序的两种方式 5. 一个python程序运行的三个步骤(******) 6. 注释 7. IED集成开发环境 3.1 编程语言分类之低级语言 这里的高级/低级指的是离…

用WPF做关于MEF 简单学习记录

写在前面:下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.html和http://www.cnblogs.com/yunfeifei/p/3922668.html两位大神的文章里学到的,特别鸣谢!整理下是更大一方面是对自己知识的梳理,用词用句不够准确&#…

C排序算法:(一)直接排序

最简单的排序方法。 如果从大到小排序&#xff0c;那么从[0]元素开始&#xff0c;和后面的元素进行对比&#xff0c;如果后面元素大&#xff0c;则和[0]元素交换。 核心思想&#xff1a;选定基准元素&#xff0c;和其他元素对比。 #include <stdio.h>unsigned char buff…

c语言 链表_C语言编程第22讲——单向有序链表的C语言实现

1、单向有序链表的含义单向有序链表可以解析为四个名词&#xff1a;表&#xff1a;一组元素&#xff1b;链表&#xff1a;表中的元素不是从前往后一个挨着一个&#xff0c;而是通过一个元素才能找到另一个元素&#xff1b;单向&#xff1a;表中的元素只能从前往后访问&#xff…

C排序算法:(二)冒泡排序

冒泡排序就是从左至右比较相邻的两个数值大小&#xff0c;如果右侧的数值较小&#xff0c;则交换两个数值的位置&#xff0c;较大的数值就会像泡泡一样一路向右漂浮。 #include <stdio.h>//small to big void Bubble_Sort(unsigned char *input_data, unsigned int inpu…

pythonturtle画点的指令_简述python的turtle绘画命令及解释

一 基础认识 turtle库是python的标准库之一&#xff0c;它是一个直观有趣的图形绘制数据库&#xff0c;turtle(海龟&#xff09;图形绘制的概念诞生1969年。它的应用十分广&#xff0c;而且使用简单&#xff0c;只要在编写python程序时写上import turtle即可。 1.绘图窗口设置命…

OpenGL ES一些函数详解(一)

glLoadIdentity和glMultMatrix glLoadIdentity的作用是将当前模型视图矩阵转换为单位矩阵&#xff08;行数和列数相同的矩阵&#xff0c;并且矩阵的左上角至右下角的连线上的元素都为1&#xff0c;其它元素都为0&#xff09;&#xff0c;这样可以方便矩阵的乘法运算。 glMultMa…

C排序算法:(三)插入排序

像打扑克牌一样&#xff0c;每次摸一张牌&#xff0c;把牌插入正确位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

LeetCode Binary Tree Paths(简单题)

题意&#xff1a;   给出一个二叉树&#xff0c;输出根到所有叶子节点的路径。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判断是否到达了叶子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

新唐M0 KEIL环境搭建,找不到device不识别,关键:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;网上关于新唐的资料相对ST确实少得可怜&#xff0c;搭建环境也是搞了好久&#xff0c;去keil官网下载安装了新唐的pack 打开官方参考工程还是提示找不到device&#xff0c;option里面也没有识别出来。 百度了好久&#xff0c;尝试了各种办法&…

c语言有趣代码_【新课预知】——C语言程序设计

编者按&#xff1a;如今疫情这么严重&#xff0c;为了保护好自己&#xff0c;为了身边的人&#xff0c;大家可一定要听从国家号召——“宅”起来&#xff01;并且&#xff0c;小编们为了让大家伙“宅”得更加健康&#xff0c;可是费了不少脑筋呢&#xff0c;学哉数理公众号首次…

用R语言的quantreg包进行分位数回归

什么是分位数回归 分位数回归(Quantile Regression)是计量经济学的研究前沿方向之一&#xff0c;它利用解释变量的多个分位数&#xff08;例如四分位、十分位、百分位等&#xff09;来得到被解释变量的条件分布的相应的分位数方程。 与传统的OLS只得到均值方程相比&#xff0c;…