ForYouAndMe 0.89.0

ForYouAndMe 0.89.0

giuslapeLeonardo Passeri 维护。



 
依赖关系
Moya/RxSwift~> 14.0.0
Moya-ModelMapper/RxSwift~> 10.0.0
AlamofireImage~> 4.1
RxCocoa~> 5.1.1
PureLayout~> 3.1.5
SVProgressHUD~> 2.2.5
TPKeyboardAvoiding~> 1.3.3
OAuthSwift~> 2.1.0
ReachabilitySwift~> 5.0.0
Validator~> 3.2.1
Firebase/Analytics~> 7.2.0
Firebase/Crashlytics~> 7.2.0
Firebase/Messaging~> 7.2.0
PhoneNumberKit= 3.3.1
CountryPickerView~> 3.1.2
BLZJapx/RxCodableMoya~> 3.0.0
UberSignature~> 1.0.3
RxSwiftExt~> 5.2.0
FYAMResearchKit~> 3.0.0
Charts~> 4.1.0
StepSlider~> 1.8.0
EVGPUImage2~> 0.2
 

  • 作者:
  • LeonardoPasseri

ForYouAndMe

[

](https://cocoapods.org.cn/pods/ForYouAndMe))
[

](https://cocoapods.org.cn/pods/ForYouAndMe))
[

](https://cocoapods.org.cn/pods/ForYouAndMe))

要求

iOS 13.0+

描述

ForYouAndMe 项目包含一个 Example Project,用于轻松构建和运行实现 ForYouAndMe 框架的 iOS 应用。遵循 Example Project 段落下的说明来构建和运行它。

ForYouAndMe 框架也作为 iOS CocoaPod 库提供,以便在从头创建的新项目中使用。遵循 从头创建学习应用 段落下的说明来构建和运行它。

示例项目

运行示例项目

  1. 克隆仓库。

  2. 在示例目录下运行 pod install

  3. 从 Firebase 控制台下载您的 Firebase 项目 GoogleService-Info.plist(请按照 https://firebase.google.com/docs/cloud-messaging/ios/client#upload_your_apns_authentication_key 中的说明操作)然后将其移动到 Example/ForYouAndMe 文件夹下。

  4. 使用最新版本的 XCode 打开 ForYouAndMe.xcworkspace不是 .xcodeproj 文件!)。

  5. 在 XCode 中左侧面板选择 ForYouAndMe 项目,选择 Signing & Capabilities 选项卡,并输入个人配置文件或选择 Automatically manage signing 并输入 Team

  6. Signing & Capabilities 选项卡上,还要确保您的应用 Bundle Identifier 与创建的 Firebase 应用 ID 一致。

  7. 使用 Mac 上的 FinderWindows 上的 Windows Explorer,导航到 /Example/ForYouAndMe 文件夹,并将 ProjectInfo_sample.plist 重命名为 ProjectInfo.plist

  8. 在 XCode 中打开 ProjectInfo.plist 文件,并使用以下内容填充属性值:

    1. api_base_url 是提供您的远程 API 服务器的基础 URL(例如:https://api.example.com )。

    2. oauth_base_url 是处理您对支持集成的 OAuth 身份验证的服务器的基础 URL(例如:https://oauth.example.com )。

    3. study_id 是您的研究在服务器上作为研究别名的标识符。

    4. pin_code_suffix(仅在需要使用 pin 登录的研究中需要)是您的研究所需的 pin 代码后缀,或者在您的研究不支持 pin 代码的情况下设置为 none

  9. 选择连接的 iPhone 设备或模拟器并运行应用。

  10. 在 XCode 中左侧面板选择 ForYouAndMe 项目,选择 General 选项卡,并在 Display Name 字段中输入您要在设备上显示的应用名称。

从头创建研究应用

以下说明假设您想在创建时全新安装 ForYouAndMe,使用接口设置中的 Storyboard 选项,以 Swift 作为语言。当然,此 SDK 与其他初始设置也兼容,但您需要更改项目。

创建一个新的 XCode 项目,选择 App 模板,然后按以下方式填写选项

  • Product Name:研究项目的名称

  • 团队:在 Apple 开发者控制台上定义的团队名称

  • 组织标识符:使用标准格式 com.company 的组织标识符

  • 捆绑标识符:这是一个只读字段,显示通过连接 组织标识符产品名称 创建的捆绑 id。 重要提示:这将是新应用的唯一标识符,用于在 App Store 上识别它。

  • 界面:选择 Storyboard

  • 语言:选择 Swift

  • 使用 Core Data:不勾选

  • 包含测试:勾选

单击 下一步 并选择项目位置。

ForYouAndMe 通过 CocoaPods 提供。要安装它,请在 终端 上按以下步骤操作

  1. 按照 https://cocoapods.org.cn/ 上的说明安装 CocoaPods

  2. 导航到项目文件夹并运行命令

    pod init

应该已经生成一个名为 Podfile 的文件。

3. 使用 Xcode 或其他文本编辑器打开 Podfile 并将内容替换为以下行

platform :ios, '13.0'
use_frameworks!

# ignore all warnings from all pods
inhibit_all_warnings!

# Pods for project
def available_pods
    pod 'ForYouAndMe'
end

target '<project_name>' do
    available_pods
    use_frameworks!
    
    target '<test_project_name>' do
        inherit! :search_paths
        # Pods for testing
    end
    
end

<project_name> 替换为您在项目创建步骤中输入的 产品名称

<test_project_name> 替换为已创建的测试项目,其默认名称为 <project_name>Tests,其中 <project_name>产品名称

保存修改后的文件。

4. 运行命令

pod install

5. 应在项目文件夹下生成一个名为 <project_name>.xcworkspace 的文件,使用 Xcode 打开它。

安装 ForYouAndMe 后,为了配置您自己的学习应用,还需要执行一些额外的步骤

功能

向您的应用添加以下功能

  1. 推送通知

  2. 访问 WiFi 信息

Info.plist

在 info.plist 文件中添加或编辑以下条目

  1. UIViewControllerBasedStatusBarAppearance 设置为 false

  2. UIUserInterfaceStyle 设置为 Light

  3. NSAppleMusicUsageDescription 设置为 $(PRODUCT_NAME) 在某些任务期间使用媒体库。

  4. NSBluetoothAlwaysUsageDescription 设置为 $(PRODUCT_NAME) 使用蓝牙与可穿戴设备连接。

  5. NSBluetoothPeripheralUsageDescription 设置为 $(PRODUCT_NAME) 使用蓝牙与可穿戴设备连接。

  6. NSCalendarsUsageDescription 设置为 $(PRODUCT_NAME) 在某些任务中使用日历。

  7. NSCameraUsageDescription 设置为 $(PRODUCT_NAME) 在某些任务中会捕捉照片和视频。

  8. NSContactsUsageDescription 设置为 $(PRODUCT_NAME) 在某些任务中使用联系人。

  9. NSLocationAlwaysAndWhenInUseUsageDescription 设置为 $(PRODUCT_NAME) 将会使用您的位置信息来验证信息,如您的行程距离和速度,如知情同意所描述。

  10. NSLocationWhenInUseUsageDescription 设置为 $(PRODUCT_NAME) 将会使用您的位置信息来验证信息,如您的行程距离和速度,如知情同意所描述。

  11. NSMicrophoneUsageDescription 设置为 $(PRODUCT_NAME) 在某些任务中会录制音频。

  12. NSMotionUsageDescription 设置为 $(PRODUCT_NAME) 将会使用您的运动数据来处理您的活动任务。

  13. NSSpeechRecognitionUsageDescription 设置为 $(PRODUCT_NAME) 在某些任务中使用语音识别。

  14. LSApplicationQueriesSchemes 设置一个字符串数组,包含:ourafitbittwitterinstagramgcm-ciq

以下是上述选项的 xml 版本示例

...
	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>oura</string>
		<string>fitbit</string>
		<string>twitter</string>
		<string>instagram</string>
		<string>gcm-ciq</string>
	</array>
	<key>NSAppleMusicUsageDescription</key>
	<string>$(PRODUCT_NAME) uses Media Library during certain tasks.</string>
	<key>NSBluetoothAlwaysUsageDescription</key>
	<string>$(PRODUCT_NAME) uses Bluetooth to connect with wearables.</string>
	<key>NSBluetoothPeripheralUsageDescription</key>
	<string>$(PRODUCT_NAME) uses Bluetooth to connect with wearables.</string>
	<key>NSCalendarsUsageDescription</key>
	<string>$(PRODUCT_NAME) uses Calendar during certain tasks.</string>
	<key>NSCameraUsageDescription</key>
	<string>$(PRODUCT_NAME) captures photos and video during certain tasks.</string>
	<key>NSContactsUsageDescription</key>
	<string>$(PRODUCT_NAME) uses Contacts during certain tasks.</string>
	<key>NSHealthShareUsageDescription</key>
	<string>$(PRODUCT_NAME) will use your health data for further analysis.</string>
	<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
	<string>$(PRODUCT_NAME) will use your location to verify information such as how far you travelled and the speed at which you travelled, as described in the informed consent.</string>
	<key>NSLocationWhenInUseUsageDescription</key>
	<string>$(PRODUCT_NAME) will use your location to verify information such as how far you travelled and the speed at which you travelled, as described in the informed consent.</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>$(PRODUCT_NAME) records audio during certain tasks.</string>
	<key>NSMotionUsageDescription</key>
	<string>$(PRODUCT_NAME) will use your motion data for your active tasks.</string>
	<key>NSSpeechRecognitionUsageDescription</key>
	<string>$(PRODUCT_NAME) uses Speech Recognition during certain tasks.</string>
	<key>UIUserInterfaceStyle</key>
	<string>Light</string>
	<key>UIViewControllerBasedStatusBarAppearance</key>
	<false/>

...

清理默认文件和设置

如果您在一个全新的项目中安装了 ForYouAndMe,那么您需要修复一些由 Xcode 生成的文件和设置(在本文写作时为版本 12.1)

从项目中

  1. 移除 Main.storyboard

  2. 移除 SceneDelegate.swift

  3. 移除 ViewController.swift

从 info.plist 文件中

info.plist 中移除 UIApplicationSceneManifest 条目。

在通用标签页中

  1. 设置iOS 13.0和iPhone。

  2. 清除主界面字段。

  3. 设备方向:纵向横向左横向右

在AppDelegate类中

  1. 删除所有标有UISceneSession生命周期的方法。

  2. 使用var window: UIWindow?添加一个名为window的实例变量。

项目信息

创建一个名为ProjectInfo.plist的plist文件并添加到项目中。在此文件中,添加以下条目

  1. api_base_url设置为提供远程API的服务器的基础URL。

  2. oauth_base_url设置为处理您的Oauth身份验证的基础URL。

  3. study_id设置为在您的服务器上记录的研究标识符。

  4. pin_code_suffix设置为研究所需的PIN码后缀,或者如果研究不支持PIN码,则为none

如何定制研究应用

Firebase

ForYouAndMe使用Firebase平台跟踪分析、检测崩溃和处理推送通知。在Firebase上创建一个项目,并将生成的GoogleService-info.plist文件添加到您的项目中。
然后设置您的Firebase项目以处理推送通知,方法是将您的应用的APNs身份验证密钥上传到Firebase项目设置(有关更多详细信息,请参见https://firebase.google.com/docs/cloud-messaging/ios/client#upload_your_apns_authentication_key)。

学习视频

您必须为您的应用提供介绍视频。此视频格式必须为mp4。将其命名为StudyVideo.mp4并添加到您的项目中。

图片

ForYouAndMe要求您向默认的Assets.xcassets文件提供一组特定的图片。框架需要的图片分为两大类:正常图片模板图片。前者的要求没有特定要求,而后者应提供为灰度图,因为它们将被用作模板图片,并且由框架根据当前研究的调色板进行着色。

正常图片列表

图片名称

描述

back_button_primary

用主颜色风格设计的按钮,通常位于页面页脚中,用于向后导航

camera_switch

用于在执行某些任务时切换前后相机的按钮(例如:视频日记)

checkmark

通用勾选图标

circular

用于视频播放器滑块的通用处理

clear_button

文本字段的清除图标

clear_circular

当处理器禁用时将在视频播放器滑块中使用的处理器。通常透明度即可达到效果。

close_circle_button

视频日记的丢弃按钮

edit

文本字段的编辑按钮

failure

通用失败标题图像

fitbit_icon

Fitbit设备图标

flash_off

视频录制禁用状态的闪灯图标

flash_on

视频录制启用状态的闪灯图标

fyam_logo_generic

代表您组织的通用标志图像

fyam_logo_specific

当前研究特定的组织标志图像

health_icon

健康应用权限图标

garmin_icon

Garmin设备图标

instagram_icon

Instagram图标

location_icon

位置权限图标

main_logo

当前研究标志

next_button_primary

主要用于前向导航、通常位于页面页眉的按钮,采用主要颜色设计

next_button_secondary_disabled

禁用模式下的次要颜色按钮,用于主要背景

next_button_secondary

用于主要背景的次要颜色按钮

oura_icon

Oura设备图标

push_notification_icon

推送通知权限图标

rescue_time_icon

Rescue time设备图标

star_empty

显示数据用的空星图像

star_fill

显示数据用的实心星图像

twitter_icon

Twitter图标

video_calendar

视频日记任务中显示的日历图标

video_pause

视频播放器的暂停按钮

video_play

视频播放器的播放按钮

video_record

视频播放器的录制按钮

video_recorded_feedback

视频日记任务中显示的成功录制图标

video_resume_record

视频播放器的继续录制按钮

video_time

视频日记任务中当前录制进度的时钟图标

模板图像列表

图片名称

描述

arrow_right

通用披露指示器

back_button_navigation

用于导航栏的通用后退按钮

checkbox_filled

通用填充复选框图标

checkbox_outline

通用未填充复选框图标

close_button

模态页面的关闭按钮

contact_icon

联系人页面图标

devices_icon

您的应用和设备页面图标

edit_small

文擎字段的更小的编辑按钮

faq_icon

常见问题页面图标

filter_icon

您的数据中的过滤器图标

permission_icon

权限页面图标

radio_button_filled

通用填充单选按钮图标

radio_button_outline

通用未填充单选按钮图标

review_consent_icon

审查同意页面图标

rewards_icon

奖励摘要页面图标

tab_feed

信息流标签图标

tab_study_info

研究信息标签图标

tab_task

任务标签图标

tab_user_data

您的数据标签图标

user_info_icon

可编辑的个人资料信息页面图标

框架AppDelegate设置

在你的AppDelegate文件中,通过以下方式导入ForYouAndMe框架:

import ForYouAndMe

添加以下委托方法实现:

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
            return FYAMManager.orientationLock
    }

最后,在application(_ application:, didFinishLaunchingWithOptions:)方法中删除所有现有代码,调用FYAMManager类的startup(withFontStyleMap:, showDefaultUserInfo:, checkResourcesAvailability:, enableLocationServices:)静态方法,并将结果存储在先前创建的window变量中。

此方法有三个参数

  1. fontStyleMap:一个从FontStyleFontStyleData的字典,其中FontStyle是一个枚举,代表框架中使用的字体样式调色板,而FontStyleData是一个结构体,允许您为每个字体样式指定自定义字体、行间距和首字母大写标志。

  2. showDefaultUserInfo:是否显示一个特定的研究页面,显示并允许编辑用户个人资料(未来将删除,以便采用更动态的方法)。

  3. appleWatchAlternativeIntegrations:一组集成(例如:Garmin、Fitbit等),被认为是与Apple Watch互斥的,关于显示在您的数据中的数据。具体来说:如果用户在Opt-In流程中同意使用Apple Watch(因此她已授予健康权限),则您的数据页面将只显示Apple Watch数据,而在此变量中列出的所有数据集将被丢弃。如果用户未同意使用Apple Watch,则删除来自Apple Watch的数据,常规显示所有其他数据。

  4. checkResourcesAvailability:是否在启动时验证字体样式和图像,以确保框架拥有所有需要的资源。默认:false。

  5. enableLocationServices:是否询问用户位置权限或在权限页面中显示相关权限。默认:true。

  6. healthReadDataTypes:一列应通过HealthKit收集并发送到服务器的HealthDataType项。注意:此功能仅在HealthKit已集成(见下文)时才有效。默认:空数组。

示例

var fontStyleMap: FontStyleMap = [:]
if let font = UIFont(name: "Helvetica", size: 24.0) {
	fontStyleMap[.title] = FontStyleData(font: font, lineSpacing: 6.0, uppercase: false)
}
if let font = UIFont(name: "Helvetica", size: 20.0) {
	fontStyleMap[.header2] = FontStyleData(font: font, lineSpacing: 6.0, uppercase: false)
}
if let font = UIFont(name: "Helvetica", size: 16.0) {
	fontStyleMap[.paragraph] = FontStyleData(font: font, lineSpacing: 5.0, uppercase: false)
}
if let font = UIFont(name: "Helvetica", size: 13.0) {
	fontStyleMap[.header3] = FontStyleData(font: font, lineSpacing: 3.0, uppercase: false)
}
if let font = UIFont(name: "Helvetica", size: 13.0) {
	fontStyleMap[.menu] = FontStyleData(font: font, lineSpacing: 3.0, uppercase: true)
}
self.window = FYAMManager.startup(withFontStyleMap: fontStyleMap,
								  showDefaultUserInfo: true,
								  appleWatchAlternativeIntegrations: [.garmin, .fitbit],
								  checkResourcesAvailability: true,
								  enableLocationServices: false,
                                  healthReadDataTypes: HealthDataType.allCases)
return  true

以下是在上述步骤之后AppDelegate文件可能看起来如何的示例。

import UIKit
import ForYouAndMe

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        var fontStyleMap: FontStyleMap = [:]
        if let font = UIFont(name: "Helvetica", size: 24.0) {
            fontStyleMap[.title] = FontStyleData(font: font, lineSpacing: 6.0, uppercase: false)
        }
        if let font = UIFont(name: "Helvetica", size: 20.0) {
            fontStyleMap[.header2] = FontStyleData(font: font, lineSpacing: 6.0, uppercase: false)
        }
        if let font = UIFont(name: "Helvetica", size: 16.0) {
            fontStyleMap[.paragraph] = FontStyleData(font: font, lineSpacing: 5.0, uppercase: false)
        }
        if let font = UIFont(name: "Helvetica", size: 13.0) {
            fontStyleMap[.header3] = FontStyleData(font: font, lineSpacing: 3.0, uppercase: false)
        }
        if let font = UIFont(name: "Helvetica", size: 13.0) {
            fontStyleMap[.menu] = FontStyleData(font: font, lineSpacing: 3.0, uppercase: true)
        }
        self.window = FYAMManager.startup(withFontStyleMap: fontStyleMap,
                                          showDefaultUserInfo: true,
                                          appleWatchAlternativeIntegrations: [.garmin, .fitbit],
                                          checkResourcesAvailability: true,
                                          healthReadDataTypes: HealthDataType.allCases)
        
        return true
    }
    
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
            return FYAMManager.orientationLock
    }
}

启动屏幕(可选)

编辑默认的LaunchScreen.storyboard文件以显示适合您研究的项目启动屏幕。

HealthKit(可选)

当前,用户第三方可穿戴设备的数据通过服务器之间的定时操作收集。但苹果手表无法通过这种方式访问,因此应用必须负责从健康应用中收集数据并发送到服务器。

如果你想在研究中包含使用苹果手表,请使用以下说明

  1. 将以下条目添加到你的 Info.plist 文件中

    1. NSHealthShareUsageDescription 设置为 $(PRODUCT_NAME) 将会使用你的健康数据进行分析(或适合你研究的内容)。

    2. NSHealthUpdateUsageDescription 设置为 $(PRODUCT_NAME) 将根据你的任务结果更新你的健康数据(实际上,你在这里写的内容无关紧要,因为HealthKit实现的目的是读取Health数据。但是,你需要添加这个键,否则当你上传应用到AppStoreConnect时,即使官方Apple文档说明这个描述只在你在Health应用中保存数据时才需要,你也会接收到错误)。

  2. HealthKit 功能添加到你的项目中。

  3. 在 AppDelegate 中,在 application(_ application:, didFinishLaunchingWithOptions:) 方法内,将 healthReadDataTypes 参数提供给 FYAMManager 类的 startup 静态方法。作为值,你需要提供一个 HealthDataType 枚举情况的数组,从而指定你希望从健康应用中读取哪些数据。

  4. 将以下代码添加到你的 PodFile 文件末尾

post_install do |installer_representation|
  installer_representation.pods_project.targets.each do |target|
    if ['ForYouAndMe'].include? target.name
      target.build_configurations.each do |config|
        config.build_settings['SWIFT_ACTIVE_COMPILATION_CONDITIONS'] = '$(inherited) HEALTHKIT'
      end
    end
  end
end

作者

LeonardoPasseri,[email protected]

许可

ForYouAndMe 在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。