`
jsntghf
  • 浏览: 2542588 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

程序间通信的实现

    博客分类:
  • iOS
阅读更多

在iOS里,程序之间都是相互隔离的,目前并没有一个有效的方式来做程序间通信,幸好iOS程序可以很方便的注册自己的URL Scheme,这样就可以通过打开特定URL的方式来传递参数给另外一个程序。

 

至于,如何注册自己的URL Scheme,可以参考:自定义URL Scheme

 

下面,看一个具体的示例。

 

假设有两个应用:A和B,A应用有两个UITableView,一个是字母类型的,另一个是数字类型的,B应用有两个按钮,一个用来打开A应用的字母列表,另一个用来打开A应用的数字列表,其中,A应用的Info.plist信息如下:



 

A应用的所有代码如下:

 

NavigationAppDelegate.h

 

#import <UIKit/UIKit.h>

@class NavigationViewController;

@interface NavigationAppDelegate : NSObject <UIApplicationDelegate> {
	UIWindow *window;
	UINavigationController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *viewController;

@end

 

NavigationAppDelegate.m

 

#import "NavigationAppDelegate.h"
#import "NavigationViewController.h"
#import "NumberViewController.h"

@implementation NavigationAppDelegate

@synthesize window;
@synthesize viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
	NavigationViewController *nav = [[NavigationViewController alloc] init];
	viewController = [[UINavigationController alloc] initWithRootViewController:nav];
	[self.window addSubview:viewController.view];
	[self.window makeKeyAndVisible];
	[nav release];
	return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
	if ([[url host] isEqualToString:@"com.aurora.nav"]) {
		NSString *viewId = [[url query] substringFromIndex:[[url query] rangeOfString:@"viewId="].location + 7];
		if ([viewId isEqualToString:@"letters"]){
			NavigationViewController *nav = [[NavigationViewController alloc] init];
			[self.viewController pushViewController:nav animated:YES];
			[nav release];
		} else {
			NumberViewController *nav = [[NumberViewController alloc] init];
			[self.viewController pushViewController:nav animated:YES];
			[nav release];
		}
	}
	return YES;
}

- (void)dealloc {
	[viewController release];
	[window release];
	[super dealloc];
}

@end

 

NavigationViewController.h

 

#import <UIKit/UIKit.h>

@interface NavigationViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
	NSArray *array;
}

@property(nonatomic, retain) NSArray *array;
@end

 

NavigationViewController.m

 

#import "NavigationViewController.h"

@implementation NavigationViewController

@synthesize array;

- (void)viewDidLoad {
	[super viewDidLoad];
	self.title = @"Letters";
	NSArray *letters = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", nil];
	self.array = letters;
	[letters release];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
	return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
	return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	
	static NSString *CellIdentifier = @"Cell";
	
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
	if (cell == nil) {
		cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
	}
	
	cell.textLabel.text = [array objectAtIndex:[indexPath row]];
	
	return cell;
}

- (void)didReceiveMemoryWarning {
	[super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
	array = nil;
}

- (void)dealloc {
	[array release];
	array = nil;
	[super dealloc];
}

@end

 

NumberViewController.h

 

#import <UIKit/UIKit.h>

@interface NumberViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
	NSArray *array;
}

@property(nonatomic, retain) NSArray *array;

@end

 

NumberViewController.m

 

#import "NumberViewController.h"

@implementation NumberViewController

@synthesize array;

- (void)viewDidLoad {
	[super viewDidLoad];
	self.title = @"Numbers";
	NSArray *numbers = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];
	self.array = numbers;
	[numbers release];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
	return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
	return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	
	static NSString *CellIdentifier = @"Cell";
	
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
	if (cell == nil) {
		cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
	}
	
	cell.textLabel.text = [array objectAtIndex:[indexPath row]];
	
	return cell;
}

- (void)didReceiveMemoryWarning {
	[super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
	array = nil;
}

- (void)dealloc {
	[array release];
	array = nil;
	[super dealloc];
}

@end

 

B应用的所有代码如下:

 

RequestViewController.h

 

#import <UIKit/UIKit.h>

@interface RequestViewController : UIViewController {
	
}

- (IBAction) goToLetters;
- (IBAction) goToNumbers;

@end

 

RequestViewController.m

 

#import "RequestViewController.h"

@implementation RequestViewController

- (IBAction) goToLetters{
	NSString *str = @"nav://com.aurora.nav?viewId=%@";
	NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:str, @"letters"]];
	[[UIApplication sharedApplication] openURL:url];
}

- (IBAction) goToNumbers{
	NSString *str = @"nav://com.aurora.nav?viewId=%@";
	NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:str, @"numbers"]];
	[[UIApplication sharedApplication] openURL:url];
}

@end

 

分享到:
评论

相关推荐

    电信设备-一种通过进程间通信实现软件日志实时监控的方法.zip

    本文档“一种通过进程间通信实现软件日志实时监控的方法”深入探讨了如何利用进程间通信(IPC,Inter-Process Communication)技术来达到这一目标。下面将详细阐述这个主题。 首先,我们需要理解什么是进程间通信。...

    毕业设计,包含简单的内存管理、进程调度、进程间通信实现.zip

    这个"毕业设计,包含简单的内存管理、进程调度、进程间通信实现.zip"文件很可能是一个学生或研究者为了理解操作系统核心概念而创建的一个小型模拟系统。下面我们将深入探讨这三个关键知识点。 1. 内存管理: 内存...

    socket 实现进程间通信

    本文将深入探讨如何利用socket来实现在同一台机器上三个进程间的通信,同时涉及select()函数、信号处理以及进程重启的技术。 首先,让我们理解什么是socket。Socket是网络编程中的接口,它允许应用程序发送和接收...

    基于java的进程间异步通信系统的设计与实现.pdf

    总结来说,本文提出的基于Java的进程间异步通信系统在设计上充分考虑了分布式应用的特性,通过优化的通信架构和智能的消息处理机制,实现了高效的进程间通信。该系统不仅提高了通信效率和可靠性,还为分布式应用的...

    利用消息队列实现进程间通信

    本示例中,我们关注的是利用消息队列这一特定的IPC机制,来实现在Linux系统下的进程间通信。消息队列提供了异步通信的能力,使得进程可以在不同时刻发送和接收消息,而无需相互等待。 首先,我们有两个进程,进程A...

    linux进程间通信与同步.pdf

    在Linux这样的虚拟内存系统中,每个进程都有自己的地址空间,因此进程间通信是通过专门的机制来实现的。而在像UCOS这样的扁平内存系统中,所有任务共享相同的地址空间,使得进程间通信与同步机制可以在同一地址空间...

    MFC程序通过SendMessage或PostMessage实现进程间通信,实现很简单

    MFC(Microsoft Foundation Classes)是微软提供的一个C++库,用于简化Windows应用程序开发,包括对进程间通信的支持。本篇文章将深入探讨如何使用MFC中的`SendMessage`和`PostMessage`函数来实现简单的进程间通信。...

    linux下进程间通信的研究与实现

    进程间通信(IPC,Inter-Process Communication)在Linux操作系统中扮演着至关重要的角色,尤其在多任务和多线程环境下。随着计算机技术的发展,进程间的协作与数据交换成为提升系统效率和灵活性的关键。本文将详细...

    C#与C++进程间通信

    本示例以“C#与C++进程间通信”为主题,利用命名管道(Named Pipe)作为通信媒介,实现了不同类型数据结构的高效传输。 命名管道是一种在操作系统中提供半双工或全双工通信的机制,适用于在同一台计算机上的进程间...

    使用 AIDL实现进程间通信

    总结来说,AIDL是Android中实现进程间通信的强大工具,它简化了服务的创建和调用,让开发者能够构建分布式系统,实现应用程序间的深度协作。理解并熟练掌握AIDL的使用,对于提升Android应用的复杂性和可扩展性至关...

    VC利用管道和多线程实现进程间通信

    VC利用管道和多线程实现进程间通信 VC++环境下利用管道和线程实现进程间通信的技术是指在Windows操作系统中,使用Visual C++语言,通过创建管道和线程来实现进程之间的通信。这种技术可以在不同的进程之间实现信息...

    进程间通信源码

    进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的技术,允许不同进程之间交换数据...通过对这些通信机制的深入理解和应用,开发者能够更好地设计和实现多进程应用程序,提高系统的并行性和效率。

    进程间通信例子

    进程间通信(Inter-Process Communication, IPC)是操作系统中一种重要的技术,允许不同进程之间交换数据...理解并熟练掌握这些通信方式对于开发多进程应用程序至关重要,因为它能帮助实现进程间的协同工作和数据交换。

    VC利用内存映射实现进程间通信

    本文将详细探讨如何通过VC++使用内存映射来实现进程间通信。 内存映射是一种技术,它允许一个文件或部分文件被映射到进程的虚拟地址空间,使得多个进程可以同时访问同一块物理内存,从而实现数据共享。在Windows中...

    C#实现进程间通信(使用消息队列实现)

    标题"**C#实现进程间通信(使用消息队列实现)**"主要探讨的是如何使用C#语言通过消息队列来实现在不同进程之间的通信。这种方法适用于那些需要进程独立性和消息缓冲的应用场景。 在C#中,我们可以使用System....

    UNIX网络编程_卷2_进程间通信

    本书详细介绍了UNIX系统中进程间通信(IPC)的各种形式,这些通信机制对于提高UNIX程序性能至关重要,同时是开发不同主机间网络应用程序的基础。 书中首先从Posix IPC和System V IPC的内部结构开始讨论。Posix IPC...

    UNIX网络编程 第2版 第2卷 进程间通信

    《UNIX网络编程 第2版 第2卷 进程间通信》是UNIX系统下进行网络编程不可或缺的经典著作,尤其在深入理解和实践进程间通信(IPC,Inter-Process Communication)方面提供了丰富的知识和技术指导。本书详细阐述了如何...

    Linux进程间通信

    在Linux操作系统中,进程间通信(IPC,Inter-Process ...总结来说,Linux进程间通信是实现多进程协同工作、提高系统效率的关键。理解并灵活运用各种IPC方式,有助于我们设计出高效、可靠的多线程和多进程应用程序。

    进程间通信--操作系统实验

    首先,让我们详细了解进程通信的基本原理。在操作系统中,进程是程序的一次执行实例,每个进程都有自己的内存空间,相互独立运行。当需要两个或多个进程协作完成任务时,就需要借助IPC来实现信息传递。这种通信可以...

    通过Windows窗口消息实现 QT进程间通信

    在编程领域,进程间通信(IPC, Inter-Process Communication)是多个独立运行的程序之间交换数据的重要手段。在Windows操作系统环境下,利用Windows窗口消息机制进行进程间通信是一种常见的方法,尤其当涉及到跨语言...

Global site tag (gtag.js) - Google Analytics