第九章:特定于平台的API调用(一)

简介:

紧急情况已经出现。任何玩过上一章的MonkeyTap游戏的人都会很快得出结论,它迫切需要一个非常基本的增强功能,而且它根本不可能在没有它的情况下存在。
MonkeyTap需要声音。
它不需要非常复杂的声音 - 伴随着四个BoxView元素的闪光,只需要几声嘟嘟声。但是Xamarin.Forms API不支持声音,所以声音不是我们可以通过几个API调用添加到MonkeyTap的东西。支持声音需要有点像Xamarin.Forms来利用平台特定的声音生成设施。弄清楚如何在iOS,Android和Windows Phone中发出声音是很难的。但是,Xamarin.Forms程序如何调用各个平台呢?
在解决声音的复杂性之前,让我们通过一个更简单的例子来研究制作平台特定API调用的不同方法。本章中显示的前三个短程序在功能上完全相同:它们都显示由底层平台操作系统提供的两个微小信息项,显示运行程序的设备模型和操作系统版本。

共享资产项目中的预处理

正如您在第2章“应用程序剖析”中所了解到的,您可以使用共享资产项目(SAP)或可移植类库(PCL)来获取所有三个平台通用的代码。 SAP包含在平台项目之间共享的代码文件,而PCL将公共代码包含在只能通过公共类型访问的库中。
从共享资产项目访问平台API比从可移植类库更简单,因为它涉及更传统的编程工具,所以让我们首先尝试这种方法。 您可以使用第2章中描述的过程使用SAP创建Xamarin.Forms解决方案。然后,您可以将基于XAML的ContentPage类添加到SAP,就像将其添加到PCL一样。
这是显示平台信息的项目的XAML文件,名为PlatInfoSap1:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="PlatInfoSap1.PlatInfoSap1Page">
    <StackLayout Padding="20">
        <StackLayout VerticalOptions="CenterAndExpand">
            <Label Text="Device Model:" />
            <ContentView Padding="50, 0, 0, 0">
                <Label x:Name="modelLabel"
                       FontSize="Large"
                       FontAttributes="Bold" />
            </ContentView>
        </StackLayout>
        <StackLayout VerticalOptions="CenterAndExpand">
            <Label Text="Operating System Version:" />
            <ContentView Padding="50, 0, 0, 0">
                <Label x:Name="versionLabel"
                       FontSize="Large"
                       FontAttributes="Bold" />
            </ContentView>
        </StackLayout>
    </StackLayout>
</ContentPage>

代码隐藏文件必须为modelLabel和versionLabel设置Text属性。
共享资产项目中的代码文件是各个平台中代码的扩展。 这意味着SAP中的代码可以使用C#预处理程序指令#if,#elif,#else和#endif以及为这三个平台定义的条件编译符号,如第2章和第4章所示。这些符号是:

  • IOS 对应 iOS
  • ANDROID 对应 Android
  • WINDOWS_UWP 对应 Universal Windows Platform
  • WINDOWS_APP 对应 Windows 8.1
  • WINDOWS_PHONE_APP 对应 Windows Phone 8.1

当然,获取模型和版本信息所涉及的API对于三个平台是不同的:

  • 对于iOS,请使用UIKit名称空间中的UIDevice类。
  • 对于Android,请在Android.OS命名空间中使用Build类的各种属性。
  • 对于Windows平台,请使用Windows.Security.ExchangeActiveSyncProvisioning命名空间中的EasClientDeviceInformation类。

这是PlatInfoSap1.xaml.cs代码隐藏文件,显示了如何根据条件编译符号设置modelLabel和versionLabel:

using System;
using Xamarin.Forms;
#if __IOS__
using UIKit;
#elif __ANDROID__
using Android.OS;
#elif WINDOWS_APP || WINDOWS_PHONE_APP || WINDOWS_UWP
using Windows.Security.ExchangeActiveSyncProvisioning;
#endif
namespace PlatInfoSap1
{
    public partial class PlatInfoSap1Page : ContentPage
    {
        public PlatInfoSap1Page ()
        {
            InitializeComponent ();
#if __IOS__
            UIDevice device = new UIDevice();
            modelLabel.Text = device.Model.ToString();
            versionLabel.Text = String.Format("{0} {1}", device.SystemName, 
 device.SystemVersion);
#elif __ANDROID__
            modelLabel.Text = String.Format("{0} {1}", Build.Manufacturer, 
 Build.Model);
            versionLabel.Text = Build.VERSION.Release.ToString();
#elif WINDOWS_APP || WINDOWS_PHONE_APP || WINDOWS_UWP
            EasClientDeviceInformation devInfo = new EasClientDeviceInformation();
            modelLabel.Text = String.Format("{0} {1}", devInfo.SystemManufacturer, 
 devInfo.SystemProductName);
            versionLabel.Text = devInfo.OperatingSystem;
#endif
        }
    }
}

请注意,这些预处理程序指令用于选择不同的using指令以及调用特定于平台的API。 在像这样简单的程序中,您可以简单地将命名空间包含在类名中,但是对于更长的代码块,您可能希望使用指令。
当然它有效:
201807122045390351

这种方法的优点是您可以在一个位置拥有三个平台的所有代码。 但代码清单中的预处理程序指令 - 让我们面对它 - 相当丑陋,它们又回到了编程的早期时代。 使用预处理程序指令对于简短且不太频繁的调用(例如此示例)可能看起来不那么糟糕,但是在较大的程序中,您需要处理特定于平台的代码块和共享代码,并且可以轻松地执行大量预处理程序指令? 变得混乱。 预处理程序指令应该用于少量修复,通常不作为应用程序中的结构元素。
让我们尝试另一种方法。

目录
相关文章
|
2月前
|
小程序 前端开发 JavaScript
视觉智能平台常见问题之抠人脸的api如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
33 3
|
12天前
|
机器学习/深度学习 人工智能 API
人工智能平台PAI产品使用合集之机器学习PAI-EAS部署好后,服务的公网API和URL怎么配置
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2月前
|
搜索推荐 API
Email API Service平台有哪些?3大API接口平台对比
本文对比了三个Email API Service:AokSend、Mailgun和Postmark。AokSend提供高效邮件服务,其API适用于营销和通知邮件;Mailgun的API灵活强大,支持多种语言;Postmark专注于Transactional邮件,API设计简洁。每个平台都提供详尽的文档和支持,用户可根据需求选择。
|
2月前
|
机器学习/深度学习 API 计算机视觉
视觉智能平台常见问题之获取人脸皮肤的颜色Api如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
19 0
|
2月前
|
数据采集 供应链 前端开发
电商企业如何构建一站式数字化供应链体系|API接口实现淘宝/京东/1688多平台商品采集+上传一站式供应链系统搭建
网络时代,企业面临转型。如今进入数字化时代,企业再次面临重大变革,全面实现数字化、智能化已是当务之急。公司将继续良性发展,请记住16个字:精简流程、降低成本、提高效率、智慧管理。主流电商平台API商品数据采集接口,不但可以在商品采集上为供应链提供大量商品,同时我们也可以通过申请官方商品上传商品发布API接口,实现商品的多平台发布。
|
2月前
|
API 开发者
1688阿里巴巴中国站平台 API接口获取商品详情 接入文档说明
1688(阿里巴巴批发网)的API接入文档是专为开发者提供的,用于指导如何集成和使用1688平台提供的API接口。这些API接口可以帮助开发者实现各种功能,如商品搜索、订单管理、用户认证等。
|
3月前
|
人工智能 Serverless API
AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
AI 绘画平台难开发,难变现?试试 Stable Diffusion API Serverless 版解决方案
|
弹性计算 Java API
API经济最主要是学会调用API
众所周知,阿里云提供了全方位、多层次的云计算产品体系。阿里巴巴技术委员会主席王坚博士说过,要让云计算像水电一样方便获得。为了开发者无缝衔接阿里云的众多服务,将它们集成到自己的应用系统,阿里云开放了API和用来访问API的工具SDK。
2436 0
|
4天前
|
JSON 搜索推荐 数据挖掘
电商数据分析的利器:电商关键词搜索API接口(标题丨图片丨价格丨链接)
淘宝关键词搜索接口为电商领域的数据分析提供了丰富的数据源。通过有效利用这一接口,企业和研究人员可以更深入地洞察市场动态,优化营销策略,并提升用户体验。随着电商平台技术的不断进步,未来的API将更加智能和个性化,为电商行业带来更多的可能性。
|
11天前
|
存储 缓存 运维
DataWorks操作报错合集之DataWorks根据api,调用查询文件列表接口报错如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
22 1