应用示例如下:
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;
}
}
三方APP跳转至目标APP后,目标APP通过iOS原生层面`openURL`唤起APP,并通过桥接通信方式通知RN跳转至指定页面。
`Objective-C`发送通知方式如下。
[[NSNotificationCenter defaultCenter] postNotificationName:kEmmPushNotification object:data];
在`Objective-C`中,`NSNotificationCenter`是一个用于实现观察者模式的类。它允许不同的对象之间进行通信,当某个事件发生时,可以通过发送通知的方式通知其他对象。
在这个代码片段中,`[NSNotificationCenter defaultCenter]`表示获取默认的通知中心对象。`postNotificationName:kEmmPushNotification object:data`表示发送一个名为kEmmPushNotification的通知,并且传递了一个名为data的对象作为参数。
通过发送通知,其他对象可以注册成为观察者,并在接收到通知时执行相应的操作。
### 三、延伸阅读 OC函数与参数
`Object-C`的一个方法可以包含多个参数,除了第一个参数外,后面的所有参数都要写名字,这一点和其他的语言有很大的不同。
**多个参数的写法**
(方法数据类型) 函数名: (参数1数据类型) 参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ;
举个例子,一个方法的定义如下:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName;
函数实现如下:
-(void) setKids: (NSString *)myOldestKidName secondKid: (NSString *) mySecondOldestKidName thirdKid: (NSString *) myThirdOldestKidName{
大儿子 = myOldestKidName;
二儿子 = mySecondOldestKidName;
三儿子 = myThirdOldestKidName;
}
函数调用如下:
Kids *myKids = [[Kids alloc] init];
[myKids setKids: @”C大力” secondKid: @”C二力” thirdKid: @”C小力”];
再来一个实例:
-(int)changeColorToRed:(float)red green:(float)green blue:(float)blue;
函数调用:
[myColor changeColorToRed:5.0 green:2.0 blue:6.0];
需要注意的是,用冒号隔开的各个参数顺序是不能更改的。
另外,OC还具有以下特点:
1. `objective-c`使用 `nil` 来表示 `NULL`;
2. `objective-c`用 YES NO 来表示 true false;
3. `objective-c`用 `#import<stdio.h>` 而不是`#include<stdio.h>`来包含头文件;
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;
}
确实跟C很像吧。但是也不其然,objective-c是一个很好的面向对象的语言。跟C还是有挺多不同之处。
我们先实现一个简单的类。
// Sample.h
#import <Foundation/NSObject.h>
@interface Sample: NSObject {
int a;
}
-
(void) print;
-
(void) setA: (int)a;
@end
逐句解析下。
#import <Foundation/NSObject.h>
在objective-c中,所有的类都必须继承`NSObject`,这个概念很像Java里面的`Object`。
objective-c声明类的格式如下:
@interface className: baseClassName {
member variables;
}
member functions
@end
`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. `-/+`: 这个称做`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
使用这个类
#import “Sample.h”
int main( int argc, char* argv[] ) {
Sample* smp = [[Sample alloc] init];
[smp setA:1];
[smp print];
[smp release];
}
在`objective-c`中,每一个类对象都是一个指针,这和Java差不多(每个类的对象都用new声明)。`alloc`类似于C中的`malloc`, `init`是**NSObject**中的方法,用于初始化这个对象。如果实现了自己的初始化方法,也可以调用自己的初始化方法。
切记⚠️:使用完毕后,需要调用`release`释放空间。