2016-02-04 16:41:59 u010029229 阅读数 312
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8011 人正在学习 去看看 秦子恒
2016-08-21 15:34:42 huangshanfeng 阅读数 177
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8011 人正在学习 去看看 秦子恒

oc与swift混编

一、建立oc工程

这里写图片描述

二、OC调用Swift写的类

新建Swift类(Demo.swift)

这里写图片描述

代码块

//
//  Demo.swift
//  Test
//
//  Created by 1391 on 16/8/21.
//  Copyright © 2016年 cuilu. All rights reserved.
//

import UIKit

class Demo: NSObject {

    func goToTest()->String {
        return "start swift" 
    }
}

引用头文件

因OC调用swift 的头文件是系统自动生成的。(注意,系统设置的头文件,在工程中是看不到的。)
那如何找到这个头文件呢?
步骤:
选中targets->build settings
这里写图片描述
Product Module Name + Swift.h即为头文件
栗子:OcAndSwift-Swift.h

导入头文件

这里写图片描述

ViewController.m文件

#import "ViewController.h"
#import "OcAndSwift-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    TestSwift *testSwift = [[TestSwift alloc] init];
    NSString *str = [testSwift goToTest];
    NSLog(@"%@",str);

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

运行结果如下:
这里写图片描述

三、Swift调用OC写的类

ViewController.h文件

//
//  ViewController.h
//  Test
//
//  Created by 1391 on 16/8/21.
//  Copyright © 2016年 cuilu. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
+ (NSString *)gotoOc;
@end

ViewController.m文件

//
//  ViewController.m
//  Test
//
//  Created by 1391 on 16/8/21.
//  Copyright © 2016年 cuilu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
+ (NSString *)gotoOc{
    return @"goto coding";
}

@end

新建swift类(TestViewController.swift)

这里写图片描述

AppDelegate.m文件(使TestViewController.swift为根控制器)

//
//  AppDelegate.m
//  Test
//
//  Created by 1391 on 16/8/21.
//  Copyright © 2016年 cuilu. All rights reserved.
//

#import "AppDelegate.h"
#import "Test-Swift.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    UIWindow *window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];
    window.backgroundColor = [UIColor whiteColor];
    [window  makeKeyAndVisible];
    window.rootViewController = [[TestVeiwController alloc] init];
    return YES;
}

@end

引入OC头文件到Swfit(重要)

这里写图片描述

此后在swift中用oc了,用法请继续看

TestViewController.swift文件

//
//  TestVeiwController.swift
//  Test
//
//  Created by 1391 on 16/8/21.
//  Copyright © 2016年 cuilu. All rights reserved.
//

import UIKit

class TestVeiwController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        print(ViewController.gotoOc())

    }

}

运行结果如下:

这里写图片描述

2016-08-19 17:27:58 hbblzjy 阅读数 1533
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8011 人正在学习 去看看 秦子恒

Swift语言中,有很多封装类并没有,如果需要使用到,就需要桥接OC语言中的类,这时候就需要使用桥接头文件,一下是使用的步骤:

创建一个Swift项目Demo,然后新建一个OC语言的文件

如图:

创建一个BgImgView的类,选择对应的Object-C语言,点击Next按钮

会弹出提示框,询问是否需要配置一个桥接头文件,点击创建按钮(第三个)


这个时候会自动生成一个桥接头文件

现在开始在OC文件中添加需要使用的相关代码

.h文件

{
    id _targetT;
    SEL _selT;
}

//不带参数的行数
-(void)testT;
//待返回参数
-(NSString *)nameStr;
//添加一个点击事件方法,模仿按钮的点击
-(void)addTarget:(id)targetTT withSelector:(SEL)selecTT;

.m文件

//不带参数的行数
-(void)testT
{
    NSLog(@"调用了testT方法。。。。");
}
//待返回参数
-(NSString *)nameStr
{
    return @"好好学习,天天向上";
}
//添加一个点击事件方法,模仿按钮的点击
-(void)addTarget:(id)targetTT withSelector:(SEL)selecTT
{
    _targetT = targetTT;
    _selT = selecTT;
    
    //是否交互
    self.userInteractionEnabled = YES;
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (_targetT)
    {
        [_targetT performSelector:_selT withObject:self];
    }
}

需要的代码写完后,需要在桥接文件中添加头文件,这里只写需要使用到的OC头文件即可,不需要把所有的OC文件都写上


然后在 .Swift 文件中使用,

//创建一个BgImgView对象
        let bgImgV = BgImgView.init(frame:CGRectMake(10, 100, 200, 100));
        bgImgV.image = UIImage.init(named: "22.jpg");
        
        //调用方法
        bgImgV.testT();
        
        //返回参数方法
        let nameStr = bgImgV.nameStr();
        NSLog("输出了。。。%@", nameStr);
        
        //添加点击事件
        bgImgV.addTarget(self, withSelector: #selector(ViewController.imgClick));
        
        self.view.addSubview(bgImgV);
        
    }
    
    func imgClick(imgV:BgImgView){
        NSLog("点击了图片。。。。。");
    }

最后输出效果:




2015-04-08 09:48:18 Hello_Hwc 阅读数 7690
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8011 人正在学习 去看看 秦子恒

原创Blog,转载请注明出处
blog.csdn.net/hello_hwc


前言:
最近在写博客的时候,Demo提供的都是OC的代码,对于Swift都有些生疏了,所以,最近可能会集中用Swift来提供Demo源码。

很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用。


第一步

创建一个空的工程
注意,语言选择Swift


第二步,创建bridging-header

这个文件的作用,就是把OC的接口暴露给Swift。有两种方式
方式一
创建一个OC文件,然后点击确定

弹出是否要创建Bridging-Header,点击确定,这样会生成三个文件,其中的一个就是我们要用的SwiftUseAFNetworkingDemo-Bridging-Header.h


方式二,创建任意头文件,然后在buildSetting里设置为bridging-header
创建一个头文件,命名为bridge(任意)

在build setting里设置


第三步,安装库(要提前安装Cocoa Pod)

然后,我的习惯是用命令行来修改这个文件
到工程的目录
3.1初始化pod

pod init

3.2 修改PodFile

vim Podfile

然后修改成如图

3.3安装库
这里可能等的时间有点长,等着就是了

pod install

3.4 重新打开工程,注意,要打开Pod的工程


第四步,在头文件中import


第五步,测试

完整代码

//
//  ViewController.swift
//  SwiftUseAFNetworkingDemo
//
//  Created by huangwenchen on 15/4/8.
//  Copyright (c) 2015年 huangwenchen. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    lazy var manager:AFURLSessionManager = {
        var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        var deaultmanager = AFURLSessionManager(sessionConfiguration: configuration);
        return deaultmanager;
        }()

    override func viewDidLoad() {
        super.viewDidLoad()
        var url = NSURL(string: "http://jsonplaceholder.typicode.com/posts")
        var request = NSURLRequest(URL: url!)
        var dataTask = manager.dataTaskWithRequest(request, completionHandler: { (response:NSURLResponse!, data:AnyObject!, error:NSError!) -> Void in
            NSLog("%@",data.description)
        })
        dataTask.resume()
    }
}

测试,库使用成功。


2018-08-07 13:53:00 weixin_34186128 阅读数 10
  • 微信h5支付开发-php开发微信h5支付demo

    会员免费看,http://edu.csdn.net/lecturer/842右侧可办理会员卡。微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131

    8011 人正在学习 去看看 秦子恒

代码地址如下:
http://www.demodashi.com/demo/12754.html

JS-OC-Swift

JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式

1.使用UIWebView,利用JavaScriptCore实现

2.使用WKWebView,利用WKScriptMessageHandler实现

3.使用第三方框架WebViewJavascriptBridge实现

部分效果图

sC0Ura6f25NfSRn2oyy.png

JavaScriptCore

JavaScriptCore介绍

JavaScriptCore框架是基于webkit中以C/C++实现的JavaScriptCore的一个包装,该框架让Objective-C和JavaScript代码直接的交互变得更加的简单方便,主要由下面几个类组成。

1.JSContext
JS执行的环境,同时也通过JSVirtualMachine管理着所有对象的生命周期,每个JSValue都和JSContext相关联并且强引用context。可以通过[webView valueForKeyPath:@”documentView.webView.mainFrame.javaScriptContext”]来从webview上获取相应的JSContext。

2.JSValue
JS对象在JSVirtualMachine中的一个强引用,其实就是Hybird对象。我们对JS的操作都是通过它。并且每个JSValue都是强引用一个context。同时,OC和JS对象之间的转换也是通过它。

3.JSManagedValue
JS和OC对象的内存管理辅助对象。由于JS内存管理是垃圾回收,并且JS中的对象都是强引用,而OC是引用计数。如果双方相互引用,势必会造成循环引用,而导致内存泄露。我们可以用JSManagedValue保存JSValue来避免。

4.JSVirtualMachine
JS运行的虚拟机,有独立的堆空间和垃圾回收机制。

5.JSExport
一个协议,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象只要实现这个JSExport协议就可以了。

在Swift中获取JS的context

context = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as? JSContext

注入JS需要的对象,对象命名与html中使用的保持一致.self是遵守了JSExport协议,也可是其他遵守协议的对象。

context?.setObject(self, forKeyedSubscript:  "OC" as NSCopying & NSObjectProtocol)

JS调用Swift的方法,在Swift中实现协议

@objc protocol JSDelegate :JSExport {
    //包含参数的func,需要注意参数名对函数名称的影响
    func showMessageToYou(_ message:String)
    
    /*
     对应html中“showAAndB”,此方法包含两个参数,需要在参数前加“_”
     func showA(_ aString: String, andB: String)
     func showAAndB(_ aString:String,_ bStr:String)
     以上两个方法等同
     */
    func showAAndB(_ aString:String,_ bStr:String)
    
    func doActionCallBack()
}

Swift调用JS的方法

let jsStr = String(format:"callback('%@')",(textField?.text)!)
self.context?.evaluateScript(jsStr)

OC中可使用block和实现JSExport协议两种方式实现,代码实现:

JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.context = context;
//注入JS需要的“OC”对象,该对象与html中的保持一致即可
self.context[@"OC"] = self;

WKScriptMessageHandler

初始化WKWebView后,添加供js调用oc/Swift的桥梁,这里的name对应WKScriptMessage中的name

webView.configuration.userContentController.add(_ scriptMessageHandler: WKScriptMessageHandler, name: String)

遵守协议WKScriptMessageHandler,实现以下方法,可实现JS把消息发送给OC/Swift。

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

OC/Swift调用JS

let jsStr = String(format:"callback('%@')",(textField?.text)!)
self.webView.evaluateJavaScript(jsStr as String, completionHandler: { (result:Any?, error:Error?) in
       print("error:",error as Any)
 })

WebViewJavascriptBridge

WebViewJavascriptBridge是一个Objective-C与JavaScript进行消息互通的第三方库,可以很方便的实现OC和Javascript互调的功能。WebViewJavascriptBridge实现互调的过程也容易理解,就是在OC环境和Javascript环境各自保存一个相互调用的bridge对象,每一个调用之间都有id和callbackid来找到两个环境对应的处理。从Github上下载源码之后,可以看到核心类主要包含如下几个:

WebViewJavascriptBridge_JS:Javascript环境的Bridge初始化和处理。负责接收OC发给Javascript的消息,并且把Javascript环境的消息发送给OC。

WKWebViewJavascriptBridge/WebViewJavascriptBridge:主要负责OC环境的消息处理,并且把OC环境的消息发送给Javascript环境。

WebViewJavascriptBridgeBase:主要实现了OC环境的Bridge初始化和处理。

初始化WKWebViewJavascriptBridge

self.webViewBridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];
[self.webViewBridge setWebViewDelegate:self];

JS调用OC需要注册事件

[self.webViewBridge registerHandler:@"handlerName" handler:^(id data, WVJBResponseCallback responseCallback) {
   //code
}];

OC调用JS

[self.webViewBridge callHandler:@"handlerName" data:@[textField.text] responseCallback:^(id responseData) {
        NSLog(@"%@",responseData);
 }];

html中需要放置以下代码

/*这段代码是固定的,必须要放到js中*/
function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
/*与OC交互的所有JS方法都要放在此处注册,才能调用通过JS调用OC或者让OC调用这里的JS*/
setupWebViewJavascriptBridge(function(bridge) {
     bridge.registerHandler('callback', function(data, responseCallback) {
        callback(data);
        responseCallback('js执行过了'+data);
    })
})

项目结构

bauuoZh5WOGkFcJ3h4A.pngJS与原生OC/Swift相互调用总结

代码地址如下:
http://www.demodashi.com/demo/12754.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Swift、C和C++混编

阅读数 590

没有更多推荐了,返回首页