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
库提供,以便在从头创建的新项目中使用。遵循 从头创建学习应用 段落下的说明来构建和运行它。
示例项目
运行示例项目
-
克隆仓库。
-
在示例目录下运行
pod install
。 -
从 Firebase 控制台下载您的 Firebase 项目
GoogleService-Info.plist
(请按照 https://firebase.google.com/docs/cloud-messaging/ios/client#upload_your_apns_authentication_key 中的说明操作)然后将其移动到Example/ForYouAndMe
文件夹下。 -
使用最新版本的 XCode 打开
ForYouAndMe.xcworkspace
(不是 .xcodeproj 文件!)。 -
在 XCode 中左侧面板选择
ForYouAndMe
项目,选择Signing & Capabilities
选项卡,并输入个人配置文件或选择Automatically manage signing
并输入Team
。 -
在
Signing & Capabilities
选项卡上,还要确保您的应用 Bundle Identifier 与创建的 Firebase 应用 ID 一致。 -
使用 Mac 上的 Finder 或 Windows 上的 Windows Explorer,导航到
/Example/ForYouAndMe
文件夹,并将ProjectInfo_sample.plist
重命名为ProjectInfo.plist
。 -
在 XCode 中打开
ProjectInfo.plist
文件,并使用以下内容填充属性值:-
api_base_url
是提供您的远程 API 服务器的基础 URL(例如:https://api.example.com )。 -
oauth_base_url
是处理您对支持集成的 OAuth 身份验证的服务器的基础 URL(例如:https://oauth.example.com )。 -
study_id
是您的研究在服务器上作为研究别名的标识符。 -
pin_code_suffix
(仅在需要使用 pin 登录的研究中需要)是您的研究所需的 pin 代码后缀,或者在您的研究不支持 pin 代码的情况下设置为none
。
-
-
选择连接的 iPhone 设备或模拟器并运行应用。
-
在 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 提供。要安装它,请在 终端
上按以下步骤操作
-
按照 https://cocoapods.org.cn/ 上的说明安装
CocoaPods
-
导航到项目文件夹并运行命令
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 后,为了配置您自己的学习应用,还需要执行一些额外的步骤
功能
向您的应用添加以下功能
-
推送通知
-
访问 WiFi 信息
Info.plist
在 info.plist 文件中添加或编辑以下条目
-
UIViewControllerBasedStatusBarAppearance
设置为false
。 -
UIUserInterfaceStyle
设置为Light
。 -
NSAppleMusicUsageDescription
设置为$(PRODUCT_NAME) 在某些任务期间使用媒体库。
-
NSBluetoothAlwaysUsageDescription
设置为$(PRODUCT_NAME) 使用蓝牙与可穿戴设备连接。
-
NSBluetoothPeripheralUsageDescription
设置为$(PRODUCT_NAME) 使用蓝牙与可穿戴设备连接。
-
NSCalendarsUsageDescription
设置为$(PRODUCT_NAME) 在某些任务中使用日历。
-
NSCameraUsageDescription
设置为$(PRODUCT_NAME) 在某些任务中会捕捉照片和视频。
-
NSContactsUsageDescription
设置为$(PRODUCT_NAME) 在某些任务中使用联系人。
-
NSLocationAlwaysAndWhenInUseUsageDescription
设置为$(PRODUCT_NAME) 将会使用您的位置信息来验证信息,如您的行程距离和速度,如知情同意所描述。
-
NSLocationWhenInUseUsageDescription
设置为$(PRODUCT_NAME) 将会使用您的位置信息来验证信息,如您的行程距离和速度,如知情同意所描述。
-
NSMicrophoneUsageDescription
设置为$(PRODUCT_NAME) 在某些任务中会录制音频。
-
NSMotionUsageDescription
设置为$(PRODUCT_NAME) 将会使用您的运动数据来处理您的活动任务。
-
NSSpeechRecognitionUsageDescription
设置为$(PRODUCT_NAME) 在某些任务中使用语音识别。
-
LSApplicationQueriesSchemes
设置一个字符串数组,包含:oura
、fitbit
、twitter
、instagram
、gcm-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)
从项目中
-
移除
Main.storyboard
。 -
移除
SceneDelegate.swift
。 -
移除
ViewController.swift
。
从 info.plist 文件中
从 info.plist
中移除 UIApplicationSceneManifest
条目。
在通用标签页中
-
设置iOS 13.0和iPhone。
-
清除
主界面
字段。 -
设备方向:
纵向
、横向左
、横向右
。
在AppDelegate类中
-
删除所有标有
UISceneSession生命周期
的方法。 -
使用
var window: UIWindow?
添加一个名为window
的实例变量。
项目信息
创建一个名为ProjectInfo.plist
的plist文件并添加到项目中。在此文件中,添加以下条目
-
api_base_url
设置为提供远程API的服务器的基础URL。 -
oauth_base_url
设置为处理您的Oauth身份验证的基础URL。 -
study_id
设置为在您的服务器上记录的研究标识符。 -
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
变量中。
此方法有三个参数
-
fontStyleMap
:一个从FontStyle
到FontStyleData
的字典,其中FontStyle
是一个枚举,代表框架中使用的字体样式调色板,而FontStyleData
是一个结构体,允许您为每个字体样式指定自定义字体、行间距和首字母大写标志。 -
showDefaultUserInfo
:是否显示一个特定的研究页面,显示并允许编辑用户个人资料(未来将删除,以便采用更动态的方法)。 -
appleWatchAlternativeIntegrations
:一组集成(例如:Garmin、Fitbit等),被认为是与Apple Watch互斥的,关于显示在您的数据中的数据。具体来说:如果用户在Opt-In流程中同意使用Apple Watch(因此她已授予健康权限),则您的数据页面将只显示Apple Watch数据,而在此变量中列出的所有数据集将被丢弃。如果用户未同意使用Apple Watch,则删除来自Apple Watch的数据,常规显示所有其他数据。 -
checkResourcesAvailability
:是否在启动时验证字体样式和图像,以确保框架拥有所有需要的资源。默认:false。 -
enableLocationServices
:是否询问用户位置权限或在权限页面中显示相关权限。默认:true。 -
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(可选)
当前,用户第三方可穿戴设备的数据通过服务器之间的定时操作收集。但苹果手表无法通过这种方式访问,因此应用必须负责从健康应用中收集数据并发送到服务器。
如果你想在研究中包含使用苹果手表,请使用以下说明
-
将以下条目添加到你的 Info.plist 文件中
-
NSHealthShareUsageDescription
设置为$(PRODUCT_NAME) 将会使用你的健康数据进行分析
(或适合你研究的内容)。 -
NSHealthUpdateUsageDescription
设置为$(PRODUCT_NAME) 将根据你的任务结果更新你的健康数据
(实际上,你在这里写的内容无关紧要,因为HealthKit实现的目的是读取Health数据。但是,你需要添加这个键,否则当你上传应用到AppStoreConnect时,即使官方Apple文档说明这个描述只在你在Health应用中保存数据时才需要,你也会接收到错误)。
-
-
将 HealthKit 功能添加到你的项目中。
-
在 AppDelegate 中,在
application(_ application:, didFinishLaunchingWithOptions:)
方法内,将healthReadDataTypes
参数提供给FYAMManager
类的startup
静态方法。作为值,你需要提供一个HealthDataType
枚举情况的数组,从而指定你希望从健康应用中读取哪些数据。 -
将以下代码添加到你的 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文件。