一、应用间通信

URL

调用系统服务:

tel:11111

sms:xxx@163.com

http://

URL深入

类型://主机:端口/地址?参数

label框等于文字大小快捷键:command =

两个应用程序间通信步骤:

A -> B

1.先制定一个通信的url类型iac

在B程序中选中项目名称->选TARGETS下的那个项目名称->Info->URL Types->制定URL Schemes和identifier

2.在程序B中声明支持url类型

3.程序A中openURL:

最好在open之前用canOpenURL检测是否能够打开应用程序

4.在程序B中响应

【Day1001_IAC_Target】

【Day1002_IAC_Source】

两个应用程序间的通信

target是被source打开的应用程序,不过要先把target烧在模拟器上,并设置url类型iac及标示符identifier

在source里openURL之前先使用canOpenURL判断是否有url类型iac的应用程序,然后openURL即可跳到target应用程序并会把iac:xxx传过去

(在target应用程序的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

这个方法的launchOptions会接收到传过来的iac:xxx和identifier)

验证:在target的沙箱目录里创建一个log.txt文件把信息追加进去,即可查看,注意这个log文件最好放在沙箱目录里,防止被删除。

在target应用程序里有一个API是专门在其他应用程序跳过来的时候才会调用,这个API是

// 如果是别的程序openURL 才会调用此消息

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

在该消息里直接接收数据。

source发送数据:

- (IBAction)tap:(id)sender {

// 判断是否有支持url类型iac:的应用程序

BOOL canOpen = [[UIApplicationsharedApplication] canOpenURL:[NSURLURLWithString:@"iac:"]];

if (canOpen) {

[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"iac://function/addcontact?name=sansang&age=98"]];

}

}

target接收数据:

// 如果是别的程序openURL 才会调用此消息

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

if ([[url scheme] isEqualToString:@"iac"]) {

NSString *homePath = NSHomeDirectory();

//    NSLog(@"%@",homePath);

NSString *logFilePath = [homePath stringByAppendingPathComponent:@"log.txt"];

NSMutableString *log = [@""mutableCopy];

// 各种修改log

[log appendFormat:@"absoluteString:%@",[url absoluteString]]; // 绝对路径

[log appendString:@"\n"];

[log appendFormat:@"scheme:%@",[url scheme]]; // url类型本例是iac

[log appendString:@"\n"];

[log appendFormat:@"host:%@",[url host]]; // 主机

[log appendString:@"\n"];

[log appendFormat:@"query:%@",[url query]]; // 参数

[log appendString:@"\n"];

// 解析传过来的数据  a=b&c=d

NSString *queryString = [url query];

NSArray *paras = [queryString componentsSeparatedByString:@"&"];//paras参数

NSMutableDictionary *parasDic = [NSMutableDictionarydictionary];

//    NSMutableDictionary *parasDic = [@{} mutableCopy];

for (NSString *para in paras) {

NSArray *paraItems = [para componentsSeparatedByString:@"="];

NSString *key = paraItems[0];

NSString *value = paraItems[1];

[parasDic setObject:value forKey:key];

}

[parasDic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

[log appendFormat:@"%@:%@",key,obj];

[log appendString:@"\n"];

}];

self.name = parasDic[@"name"];

self.age = [parasDic[@"age"] integerValue];

// 写入文件

[log writeToFile:logFilePath atomically:YESencoding:NSUTF8StringEncodingerror:nil];

returnYES;

}

}

----------------------------------------------

target接收到数据显示在label上

MXAppDelegate.h定义单例属性

@property (nonatomic, copy) NSString *name;

@property (nonatomic) NSInteger age;

MXAppDelegate.m赋值

接收数据消息openURL中赋值

self.name = parasDic[@"name"];

self.age = [parasDic[@"age"] integerValue];

MXViewController.m

在要显示的view中显示

-(void)viewWillAppear:(BOOL)animated{

[superviewWillAppear:animated];

MXAppDelegate *appDelegate = [[UIApplicationsharedApplication] delegate];

// 添加观察

[appDelegate addObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionNewcontext:NULL];

[appDelegate addObserver:selfforKeyPath:@"age"options:NSKeyValueObservingOptionNewcontext:NULL];

}

// 属性值变化响应

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

MXAppDelegate *appDelegate = [[UIApplicationsharedApplication] delegate];

if ([keyPath isEqualToString:@"name"]) {

self.nameLabel.text = appDelegate.name;

}elseif ([keyPath isEqualToString:@"age"]) {

self.ageLabel.text = [NSStringstringWithFormat:@"%d",appDelegate.age];

}

}

// 撤销观察

-(void)viewDidAppear:(BOOL)animated{

MXAppDelegate *appDelegate = [[UIApplicationsharedApplication] delegate];

[appDelegate removeObserver:selfforKeyPath:@"name"];

[appDelegate removeObserver:selfforKeyPath:@"age"];

}

-----------------------------------------

4 通信传输参数

发邮箱(需要配置好邮箱才能发)

搜索tel:-> phone links -> mail links

mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!

5 启动系统mail程序

cc是抄送

subject主题

%20 是空格

body 是内容

参数没有顺序!

代码:

- (IBAction)mail:(id)sender {

[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto:foo@example.com?cc=bar@example.com&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!"]];

}

----------------------------------------------

二、通知中心

1.类型:

1) Local Notification本地通知

是本地应用程序经过测算,预先设定好,在未来的某个时间点提示用户弹出通知

(   2) Apple Push Notification Service(APNs)苹果的通知推送服务

服务器不能跟手机直接沟通,你的服务器和目标手机的本地程序直接沟通

你的服务器->苹果的APNs的服务器->目标手机)

2本地通知三步

1> 构建本地通知对象

2> 安排发送时间

3> 将通知提交给系统保存

代码:

- (IBAction)tap:(id)sender {

// 1> 构建本地通知对象

UILocalNotification *localNotification = [[UILocalNotificationalloc] init];

// 2> 安排发送时间

localNotification.fireDate = [NSDatedateWithTimeIntervalSinceNow:5];

// 内容

localNotification.alertBody = @"你居然把我关了"; // 推送内容

localNotification.alertAction = @"测试"; // 显示在按钮上

localNotification.applicationIconBadgeNumber = 1; // 显示在应用程序上

// 3> 将通知提交给系统保存

[[UIApplicationsharedApplication] scheduleLocalNotification:localNotification];

}

3 收通知

两种情况:

1> 当前的程序在运行,在后台

MXAppDelegate.m

// 本地通知被点击后  程序没有被杀掉  其次用户点击通知时才会调用

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{

NSLog(@"didReceiveLocalNotification");

application.applicationIconBadgeNumber = 0; // 清除掉应用程序右上角数字

[application cancelAllLocalNotifications]; // 清除掉所有的通知

}

2> 当前的程序不在运行,被杀掉了

此时点击通知会激活当前程序,并调用下面的消息

// 如果程序不在内存中用户点击通知时会调用此消息

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// Override point for customization after application launch.

returnYES;

}

4 本地通知传输数据和接收数据

传输数据:

localNotification.userInfo = @{@"name":@"sansang",@"age":@99}; // 几秒之后给自己传数据

接收数据:

// 接收到(程序没有被杀掉)通知数据

NSDictionary *userInfo = notification.userInfo;

// 接收到(程序被杀掉)通知数据

UILocalNotification *localNotification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

if (localNotification != Nil) {

//...

}

/////////////////////

[launchOptions enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

[log appendFormat:@"%@:%@",key,obj];

[log appendString:@"\n"];

}];

-------------------------------------------------

三、复习

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

调用该消息有3中情况:

1.手指头点开(运行应用程序时)

2.通过其他程序openURL打开时

laumchPotions里有消息

有一个url

还有一个源程序名

系统调用此方法时,会在调用

// 如果是别的程序openURL 才会调用此消息

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

3.通过通知进入(当前程序被杀掉)

laumchPotions里有消息

有一个UILocalNotification对象

-------------------------------------------

accelerotemer加速计

Gyro 陀螺仪

四、加速计 / 陀螺仪

Core Motion框架

加速计

图位置:

搜索Core Motion -> Handing Accelerometer Events Using Core Motion

【day1004_CoreMotion】

导入CoreMotion.framework框架

关掉左屏右屏:项目名称->General->Deployment Info->Device Orientation-> 勾掉Landscape Left, Landscape Right

作业

1. TContact项目升级

1) 拨打电话:

查看联系人界面

点击联系人的电话 立刻拨打出去

2) 共享联系人:

查看联系人界面下面增加一个按钮

按钮“共享联系人”

点击共享联系人后

TContact程序跳转到TMessage程序

TMessage的输入框内有该联系人的基本信息,

正在准备被发送

“小明的电话是18612345678”

TContact程序跳转到TMessage程序

首先在TMessage的Info->URL Types中设置URL Schemes和Identifier

设置Identifier一般格式为:

公司网址名+ios+项目名称+scheme(跳转标识名)

比如:come.tarena.ios.TMessage.iac

解决传输中文问题

把url转为utf8编码

NSString *urlString = [paras stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

解码:

self.name = [name stringByRemovingPercentEncoding];

10 - 应用程序间通信、本地通知、加速计、URL传输中文的更多相关文章

  1. iOS 10 UserNotification框架解析 – 本地通知

    iOS 10以前的通知比较杂乱,把本地通知和远程通知分开了,诞生了许多功能类似的API,很容易让初学者犯迷糊.而iOS 10的通知把API做了统一,利用独立的UserNotifications.fra ...

  2. 10-IOSCore - 应用间通信、本地通知

    一.应用间通信 URL 调用系统服务: tel:11111 sms:xxx@163.com http:// URL深入 类型://主机:端口/地址?参数 label框等于文字大小快捷键:command ...

  3. IOS 本地通知推送消息

    在现在的移动设备中,好多应用性的APP都用到了推送服务,但是有好多推送的内容,比如有的只是单纯的进行推送一个闹钟类型的,起了提醒作 用,有的则是推送的实质性的内容,这就分为推送的内容来区别用什么推送, ...

  4. IOS本地通知

        发送通知: UILocalNotification *newNotification = [[UILocalNotification alloc] init]; if (newNotifica ...

  5. IOS本地通知:UILocalNotification使用记录

    第一次接触IOS的本地通知的使用,看到别人写的一个比较详细的记录,自己整理过来,方便以后再次使用和拓展: 1.创建一个本地通知,添加到系统: // 初始化本地通知对象 UILocalNotificat ...

  6. ios开发——实用技术OC-Swift篇&本地通知与远程通知详解

    本地通知与远程通知详解 一:本地通知   Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...

  7. UILocalNotification本地通知

    // 执行通知一定要退出应用或挂起应用(进入后台)才能收到通知. 1.在iOS8及其以后版本中使用本地消息需要先获得用户的许可,否则无法成功注册本地消息.因此,我们将询问用户许可的代码片段添加到了ap ...

  8. IOS 本地通知

    操作流程 1.接收通知 2.注册发送通知 用途:提示时间,闹钟 //接收本地通知(在Appdelegate里面实现) - (void)application:(UIApplication *)appl ...

  9. IOS 本地通知 UILocalNotification

    IOS 本地通知 UILocalNotification [本文章第四部分中的代码逻辑来自网上的借鉴,并非我自己原创] 大概一个月前,我开始跟着做IOS项目了.学习C++,了解Objective-C, ...

随机推荐

  1. fopen()函数

    1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都能够通过文件管理的方法来完毕.而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 具体介绍Turb ...

  2. (" use strict")Javascript 严格模式详解

    Javascript 严格模式详解 转载别人的博客内容,浏览了一遍,没有全部吸收,先保存一下链接 http://www.ruanyifeng.com/blog/2013/01/javascript_s ...

  3. Win7/8在用账户密码登录时, 设置成保留用户名, 只输入密码

    修改注册表, 0表示保留用户名. 1表示每次都需要输入用户名密码. 位置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersio ...

  4. tomcat手动发布

    有些时候不能通过eclipse中的server服务发布工程,这时候就只能通过手动配置进行发布了 如下: 配置发布路径:D:\Program Files\apache-tomcat-6.0.10\con ...

  5. java int and string convert

    int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...

  6. Python 模块(八) socketserver 以及 线程、进程

    目录 异常处理 socketserver 线程.进程 一.异常处理 try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执 ...

  7. 转:requirejs打包压缩r.js使用示例

    为了应对日益复杂,大规模的JavaScript开发.我们化整为零,化繁为简.将复杂的逻辑划分一个个小单元,各个击破.这时一个项目可能会有几十个甚至上百个JS文件,每个文件为一个模块单元.如果上线时都是 ...

  8. 多种EDA软件的鼠标增强工具EDAHelper

    最新版本(unicode版本,各种语言环境显示中文)下载地址:http://www.jyxtec.com/edahelper/EDAHelper-2.1.13.7z 繁体版:http://www.jy ...

  9. (step4.2.1) hdu 1372(Knight Moves——BFS)

    解题思路:BFS 1)马的跳跃方向 在国际象棋的棋盘上,一匹马共有8个可能的跳跃方向,如图1所示,按顺时针分别记为1~8,设置一组坐标增量来描述这8个方向: 2)基本过程 设当前点(i,j),方向k, ...

  10. 一行JavaScript代码获取页面中的所有超链接地址

    因为我喜欢收集Web开发类的网址,平时对网址就很敏感. 我总结了一下我收集网址的几个阶段: 1.纯手工阶段,傻傻的阶段. 在这个阶段,主要是收集一些在页面中展现出来的网址,就是说,如果网址出现在HTM ...