• iOS开发进阶(八):ipa应用唤起并跳转至指定页面


    一、前言

    可通过 react-native log-androidreact-native log-ios 命令查看控制台日志信息。

    添加版本标识可通过 npx react-native run-android --variant=release 实现。

    APP间互相唤起是常用场景,android中通过IntentFilter实现APP唤起。

    二、应用跳转

    iOS系统中,从当前app跳转到其他任意app,可通过系统提供的openURL实现。

    源APP范式如下:

    [[UIApplication sharedApplication]openURL:[NSURL: @"com.csdn.shq5785"]]
    
    • 1

    目标APP范式如下:

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

    应用示例如下:

    # pragma mark - 客户端点击跳转回调
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
    {
      if ([[url scheme] isEqualToString:@"com.csdn.shq5785"]) {
        return [self handleOpenUrl:url sourceApplication:kMainBundleID annotation:nil];
      } else {
        // 存储参数,待到E初始化成功后,再通知JS跳转页面。
        NSString *params = [url host];
        if (params) {
          [[NSUserDefaults standardUserDefaults] setObject:params forKey:kOpenAppParamsUserDefaultName];
        }
        return YES;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    三方APP跳转至目标APP后,目标APP通过iOS原生层面openURL唤起APP,并通过桥接通信方式通知RN跳转至指定页面。

    Objective-C发送通知方式如下。

    [[NSNotificationCenter defaultCenter] postNotificationName:kEmmPushNotification object:data];
    
    • 1

    Objective-C中,NSNotificationCenter是一个用于实现观察者模式的类。它允许不同的对象之间进行通信,当某个事件发生时,可以通过发送通知的方式通知其他对象。

    在这个代码片段中,[NSNotificationCenter defaultCenter]表示获取默认的通知中心对象。postNotificationName:kEmmPushNotification object:data表示发送一个名为kEmmPushNotification的通知,并且传递了一个名为data的对象作为参数。

    通过发送通知,其他对象可以注册成为观察者,并在接收到通知时执行相应的操作。

    三、延伸阅读 OC函数与参数

    Object-C的一个方法可以包含多个参数,除了第一个参数外,后面的所有参数都要写名字,这一点和其他的语言有很大的不同。

    多个参数的写法

    (方法数据类型) 函数名: (参数1数据类型) 参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ;
    
    • 1

    举个例子,一个方法的定义如下:

    -(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;
    
    • 1

    函数实现如下:

    -(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{
     
    	大儿子 = myOldestKidName;
     
    	二儿子 = mySecondOldestKidName;
     
    	三儿子 = myThirdOldestKidName;
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    函数调用如下:

    Kids *myKids = [[Kids alloc] init];
     
    [myKids setKids: @”C大力” secondKid: @”C二力” thirdKid: @”C小力”];
    
    • 1
    • 2
    • 3

    再来一个实例:

    -(int)changeColorToRed:(float)red green:(float)green blue:(float)blue;
    
    • 1

    函数调用:

    [myColor changeColorToRed:5.0 green:2.0 blue:6.0];
    
    • 1

    需要注意的是,用冒号隔开的各个参数顺序是不能更改的。

    另外,OC还具有以下特点:

    1. objective-c使用 nil 来表示 NULL

    2. objective-c用 YES NO 来表示 true false;

    3. objective-c#import 而不是#include来包含头文件;

    4. objective-c中,称类的方法(method)为消息(message)。在C++中,这样来调用方法: aClass->function(var); 但是在objective-c中,使用 [aClass function:var]

    objective-c中的消息(message)比较有意思的特点是:

    1. 调用消息的类可以不知道如何响应这个消息。如果它不知道如何处理这个消息,它会自动的将这个消息转给其他的类,比如它的父类;

    2. 调用消息的类可以是nil。在C++中,在使用类方法之前,都需要检查对象是否为空,所以在实现析构函数的时候,常会有如下的代码,如if (var) { delete var; } 但是在objective-c中,可以直接写[var release]; 即使var == nil, 也不会有问题。

    先写个hello world

    #import <stdio.h>
    
    int main( int argc, char* argv[] ) {
    
    	printf( "hello world\n" );
    	
    	return 1;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    确实跟C很像吧。但是也不其然,objective-c是一个很好的面向对象的语言。跟C还是有挺多不同之处。

    我们先实现一个简单的类。

    // Sample.h
    
    #import <Foundation/NSObject.h>
    
    @interface Sample: NSObject {
    
    	int a;
    
    }
    
    - (void) print;
    
    - (void) setA: (int)a;
    
    @end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    逐句解析下。

    #import <Foundation/NSObject.h>
    
    • 1

    在objective-c中,所有的类都必须继承NSObject,这个概念很像Java里面的Object

    objective-c声明类的格式如下:

    @interface className: baseClassName {
    	member variables;
    }
    member functions
    @end
    
    • 1
    • 2
    • 3
    • 4
    • 5

    objective-c函数声明的基本格式如下

    -/+ (return type) function_name;
    
    -/+ (return type) function_name : (parameter type) parameter;
    
    -/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. -/+: 这个称做scope, 如果在函数前面是- ,那么理解为一般函数;如果是+, 可以理解为**c++**中的static函数

    2. 函数参数声明: objective-c和 c++, java都很不一样。如果没有参数的话,在函数名后面,可以什么都不写;如果只有一个参数,在 : 后面声明参数的类型和名称;如果有多个参数的话,每个参数前面都要有一个 : , 然后接着是参数类型和参数值。

    比如上面这个例子中, otherParameter 这个东西是干什么的呢?在objective-c中,对于有多个参数的函数,可以理解为将函数的名称拆成了几个部分,每个部分都是对紧接着的参数的一个解释。比如在C++中:void initializeRectangle(int x1, int y1, int x2, int y2) , 但是我们并不知道这些参数都是什么意思;但是在objective-c中,可以这样声明:void initializeRectangeWithLeftUpX: (int)x1 LeftUpY: (int)y1 RightBottomX: (int)x2 RightBottomY:(int)y2;

    下面来实现这个简单的Sample类

    // sample.m
    #import <stdio.h>
    #import "Sample.h"
    @implementation Sample
    
    - (void) print {
    	printf( "%d\n", a );
    }
    
    - (void) setA : (int) aa {
    	a = aa;
    }
    @end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用这个类

    #import "Sample.h"
    int main( int argc, char* argv[] ) {
    	Sample* smp = [[Sample alloc] init];
    	[smp setA:1];
    	[smp print];
    	[smp release];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    objective-c中,每一个类对象都是一个指针,这和Java差不多(每个类的对象都用new声明)。alloc类似于C中的malloc, initNSObject中的方法,用于初始化这个对象。如果实现了自己的初始化方法,也可以调用自己的初始化方法。

    切记⚠️:使用完毕后,需要调用release释放空间。

    四、拓展阅读

  • 相关阅读:
    JVS低代码如何实现复杂物料编码?
    Qt事件机制
    【数据结构】二叉树详解(上篇)
    AJAX & Axios & JSON (外加JSON数据格式案例)
    基于SSM的宿舍管理系统(有报告)。Javaee项目。
    Anaconda中利用conda创建、激活、删除、添加新环境
    redis作为MongoDB的缓存在线实时去重
    《Linux内核精通》笔记参考目录
    Python界面编辑器Tkinter布局助手 使用体验
    【Azure 架构师学习笔记】-Azure Storage Account(7)- 权限控制
  • 原文地址:https://blog.csdn.net/sunhuaqiang1/article/details/136183331