DIYConduit 的创建是为了解决许多依赖 UIWebView 的 iOS 应用中存在的三个痛点
DIYConduit 简单地将这三项功能封装在一个简单的库中,具有简单的 API,让您继续您的业务。
轻松开始使用 DIYConduit 的最快方式是查看所包含的示例应用程序。XCode 项目文件可以在 example > conduit.xcodeproj
中找到。但对于那些今天穿上探险裤的人...继续阅读
YourViewController.h
#import <UIKit/UIKit.h>
#import "DIYConduit.h"
@interface YourViewController : UIViewController <DIYConduitDelegate>
@property (nonatomic, retain) IBOutlet DIYConduit *conduit;
@end
YourViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
[conduit setDelegate:self];
[conduit loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://my.awesomecats.com/index.html"]]];
}
- (void)conduit:(DIYConduit *)conduit receivedMessage:(NSString *)message
{
NSLog(@"%@", message);
}
index.html
<!doctype html>
<html>
<head>
<style type='text/css'>body { font-family: Helvetica; } h1 { color:#333; }</style>
</head>
<body>
<h1>Conduit Demo</h1>
<script>
document.addEventListener('WebViewJavascriptBridgeReady', onBridgeReady, false);
function onBridgeReady() {
WebViewJavascriptBridge.setMessageHandler(function(message) {
var el = document.body.appendChild(document.createElement('div'));
el.innerHTML = message;
});
WebViewJavascriptBridge.sendMessage('hello from the JS');
var button = document.body.appendChild(document.createElement('button'));
button.innerHTML = 'Click me to send a message to ObjC';
button.onclick = button.ontouchup = function() { WebViewJavascriptBridge.sendMessage('hello from JS button'); };
}
</script>
</body>
</html>
通过 WebViewJavascriptBridge
对象上的 sendMessage
函数处理从 JS 到 Objective-C 的通信。此函数只能在 WebViewJavascriptBridgeReady
事件之后调用。
document.addEventListener('WebViewJavascriptBridgeReady', onBridgeReady, false);
function onBridgeReady() {
WebViewJavascriptBridge.sendMessage('Hello from the magical land of Javascript. Unicorns! Rainbows! Robots! Substack!');
}
通过使用代理方法处理从 JS 收到的消息。
- (void)conduit:(DIYConduit *)conduit receivedMessage:(NSString *)message
{
NSLog(@"%@", message);
}
通过 sendMessage
方法处理从 Objective-C 到 JS 的通信。此方法可以在任何时候调用,尽管消息将在收到前在 WebView 中排队。
[conduit sendMessage:@"Hello from Objective-C. *Beep* *Buzz* ... *Ding!*"];
与从 JS 发送消息的方式类似,消息在通过 setMessageHandler
调用 WebViewJavascriptBridgeReady
之后接收。
document.addEventListener('WebViewJavascriptBridgeReady', onBridgeReady, false);
function onBridgeReady() {
WebViewJavascriptBridge.setMessageHandler(function (message) {
alert(message);
});
}
当使用普通的 UIWebView 时,自定义标头可能会有些麻烦,因此 DIYConduit 提供了创建和删除自定义标头的便利方法,同时通过请求保持它们。可以在任何需要时添加和删除头,并将在下一个 HTTP 请求开始时立即反映和持久化。此外,通过通过桥梁进行一些javascript改造,头在 AJAX 请求期间保持持久。
[conduit addHeader:@"x-some-header" withValue:@"foo"];
[conduit removeHeader:@"x-something-else"];
- (void)loadRequest:(NSURLRequest *)request;
- (void)loadHTMLString:(NSString *)html baseURL:(NSURL *)baseURL;
- (void)addHeader:(NSString *)key withValue:(NSString *)value;
- (void)removeHeader:(NSString *)key;
- (void)sendMessage:(NSString *)message;
- (void)resetMessageQueue;
- (void)conduit:(DIYConduit *)conduit receivedMessage:(NSString *)message;
@property (nonatomic, assign) id <DIYConduitDelegate> delegate;
@property (nonatomic, retain) UIWebView *webView;
@property (nonatomic, retain) NSMutableDictionary *headers;
从v0.3.0版本开始,Conduit使用了ARC。如果你在一个不使用自动引用计数(ARC)的项目中包含DIYConduit,你需要在所有DIYConduit源文件上设置-fobjc-arc
编译器标志。要在Xcode中这样做,请转到你的活动目标并选择“构建阶段”选项卡。现在选择所有DIYConduit源文件,按Enter,输入-fobjc-arc
然后点击“确定”以启用DIYConduit的ARC。
Conduit的Objective-C到JS桥基于Marcus Westin,Stepan Generalov和Sergio Campamá开发的WebViewJavascriptBridge。