10 - 应用程序间通信、本地通知、加速计、URL传输中文

一、应用间通信

URL

调用系统服务:

tel11111

smsxxx@163.com

http//

 

URL深入

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

 

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

 

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

A -> B

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

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

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

3.程序AopenURL:

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

4.在程序B中响应

 

Day1001_IAC_Target

Day1002_IAC_Source

两个应用程序间的通信

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

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

(target应用程序的

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

这个方法的launchOptions会接收到传过来的iacxxxidentifier)

验证:在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程序

首先在TMessageInfo->URL Types中设置URL SchemesIdentifier

设置Identifier一般格式为:

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

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

 

解决传输中文问题

url转为utf8编码

NSString *urlString = [paras stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

 

解码:

self.name = [name stringByRemovingPercentEncoding];

 

 

 

 

posted @ 2014-04-19 11:49  回读(IOS)  阅读(383)  评论(0编辑  收藏  举报