Windows Bridge for iOS: Let’s open this up
(原文翻译过来的,原文链接http://blogs.windows.com/buildingapps/2015/08/06/windows-bridge-for-ios-lets-open-this-up/)
这里我带大家深入了解一下Windows bridge for iOS(以前叫Project Islandwood)是什么、它如何使iOS开发者在Windows下使用他们现成的代码和功能以及我们决定将这个项目做成开源的原因。
正如Kevin Gallo所说,我们目前只是发布了一个简单版本,最后版本将会在今年秋天发布。这个开发工作还在进行中,我们在4月份的Build大会上展示的一些元素还没有准备好或者说还在初始阶段。目前的发布版本支持在x86和x64的Windows10和Windows8.1,到秋天的时候我们会将更多的功能发布出来。
对于那些刚刚加入我们的朋友来说,Windows bridge for iOS目的是让iOS开发者能够使用现成的OC代码和功能来创建Windows应用。为了实现这个目的,bridge包括4个部分:
Objective-C编译器:为了承载更多的功能,VS将包括一个懂得如何将OC代码编译成UWP应用的编译器。当前我们在GitHub上提供了这个编译器的早期版本,但是并不提供开源代码。这个编译器最终会在今年秋天更新到VS2015上面。
Objective-C runtime: 除了编译器,我们的OC runtime将给开发者提供一些语言特性,比如消息派发、代理授权以及自动引用计数。
iOS API头文件/库:依赖于OC API,我们提供大量的iOS API的兼容性。当你开始使用bridge并且发现某个API还不支持或者有提升空间的可能,我们欢迎你的贡献和评论
VS IDE集成:最后,我们提供工具,让开发者将他们的Xcode项目导入Windows开发者工具(VS2015)和SDK中。
在build大会上,我们操作了一下bridge,让开发者第一次见到bridge的神奇之处。现在,我很愿意向大家展示一下目前GitHub中发布的版本中拥有的新的特征。
为什么这个bridge不是一个端口?
我们的目标不是简单的让iOS应用运行在Windows平台上。相反,我们的目标是帮助开发者尽可能使用他们现成的代码和知识来创建好的Windows应用。我们当然会继续努力提升iOS的兼容性,但是更重要的是你可以利用bridge做更多的事情。
为了实现这个目的,有三个准则来决定这个bridge的结构和设计:
所有Windows API的接入:使得在OC代码中使用Windows API更容易
iOS兼容性:驱动开发者尽可能重复利用现成的iOS代码
没有沙箱:iOS和Windows API在一起工作
我们第一个准则尤其重要,这是因为Windows有很丰富的功能API集合,而且集合持续扩大和完善。如果当前发布的版本不支持你需要的特定的功能,我们不会让你在下次更新时感觉受阻,相反地,我们更愿意让你轻松地使用相应的Windows API并无缝集成到你的代码中。
第三个和第一个准则是相互的——如果API集合各自处于沙箱中,调用所有Windows API的能力会受到严重影响,这也会严重限制开发者使用OC创建好的Windows应用。让我们一起来近距离看看我们如何保证这些没有问题,无论是在代码级别还是UI级别。
当Windows和OC API相遇
正如Build大会上介绍的那样,这个bridge使用了一个定制的编译器(clang+cl)来编译OC源代码,生成的目标文件通过微软的链接器链接到一起。这个方法可以很好的让OC以及C++/CX更好的运行在一起。他们可以在一个项目中共存,并且使用C或者C++接口调用另外一种代码函数。
这个方法很有效,但是有点复杂。由于clang不能理解CX的扩展,而后者将被用来调用Windows API,那么为了你可以使用所有的UWP API集,你就需要创建.cpp文件,然后手动将OC和C++/CX连接起来。尽管这个可以很好的实现,但是我们相信我们可以做的更好,于是我们就想出了映射的概念。
对于那些不熟悉映射的开发者们来说,Miguel de lcaza在他的博客里面详细讲述了相关内容。简而言之,映射就是微软将一个Windows API映射到一个新的编程语言。我们采纳这种方式,并且成功让开发者可以从OC中直接使用Windows的API。目前,bridge已经可以使用一些API,我们的目标是拓展到全部的API。
作为一个例子,我们来测试一下如何在应用中异步使用一个浏览器。使用该bridge,你可以使用两种方法实现它:
选项1 (在C++/CX代码中使用)
auto uri = ref new Windows::Foundation::Uri("http://www.example.com");
concurrency::task<bool> launchUriOperation(Windows::System::Launcher::LaunchUriAsync(uri));
launchUriOperation.then([](bool success)
{
if (success)
{
// URI launched
}
else
{
// URI launch failed
}
});
选项2 (在OC代码中使用同一个API)
[WSLauncher launchUriAsync:[WFUri createUri:@“http://www.example.com/”] success:nil failure:nil];
(OC代码有可能提供处理异步调用成功或者失败的情况)
在这个例子中,我们不仅使用了多个类,比如 Windows::System(“Launcher”)和Windows::Foundation(“Uri”),而且我们传递了一个NSString类型的值,而映射系统神奇的将它当成HSTRING类型传递给下面的runtime。其他的如IVectors和IVectorViews会被分别当成NSMutableArrays和NSArrays,其他对于iterators, enumerators, maps的相似匹配会陆续发布。无论在UWP或者OC内,对象的生存时间通过开发者早已习惯的同一个自动引用计数语义来管理。
还有很多内容等待发布,我再重申一遍,还有许多功能正在开发。同时,看看我们在GitHub上提供的一些例子,从实际和细节中了解更多关于bridge的内容。
XAML和UIKit:最后还是在一起了
既然你可以在OC中调用Windows API,我们不想限制你使用API集合。对于iOS/UIKit元素来说,整个应用都使用XAML进行排版,而不是分别使用排版器。几乎在iOS应用的每一个View中都使用的CALayers会被绑定到相应的XAML元素。
所以假如你的应用想要播放一些视频,但是目前iOS bridge不支持MPMoviePlayerController。利用这个机制,你可以创建一个XAML MediaElement,打包进一个CALayer,然后打包这层进到一个视图中,并把这个视图放到你的其他UIView中。非常简单,而且你所有的动画和变化仍然可以对这个元素正常工作,就像对其他元素一样。
// WXCMediaElement is the Objective-C projection of // Windows::UI::Xaml::MediaElement WXCMediaElement *mediaElement = [WXCMediaElement create]; mediaElement.autoPlay = YES; CALayer *mediaElementLayer = [CALayer layer]; [mediaElementLayer setFrame:CGRectMake(10, 10, 320, 240)]; [mediaElementLayer setContentsElement: mediaElement]; mediaElement.source = [WFUri createUri: @"ms-appx:///myvideo.mp4"]; // Now we just add the layer to be part of a UIView [[containingView layer] addSublayer: mediaElementLayer];
我们长期的目标是在SDK中包含大多数常见类。我们欢迎开发者的贡献。同时,我们会让开发者更容易使用XAML控制,尤其在UIKit等效元素目前还不支持或者XAML控制在Windows环境下仍然显示比较“简单”的情况下。
展望
Bridge源代码已经放在了http://www.github.com/Microsoft/WinObjC/上。我们的旅程才刚刚开始。我们会和开发者一起提升iOS bridge,帮助iOS开发者将他们的代码导入UWP上。目前,我们分享了SDK的预览版,该预览版适用于x86和x64架构的Windows 10 和Windows 8.1平台。在这个夏天,我们会添加编译优化和对ARM(也就是对手机)的支持。
我们欢迎所有的反馈、建议、问题以及评论。如果你也想为这个项目出力,我们邀请你提交你的代码到GitHub上。你也可以通过以下多种方式找到我们开发团队:
Tweet @WindowsDev 并用#winobjc标记你的问题
在Stack Overflow上发布你的问题并打上winobjc标签
在IRC上访问#winobjc频道
我们期待你的参与,同时我们非常期待看到开发者创建的好的应用。
Windows Bridge for iOS: Let’s open this up的更多相关文章
- 最详细在Windows安装Xamarin.iOS教程
最详细在Windows安装Xamarin.iOS教程 来源:http://www.cnblogs.com/llyfe2006/articles/3098280.html 本文展示了如何设立Xamari ...
- Unity3D 4.3在Windows下打包iOS资源
想当年,想弄iOS的版本必须弄台mac机器,虽然一开始要弄iOS的时候觉得在mac上开发感觉挺高富帅的,但是做多了之后就觉得在mac上开发各种不方便.现在好了,Unity3D 4.3开始支持在Wind ...
- Windows下搭建IOS开发环境(一)
原文:http://blog.csdn.net/shangyuan21/article/details/18153605 我们都知道开发iPhone等ios平台的移动应用时需要使用Mac本,但是Mac ...
- Windows/Linux 生成iOS证书及p12文件
操作步骤 生成csr文件(通过OpenSSL命令) 生成mobileprovision文件(通过Apple开发者后台) 生成cer文件(通过Apple开发者后台) 生成P12文件(通过OpenSSL命 ...
- Windows环境下IOS APP打包上传AppStore详细流程
我们知道在上架苹果应用过程中,申请发布证书需要用到钥匙串,上传ipa需要用到xcode或Application loader提交构建版本,这都需要Mac苹果机. 本文介绍如何在Windows环境下申请 ...
- 在WINDOWS上开发IOS应用的方法
1,虚拟机上安装MAC系统,里面装XCODE 2,WINDOWS上安装code blocks,这个IDE可以直接在WIN上编译XCODE工程: 最新的IOS在windows环境下编译环境搭建记录
- 7步学会在Windows下上架iOS APP流程
之前用跨平台开发工具做了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发者账号,但没那么简单,还要用到Mac电脑的钥匙串申请发布证书和上传 ...
- Windows下生成IOS证书并发布APP安装到IPhone
目录: 一:生成证书 二:安装到IPhone 准备环境: 1.Appuploader(需要安装Java环境) 2.爱思助手 一.生成证书 1.1.打开appuploader后登陆开发者账号 1.2.点 ...
- Cheatsheet: 2015 08.01 ~ 08.31
Java Beginner's Guide to MVC with Spring Framework Exploring the Spring Web MVC for Web Application ...
随机推荐
- php在.php文件中设置php.ini,仅对当前文件有效
ini_set (PHP 4, PHP 5, PHP 7) ini_set — 为一个配置选项设置值 折叠返回值 成功时返回旧的值,失败时返回 FALSE. 折叠范例 <?php echo in ...
- [转]C++ list 类学习笔记
双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素 ...
- 1.3.1 switch 语句中的 String
switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Ja ...
- 自定义ORM框架(转转)
ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...
- wamp目录索引图片不显示
在wampserver安装目录下 \bin\apache\Apache2.2.21\conf\extra\httpd-autoindex.conf Alias /icons/ "c:/Ap ...
- Delphi XE7 开发ActiveX 及在IntraWeb下调试
最近学习DelphiXE7下Intraweb开发,Intraweb完全服务器端运行使得FastReport报表系统无法在客户端运行,当然网上也有一大堆解决方案,例如导出到PDF后,给出连接,让客户点击 ...
- ubuntu安装aircrack-ng/reaver/minidwep-gtk用来跑pin
按照下面安装方法,可以在Ubuntu 13.04中启动 minidwep.Tested with Ubuntu 13.04 1. Dependencies Code: sudo apt-g ...
- Baidu Map Web API 案例
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- IIS Server Farms集群负载
序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...
- [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)
问题 给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树. 初始思路 二叉搜索树高度平衡,意味着左右子树的高度要平衡.根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我 ...