1、Xcode 项目属性

  • Product Name

    • 软件名称、产品名称、项目名称
  • Organization Name

    • 公司名称、组织名称
  • Organization Identifier

    • 公司的唯一标识
    • 一般是公司域名的反写,比如 com.baidu
  • Bundle Identifier

    • 软件的唯一标识
    • 一般是 Organization Identifier + Product Name

2、App 应用间跳转

2.1 应用跳转原理

  • 相信从一个应用跳转到另一个应用大家并不陌生,最常见的莫过于第三方登录,支付宝支付等等。这些东西大家都耳熟能详,集成进来也很简单,跟着第三方 sdk 集成文档一步步走下来就是了,通常 sdk 集成文档都需要你在工程中配置一堆堆的东西,但是配置的这些东西,你真的明白了吗?比如下面这个,第三方登录或分享需要你配置的 URL Schemes:

  • 1、一些概念的补充

    • 协议:双方互相遵守的一种规范,只有遵守共同的协议规范才能进行彼此的通信。比如我们最熟悉的网络协议 http 协议。

    • URL:资源的路径或地址。在 iOS 中有一个专门用于包装资源路径的类 NSURL。

    • 一个完整 URL 的组成

      	例如:http://123.0.0.1/path?page=100
      
      	http://		:协议类型
      123.0.0.1 :服务器 ip 地址
      /path :资源存放的是路径
      page=100 :请求的参数
    • NSURL 包装一个完整地址

      	NSURL *url = [NSURL URLWithString:@"http://123.0.0.1/path?page=100"];
      
      	NSLog(@"scheme(协议):%@",url.scheme);
      NSLog(@"host(域名):%@",url.host);
      NSLog(@"path(路径):%@",url.path);
      NSLog(@"query(参数):%@",url.query);
    • 打印结果如下

      	2015-12-02 14:50:38.442 TestDemo[5632:406869] scheme(协议):http
      2015-12-02 14:50:38.442 TestDemo[5632:406869] host(域名):123.0.0.1
      2015-12-02 14:50:38.442 TestDemo[5632:406869] path(路径):/path
      2015-12-02 14:50:38.442 TestDemo[5632:406869] query(参数):page=100
  • 2、跳转的原理

    • 一个应用能打开另一个应用的必然条件是,另一个应用必须配置一个 scheme(协议),这样应用程序才能根据协议找到需要打开的应用。

    • 在 iOS 中,从一个 app 打开另一个 app,这必然牵扯到两个 app 之间的交互和通信,像这种涉及到整个应用程序层面的事情,苹果有一个专门的类来管理 UIApplication。在 iOS 中 UIApplication 其实就是代表着应用程序,这点从它的命名就可以窥之。而我们要打开另一个应用程序,其实就是 UIApplication 下面这个的 API。

      • iOS 系统版本 < 10.0

        	通过应用程序打开一个资源路径
        @param url 资源路径的地址
        @return 返回成功失败的信息 - (BOOL)openURL:(NSURL*)url;
      • iOS 系统版本 >= 10.0

        	通过应用程序打开一个资源路径
        @param url 资源路径的地址
        @param options 附加参数
        @param completion 完成回调 - (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options
        completionHandler:(void (^ __nullable)(BOOL success))completion;
        • UIApplication 的头文件中列了一个可用在 options 字典中的 key: UIApplicationOpenURLOptionUniversalLinksOnly,可以设置布尔值(默认是 NO),如果设置为 YES,则只能打开应用里配置好的有效通用链接。如果应用程序没有配置,或者用于禁止打开这个链接,则 completion handler 回调里的success 为 NO。
    • 它的一些我们非常熟悉的用法

      	// 拨打系统电话
      NSURL *url = [NSURL URLWithString:@"tel://10086"];
      [[UIApplication sharedApplication] openURL:url]; // 发送系统短信
      NSURL *url = [NSURL URLWithString:@"sms://1383838438"];
      [[UIApplication sharedApplication] openURL:url];
    • 拨打系统电话、发送系统短信其实就是应用间的跳转。只要一执行以上两个方法就会从你当前的应用跳转到系统的拨打电话界面、发送短信界面,拨打系统电话、发送短信它俩就是手机本身自带的两个 app 应用。上面打电话和发短信的实现代码大同小异,唯一的区别是传递的 NSURL 参数不一样,导致他们跳转到不同的应用场景。我们再仔细分析下传给它们的 NSURL 参数,就会发现 NSURL 的 scheme(协议)不一样,打电话是 “tel://” 协议,发短信是 “sms://” 协议。

2.2 实现两个 App 间的跳转

  • 由 App:AppJump1 跳转到 App:AppJump2。

  • 1、配置协议:在被跳转的 App(如 AppJump2)的 TARGETS => Info => URL Types => URL Scheme 配置一个协议 scheme,这里命名为 app2(名字可随意配置,当然最好是英文并且跟你项目相关)

  • 2、配置协议白名单:在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App(如 AppJump1)的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

  • 3、在发起跳转的 App(如 AppJump1)的执行跳转方法中实现下面方法。

    	// app2 为在 App2 中设置的协议 scheme
    NSURL *url = [NSURL URLWithString:@"app2://"]; // 判断能否跳转到 App2
    if ([[UIApplication sharedApplication] canOpenURL:url]) { // 跳转到 App2
    [[UIApplication sharedApplication] openURL:url]; } else {
    NSLog(@"没有安装应用");
    }

2.3 跳转到指定界面

  • 想要跳转到指定界面,必然是上一个 App 告诉下一个 App(被跳转的 App)需要跳转到哪个界面,而如何告诉它这里便涉及到两个 App 的通信。我们从上面可以知道,两个 App 之间的跳转只需要配置一个 scheme,然后通过 UIApplication 调用它的对象方法 openURL: 即可实现,除此之外再也没有实现任何代码了。而这之间是如何通信的呢?答案依然是协议。

  • 1、在 "app2://" 协议后面的域名加上一些字段用来标记需要跳转的界面。

    	// 进入更多界面
    
    		// app2 为在 App2 中设置的协议 scheme
    NSURL *url = [NSURL URLWithString:@"app2://more"]; // 判断能否跳转到 App2
    if ([[UIApplication sharedApplication] canOpenURL:url]) { // 跳转到 App2
    [[UIApplication sharedApplication] openURL:url]; } else {
    NSLog(@"没有安装应用");
    } // 进入设置界面 // app2 为在 App2 中设置的协议 scheme
    NSURL *url = [NSURL URLWithString:@"app2://set"]; // 判断能否跳转到 App2
    if ([[UIApplication sharedApplication] canOpenURL:url]) { // 跳转到 App2
    [[UIApplication sharedApplication] openURL:url]; } else {
    NSLog(@"没有安装应用");
    }
  • 2、来到被跳转的应用的 AppDelegate.m 文件中,监听其代理方法 application: handleOpenURL:,当应用程序将要被其他程序打开时,会先执行此方法,并传递 url 过来。在 iOS9.0 + 上面的方法被废弃了,改用这个方法 application: openURL: options:

    	// NS_DEPRECATED_IOS(2_0, 9_0)
    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { if ([url.host isEqualToString:@"more"]) { // 到此做界面的跳转,进入更多界面
    } if ([url.host isEqualToString:@"set"]) { // 到此做界面的跳转,进入设置界面
    } return YES;
    } // NS_AVAILABLE_IOS(9_0)
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
    options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { if ([url.host isEqualToString:@"more"]) { // 到此做界面的跳转,进入更多界面
    } if ([url.host isEqualToString:@"set"]) { // 到此做界面的跳转,进入设置界面
    } return YES;
    }

2.4 常用 App 的跳转

  • 在 iOS9.0 + 系统隐私控制里禁止查询设备中已安装的 App,所以在 iOS9.0 + 系统中要实现应用间跳转还需要配置协议白名单。在发起跳转的 App 的 Info.plist 文件中增加一个 LSApplicationQueriesSchemes 字段,把它设置为数组类型,并配置需要跳转的协议名单。

    	// 发送系统短信
    NSURL *url = [NSURL URLWithString:@"sms://1383838438"];
    [[UIApplication sharedApplication] openURL:url];
  • 常用 App 相应的 URL 地址

    	URL 地址:
    
    	  	tel://电话号码			// 打电话
    sms://电话号码 // 发短信
    mailto://邮件地址 // 发邮件
    http://网址 // 调用浏览器 Safari
    https://网址 // 调用浏览器 Safari // 微信
    weixin://
    wechat:// // QQ
    mqq://
    mqqapi://
    mqqOpensdkSSoLogin://
    mqqopensdkapiV2://
    mqqopensdkapiV3://
    wtloginmqq2:// // 新浪微博
    sinaweibo://
    sinaweibohd://
    sinaweibosso://
    sinaweibohdsso://
    weibosdk://
    weibosdk2.5:// // 支付宝
    alipay://
    alipayshare://

2.5 系统设置界面的跳转

  • 设置跳转有三种方式,每一种的使用场景都不同。 并且你在跳转到系统中自己应用下面设置的时候,你的应用要提前至少申请了某一个权限,如通知,定位等,否则,会引起崩溃。

    • 方式一:prefs:root=某项服务

      • iOS 系统版本 < iOS10 , 只能跳转到系统设置页面。
      • 在 iOS10 系统上,不会跳转。
    • 方式二:prefs:root=bundleID

      • iOS8 <= iOS 系统版本 < iOS10,支持跳转到第三方应用的设置界面中。
      • 在 iOS7 系统上,仅仅只是跳转到设置应用,不推荐使用。
      • 在 iOS10 系统上,不会跳转。
    • 方式三:UIApplicationOpenSettingsURLString

      • iOS8 <= iOS 系统版本 < iOS10,支持跳转到系统设置。
      • 在 iOS10 系统上,支持跳转到自己应用设置,不支持跳转到系统设置。
  • 1、在 iOS6 以下系统中。

    	// 打开蓝牙设置界面
    NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"];
    [[UIApplication sharedApplication] openURL:url];
  • 2、在 iOS6 至 iOS9 系统中,必须在 URL Types 中添加 prefs 才能打开相应的设置界面。

    	// 打开蓝牙设置界面
    NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"];
    [[UIApplication sharedApplication] openURL:url]; // 打开第三方应用设置界面,bundleID 为第三方应用的唯一标识,iOS8 iOS9 可用
    NSURL *url = [NSURL URLWithString:@"prefs:root=bundleID"];
    [[UIApplication sharedApplication] openURL:url];
  • 3、在 iOS10 系统中苹果已经不允许 app 跳到各个系统设置页面了,只能跳转到自己应用设置页面。

    	// 打开自己应用设置界面
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
    • 将 prefs:root=某项服务 改为 app-Prefs:root=某项服务 也可以成功跳转到系统设置页面。

      	// 打开蓝牙设置界面
      NSURL *url = [NSURL URLWithString:@"app-Prefs:root=Bluetooth"];
      [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
  • 系统设置 相应的 URL 地址

    	URL 地址:
    
    		UIApplicationOpenSettingsURLString                       // 系统设置,支持 iOS8, iOS9, iOS10 系统
    
    		prefs:root=General&path=About                            // 关于本机
    prefs:root=General&path=ACCESSIBILITY // 辅助功能
    prefs:root=AIRPLANE_MODE
    prefs:root=General&path=AUTOLOCK
    prefs:root=General&path=USAGE/CELLULAR_USAGE
    prefs:root=Brightness
    prefs:root=Bluetooth // 蓝牙设置
    prefs:root=General&path=DATE_AND_TIME
    prefs:root=DISPLAY&BRIGHTNESS // 显示与亮度
    prefs:root=FACETIME
    prefs:root=General // 通用设置
    prefs:root=General&path=Keyboard
    prefs:root=CASTLE
    prefs:root=CASTLE&path=STORAGE_AND_BACKUP
    prefs:root=General&path=INTERNATIONAL
    prefs:root=LOCATION_SERVICES // 定位设置
    prefs:root=ACCOUNT_SETTINGS
    prefs:root=MOBILE_DATA_SETTINGS_ID // 蜂窝网路
    prefs:root=MUSIC // 音乐
    prefs:root=MUSIC&path=EQ
    prefs:root=MUSIC&path=VolumeLimit
    prefs:root=General&path=Network
    prefs:root=NIKE_PLUS_IPOD
    prefs:root=NOTES // Notes
    prefs:root=NOTIFICATIONS_ID // 系统通知
    prefs:root=Phone
    prefs:root=Photos // 照片与相机
    prefs:root=Privacy // 隐私设置
    prefs:root=General&path=ManagedConfigurationList
    prefs:root=General&path=Reset
    prefs:root=Sounds&path=Ringtone
    prefs:root=Safari // Safari
    prefs:root=General&path=Assistant
    prefs:root=Set // 系统设置
    prefs:root=Sounds // 声音设置
    prefs:root=General&path=SOFTWARE_UPDATE_LINK
    prefs:root=STORE // APP Store
    prefs:root=TWITTER
    prefs:root=FACEBOOK
    prefs:root=General&path=USAGE prefs:root=VIDEO
    prefs:root=General&path=Network/VPN
    prefs:root=Wallpaper // 壁纸设置
    prefs:root=WIFI // Wifi 设置
    prefs:root=INTERNET_TETHERING // 个人热点

3、代码退出程序设置

	- (IBAction)outClick:(id)sender {

    	// 创建退出动画
[UIView beginAnimations:@"exitApplication" context:nil]; [UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view.window cache:NO];
[UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)]; self.view.window.bounds = CGRectMake(0, 0, 0, 0); [UIView commitAnimations];
} // 动画完成后的响应事件
- (void)animationFinished:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { if ([animationID compare:@"exitApplication"] == 0) { // 退出 App
exit(0);
}
}

4、App 间的通信方式

5、App 与外设间的通信方式

iOS - App 应用的更多相关文章

  1. iOS app内存分析套路

    iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...

  2. iOS App引导页功能实现

    一.写作原因 以前都没有想着来写点东西,今天遇到件事情让我决定每次还是要做记录.因为以前自己可以轻松的完成pod spec的配置,但是今天在做的时候还是忘了遇到了很多坑.pod spec配置遇到的坑不 ...

  3. Xcode7.1环境下上架iOS App到AppStore 流程② (Part 二)

    前言部分 part二部分主要讲解 iOS App IDs 的创建.概要文件的配置.以及概要文件安装的过程. 一.iOS App IDs 的创建 1)进入如图1所示界面点击右上角箭头所指的加号 进入iO ...

  4. iOS App上架流程(2016详细版)

    iOS App上架流程(2016详细版) 原文地址:http://www.jianshu.com/p/b1b77d804254 感谢大神整理的这么详细 一.前言: 作为一名iOSer,把开发出来的Ap ...

  5. 用Model-View-ViewModel构建iOS App(转)

    转载自 Model-View-ViewModel for iOS [译] 如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller, 即MVC.MVC是构建iOS a ...

  6. 用Model-View-ViewModel构建iOS App

    如果你已经开发一段时间的iOS应用,你一定听说过Model-View-Controller,即MVC.MVC是构建iOS App的标准模式.然而,最近我已经越来越厌倦MVC的一些缺点.在本文,我将重温 ...

  7. iOS APP可执行文件的组成

    iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方 ...

  8. iOS App Store上架新APP与更新APP版本

    iOS App Store上架新APP与更新APP版本 http://www.jianshu.com/p/9e8d1edca148

  9. 移动应用开发过程中需要哪些IOS APP工具

    虽说如今要开发一款IOS app应用软件已经不是什么难事,app开发技术已经发展成熟,所以要制作一款适用于苹果IOS智能操作系统的app软件也挺容易的了.不过对于开发者来说,可以通过一些app工具来更 ...

  10. APP开发:对于IOS APP应用的推广渠道有哪些?

    亿合科技了解到,随着移动互联网时代的到来,苹果从2007年进入中国市场,一直备受大众喜爱,手机应用也层出不穷.那么对于那么多的IOS APP应用怎么能获得用户的喜爱呢?于是推广APP应用是需要做的,亿 ...

随机推荐

  1. STL sort 函数实现详解 ZZ

    前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不对劲,知道自己回答错了.这几天特意看了一下,在 ...

  2. COM如何区分套间线程(apartment thread)和自由线程(free thread)

     

  3. COM中导出GUID

      编写COM组件的时候需要导出GUID,以下是代码示例. extern "C" const GUID CLSID_Dictionary =         { 0x54bf656 ...

  4. [Node.js]32. Level 7: Working with Lists -- Redis

    As we saw in the video, redis can do more than just simple key-value pairs. We are going to be using ...

  5. STL - 容器 - Array

    Array是C++ 11给STL新增加的容器 ArrayTest.cpp #include <array> #include <algorithm> #include < ...

  6. Android之新建项目

    最近开始接触Android,实践出真理,接下来实际创建Android应用程序. 1.启动Eclipse,依次选择 " File/New/Project... " 或 " ...

  7. 在线sass编译器

    工作中,我们可能遇到突发情况(无法安装考拉,gulp以及webpack以及其它的自动化工具),我们这时就要用即时编译工具了,那么它就是你的首选: http://tool.oschina.net/

  8. bzr登陆加密

    bzr提示:You have not informed bzr of your Launchpad ID, and you must do this towrite to Launchpad or a ...

  9. Python之os.walk()

    #http://www.cnblogs.com/bluescorpio/archive/2009/10/21/1587493.html os.walk() 返回结果:可以得到一个(dirpath, d ...

  10. 2014年,daliu_it 年末文章汇总清单

    一.javabase 1. Windows环境下JDK安装与环境变量配置 详细的介绍了JDK的安装以及配图,同时安装的注意事项. 2. 项目的命名规范,为以后的程序开发中养成良好的行为习惯 详细的介绍 ...