zoukankan      html  css  js  c++  java
  • 10

    一、应用间通信

    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:@" "];

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

        [log appendString:@" "];

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

        [log appendString:@" "];

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

        [log appendString:@" "];

       

        // 解析传过来的数据  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:@" "];

        }];

        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:@" "];

        }];

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

    三、复习

    - (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];

     

     

     

     

  • 相关阅读:
    mysql 查看数据库及表大小以及数据库扩容评估
    idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
    mybatis plus 中增删改查及Wrapper的使用
    mybatis plus 主键策略
    搭建 spring boot + mybatis plus 项目框架并进行调试
    jeecg datagrid重新指定数据源
    java 日志脱敏框架 sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的
    java 实现敏感词(sensitive word)工具详解使用说明
    java 日志脱敏框架 sensitive,优雅的打印脱敏日志
    互联网公司OpenAPI链接
  • 原文地址:https://www.cnblogs.com/yangmx/p/3674784.html
Copyright © 2011-2022 走看看