iOS App 唤醒另一个App

网上也有讲这块的,感觉讲得都不是很好。而且有一些细节根本没有讲清楚。这里重写整理一下相关知识点。

主要内容

  • URL Scheme 是什么?
  • 项目中关键的配置
  • 注意事项

URL Scheme 是什么?

iOS有个特性就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme用于从浏览器或其他应用中启动本应用。常见的分享到第三方之间的跳转都是基于Scheme的。

通过对比网页链接来理解iOS 上的 URL Schemes,应该就容易多了。

  • URL,我们都很清楚,http://www.apple.com就是个URL,我们也叫它链接或网址;
  • Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 ://之前的那段字符。比如 http://www.apple.com这个网址的Schemes是 http

根据我们上面对URL Schemes的使用,我们可以很轻易地理解,在以本地应用为主的 iOS 上,我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该这个应用的URL 的 Schemes 部分,也就是开头儿那部分。比如短信,就是 sms:

你可以完全按照理解一个网页的 URL ——也就是它的网址——的方式来理解一个 iOS 应用的 URL,拿苹果的网站和 iOS 上的微信来做个简单对比:

  网页(苹果) iOS 应用(微信)
网站首页/打开应用 http://www.apple.com weixin://
子页面/具体功能 http://www.apple.com/mac/(Mac页面) weixin://dl/moments(朋友圈)

关于基础概念性的就讲这么多

项目中关键的配置

在项目InfoUrl Type中配置(被唤起端

Url Type,表示可以被哪些带前缀Url打开,而不是可以打开以这些前缀开头的app。

  • 说明

    • URL identifier只是一个标示符,随意填写,建议写成:com.*.*反转域名的方法保证该名字的唯一性。
    • URL Scheme就是你用来通信的命令前缀,用来定位一个应用。

Plist文件中配置

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

    接收到唤起如何处理

在代理方法- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation中判断唤起的来源source app,根据Url所携带的参数进行不同的操作。比如跳转到制定的页面,相关的逻辑处理等等.

- (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]); // Customer Codereturn YES;
}

以上配置是在被唤起应用中配置的。

唤起端

一般情况下,唤起端可以直接调用appDelegate的代理方法去唤醒其他应用。

- (void)awakeOtherApp
{ NSString *customURL = @"otherApp://"; 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]; }
}
  • 这里需要注意一下在iOS9以后,唤起端需要配置一下

LSApplicationQueriesSchemes.iOS9之后需要,iOS9之后提高了app的安全性,需要给出一个类似白名单的东西,在白名单里面的才能打开app。不然报错: -canOpenURL: failed for URL: "OpenAppTest://mark?id=007" - error: "This app is not allowed to query for scheme OpenAppTest"


注意事项

通过上面的方法可以唤醒其他的应用,简单总结下一些注意事项。

  1. URL Scheme 其实就是一个app应用的唯一标志。通过它来确定打开那个应用。
  2. 一定要分清哪些配置在哪方配置,被唤醒与唤醒。
  3. iOS9之后需要在唤起端加入LSApplicationQueriesSchemes千万不能忘。
  4. 还有一个问题还没解决,如何再次回到唤醒应用的界面。这个需要参考下官方的XCallbackURL。听说有些复杂,有空再看看。

IOS 唤醒另一个APP(app之间互相通信)

实现一个app怎么唤醒另一个app,以及让两个app之间互相通信。。。

测试工程操作如下
1.新建一个app1,在Info.plist文件的信息属性列表里新建一组,类型是URL types    设置如下

这里最关键的部分在于URL Schemes数组里的Item 0,后面的填写的字符串就是你用来通信的命令前缀“achao”,URL identifier只是一个标示符,随意填写
然后再AppDelegate里处理重载下面的回调方法

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

{

if ([[url scheme] isEqualToString:@"achao"])

{

NSLog(@"%@",url);

}

return YES;

}

可以看见[url scheme]这个命令是为了拿到url的scheme,就是命令前缀“achao”
2.新建app2,这个app什么都不用操作,只需要去唤醒app1即可,于是我们在viewDidLoad里写上这一句

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"achao://hello"]];

"achao"就是app1里的url scheme,我叫它命令前缀(我怀疑apple的应用程序装上过后有个像通知中心一样的应用程序来统一管理,而每个应用程序的url scheme都会在那里被记录,以供其他app来调用该app,至于url scheme属于哪个应用程序,当然是和app的Bundle identifier相关的),格式采用“前缀://..."
3.我们关闭app1,app2,然后再启动app2,发现app2启动过后唤醒了app1,并且成功跳转;我们再关闭app1,app2,然后我们打开app1进行监测,发现app1被启动后,进入了
这就实现了两个app之间的唤醒和通信
4.当然这时候你可能才想到,那不是很多应用程序都会被其他垃圾程序调用了,查找资料过后,原来还有后续
我们重载这个方法

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

if ([sourceApplication isEqualToString:@"AC.achao.com"])

{

NSLog(@"%@", sourceApplication);    //来源于哪个app(Bundle identifier)

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

NSLog(@"query: %@", [url query]);   //查询串  用“?...”格式访问

return YES;

}

else

return NO;

}

这就满足我们的需求了,我们可以通过sourceApplication来判断来自哪个app以决定要不要唤醒自己的app,也可以通过[url query]来获得查询串,这个时候我们需要更改app2的访问方式才能获得这个参数

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"achao://hello?name=achao-AC"]];

我们也可以直接在safari离输入"achao://hello?name=achao-AC"来访问我们的app1,这个时候sourceApplication就是@"com.apple.mobilesafari"

总结:类似下面的方法

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://158********"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://158********"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://362****@qq.com"]];

我们用过很多,估计也是程序内部设置了类似的url scheme来供其他应用程序操作的

iOS App 唤醒另一个App相关推荐

  1. html a标签唤醒app,网页唤醒app、一个app唤醒另一个app

    网页唤醒app: 可以通过URL Schemes唤醒某个应用.具体schemes是什么,怎么理解,可自行百度,我觉得可以将它认为是某个应用的身份标识.当然,这个标识可能不是唯一的,因为人们可以自定义它 ...

  2. [APP资讯] 开发一个App要多少钱?有免费开发App的网站吗?

    试想,如果你是装潢公司老板,被问及:"装修一个房子要多少钱?",你会怎么回答?所以,当我被人问及:"开发一个App要多少钱?"时,我的感觉跟你一样一样的. 拿出 ...

  3. 通过第三方app唤醒自己的app

    一 .提供scheme链接在第三方应用Activity中唤醒 在自己app中的AndroidManifest.xml文件里包含<action android:name="android ...

  4. android广播唤醒app,Android APP唤醒打开其他APP

    App(a):判断是否为App(b)是否存在,不存在选择下载 存在后台状态直接唤醒 否则直接打开 App(a)部分代码 if (checkPackage("com.xxx.android&q ...

  5. app调用另一个app的方法

    APP调用APP在编程应用中很常见,浏览了许多大神的文章,颇有心得.谢谢前辈们的总结.下面总结给自己: 主要的套路是:intent =packageManager.getLaunchIntentFor ...

  6. Android中一个APP启动另一个APP并传递参数

    被调用(启动)的APP: 项目名字:Demo_ybs 项目包名:com.ybs.demo_ybs 被调用APP中获取调用者的传递数据: package com.ybs.demo_ybs;import ...

  7. android 终端app,关于android:一个APP如何适配多个Android终端

    简介: 传统的多终端适配计划,是为大尺寸Pad开发一个特定的HD版本.然而目前反对Android零碎的设施类型越来越丰盛,不同类型的设施尺寸也越来越多样化,特定的HD版本并不能适配所有设施尺寸.App ...

  8. iOS 一个APP打开另一个APP

    环境:Xcode7.2.1,iOS Simulator 9.2, iPhone6s(9.3) 语言:Objective-C 和 Swift 通用 假定现在有两个APP:TestA和TestB,点击Te ...

  9. android app打开另一个app并触发按钮_Android进程调度:Low memory killer(4)修改版

    相关源码文件:framework/base/service/core/java/com/android/server/am/ActiveServices.javaframework/base/serv ...

最新文章

  1. Qt Creator使用自定义字体
  2. vue --- 使用vue-router获取带参数的路由
  3. 盘点618 .NET 程序员必“败”书单
  4. java mysbatis select_MyBatis SELECT基本查询实现方法详解
  5. Virtual.Lab模拟钢板冲击声
  6. 《Oracle高性能自动化运维》一一第1章 Linux下的Oracle
  7. 9.7英寸 IPS 屏平板 选购
  8. label y 训练集测试集x_Pytorch将数据集划分为训练集、验证集和测试集
  9. 正则表达式--简单记忆一
  10. java三大框架介绍
  11. PHP如何获取当前域名
  12. 全国计算机的照片规格,照片纸尺寸大小 照片尺寸规格大全
  13. python学习总结4 - 流程控制工具
  14. 基于vue,自定义条形进度条/辣条进度条
  15. catti二级笔译综合能力真题_CATTI英语二级笔译综合能力试卷
  16. fastai v1环境搭建:Win10 MX250 CUDA10.1 cuDNN Pytorch1.0.0 Fastai v1安(bi)装(keng)指南
  17. Visual Studio中Git的使用(完全图解)
  18. 超前进位加法器 verilog代码
  19. Roon 1.8(806) for Windows
  20. 推荐系统从入门到实战笔记

热门文章

  1. SP_Flash_Tool对应MTK CPU型号速查表汇总分析
  2. Win10正式版Guest来宾账户开启使用方法
  3. Qt引入图标字体包iconfont
  4. 计算机如何连接wifi台式,台式电脑怎么连接WIFI上网?台式电脑连接无线网络的方法...
  5. 腾讯云Ubuntu18.04配置OpenPCDet深度学习环境
  6. wordpress之邮箱插件的配置
  7. CameraPath插件使用
  8. 前端项目 - 论坛信息管理系统(纯页面)
  9. 书单 | 做数字化转型,离不开这10本书!
  10. Apple开启双重认证过程