DIYConduit 0.3.0

DIYConduit 0.3.0

测试已测试
语言语言 Obj-CObjective C
许可协议 Apache 2
发布最后发布2014年12月

未声明 维护。



  • 作者
  • Andrew Sliwinski

Conduit

从 JS 到 Objective-C... 再返回

DIYConduit 的创建是为了解决许多依赖 UIWebView 的 iOS 应用中存在的三个痛点

  • 从 Javascript 到 Objective-C 的通信
  • 从 Objective-C 到 Javascript 的通信
  • 处理多个请求之间自定义 HTTP 标头

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>

从 JS 到 Objective-C

通过 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);
}

从 Objective-C 到 JS

通过 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);
    });
}

自定义 HTTP 标头

当使用普通的 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;

ARC

从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