好吧,我知道没有人会真的阅读这个。但是,作为一个好开发者,我在写这篇文档。
这是一个 SDK(也称为软件开发包),这意味着您可以使用此软件包以更简单的方式构建自己的应用程序。因此,这只是一个为您构建自己的东西的工具。
这个 SDK 将使您在处理物联网设备时更加痛苦。
但是此 SDK 仅与控制内容和规则的服务器完全兼容。SDK 启动时所做的第一件事是要求服务器询问 SDK 如何在物联网设备上响应用户。例如,'SDK 是否应该扫描 iBeacon?' 或 '日志发送的时间间隔是多少?'。所以,没有服务器它不太有用。好吧,几乎什么都不能工作,但只有调试功能。
因此,请访问iCIGNAL并获取一个 API 密钥。
拖放,安装完成。没有依赖项或构建设置问题。只要满足要求,您就可以说走就走。您最常使用的的方法不到 10 个。实际上,所有公共方法(包括 getter 集成器和调试实用程序)不到 100 个。
您需要做的只是,设计您的应用程序在获取预定义任务时将如何以及做什么。
它比其他设备略大,但结构良好。您可以从哪里获取它?不多。除非在某个地方隐藏了某些严重的错误,我们可以更快、更容易地修复它们。这保证了您将获得长期维护并进行更多实验,以添加更多功能。
您是否意识到,如果您从零开始会有什么发生?所有的物联网设备都会向您广播他们的信号,您将最终陷入满是线程相关问题的境地。当然,我们相信您独自一人可以构建一些很棒的东西。但是,我们为您承担了所有混乱的工作。为什么您要从头开始做呢?
来自设备的信号将被收集,任务将被排队等待您执行。您只需告诉 SDK 您的工作已完成,然后 SDK 将为您提供下一个任务。
所有动作都会消耗能量。作为我们这样的移动应用程序开发人员,我们称之为电池。我们都知道它是宝贵的。
当我们第一次开始这个项目时,电池耗尽并没有在我们的脑海中。但是,想想看,有成千上万的信号和数据处理吗?我们确实需要为实际应用管理它。
我们简化了流程,并尽力不使用任何不必要的资源。SDK 将在可能时随时暂停,而不是全天扫描。
无论您设计的应用程序是否良好,您无需重新部署即可更改内容或触发点。更重要的是,您可以通过基于Web的管理器停止监视某些物联网信号或更改 SDK 的收集行为。
我们提供多级调试信息,包括控制台、文件和屏幕。 通过调试信息,您可以查看通常无法看到的内容。 我们知道,当像您的信号一样难以看见时,确定问题会更困难。现在,您可以看到您的信号并修正源代码或传感器设置。
目前,我们覆盖了3种不同的信号。当然,这只是开始。实验还在继续。
iBeacon是苹果发明的具有低功耗蓝牙(即蓝牙4.0)广播协议。该协议包括标识符及其近距。换句话说,您可以告知人们何时接近特定地点,如您的产品进行宣传。这对市场营销来说是一个激动人心的新闻,但其潜力更大。
那么我们应该考虑为什么iBeacon成为了上下文投递的关键?因为即使现在,我们也无法确切知道您在哪里。尤其是,当您在建筑物内时。但是,当您不在建筑物内时,我们即使您忘记打开蓝牙,也可以以合理的高度精度跟踪您。
您可以在地理区域内设置虚拟边界。当人们穿过边界时,他们将获得预定义的任务。
如果您知道附近的WiFi AP,您可以确定他们的位置。在iOS中,您只能通过私有框架扫描WiFi,这意味着苹果不会允许您将应用程序提交到App Store。但是,您可以查看他们何时实际上连接到WiFi。它没有那么神奇,但它仍然提供了相同的环境。
是的,更多的将到来...
有两种要求需要考虑。一个是您的开发环境,另一个是用户的运行环境。
如果您的部署版本是8.0,则可以使用动态框架。(拖放
/Dynamic/iCignalSDK.framework
文件)
当您将应用程序提交到App Store时,因为苹果的一个错误,您需要做额外的一步。
在您的应用程序目标的构建阶段
中创建一个新的运行脚本阶段
。并添加以下代码。
bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/iCignalSDK.framework/strip-archs.sh"
如果您将项目设置为在 构建设置
中启用 Enable Modules (C 和 Objective-C)
,则可以使用如 @import UIKit;
的框架。
当然,您也可以像 @import iCignalSDK;
一样使用iCiganlSDK。但是,您需要手动添加两个框架。JavaScriptCore
和/或 sqlite3
。
我们还没有找到更干净的方法在框架中使用 sqlite3
(您知道依赖和事情等)。这很麻烦,但您需要添加 libsqlite3.tbd
。
别忘了链接应该是 可选的。
您需要手动添加以下框架。
iCignalSDK.framework
Foundation.framework
UIKit.framework
CoreBluetooth.framework
CoreLocation.framework
CoreMotion.framework
MapKit.framework
JavaScriptCore.framework
Security.framework
SystemConfiguration.framework
MobileCoreServices.framework
libsqlite3.dylib
MessageUI.framework
Twitter.framework
QuartzCore.framework
Accelerate.framework
如果您不知道如何使用 Cocoapods,请访问此处。
很简单。
pod 'iCignalSDK'
在您的 Podfile
中添加
pod install
。然后,在您的代码中,您可以使用 #import <iCignalSDK/iCignalSDK.h>
或 @import iCignalSDK;
来导入。
您的应用程序的大多数配置都在 Info.plist
中。SDK 也有一些配置。
为了使此 SDK 在后台正确执行,您需要将您的应用程序的 Info.plist
文件中的 UIBackgroundModes
键分配。
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
</array>
其他选项是可选的,但location
对于后台执行至关重要。
如果未分配 UIBackgroundModes
键,您的应用程序在后台的执行时间不能超过 180 秒。
要处理来自 URL 的请求,您需要在应用程序的 Info.plist
文件中指定您的自定义架构。
可以使用 API 密钥来创建架构,例如 icignal-yourAPIkey
。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>icignal-53e18abc0cf29fcb62a82312</string>
</array>
</dict>
</array>
有许多选项和配置可能需要,所有这些都包含在 plist 文件中,因此不需要编码。
所有键都在 ICCommon.h
头文件中定义。
键 | 值 | 说明 |
---|---|---|
iCignal API 密钥 | 字符串 | 从 iCIGNAL 获得的密钥。如果它错误或为空,则 SDK 不会工作。 |
iCignal 调试级别 | 整数 | 调试级别。(0:关闭,1:错误,2:警告,3:信息,4:调试,5:详尽)在部署之前必须将此设置为 0。 |
iCignal 控制台调试 | 布尔值 | 如果 YES,调试日志将显示在 Xcode 控制台中。 |
iCignal 文件调试 | 布尔值 | 如果 YES,调试日志将作为在您的应用程序的 Documents 目录中的文件创建。 |
iCignal 屏幕调试 | 布尔值 | 如果 YES,调试日志可以通过 [iCignalManager showOrHideLogWindow] 方法显示在您的应用程序屏幕上。 |
iCignal 允许电池使用日志 | 字符串 | 如果 YES,将收集电池使用情况。 |
iCignal 网络URL - 基础URL | 字符串 | 服务器的URL。在部署之前,请检查是否已正确设置此设置 |
所有其他路径... | 字符串 | 您可以根据需要设置这些路径以进行调试目的或其他用途。 |
<key>iCignal Configuration</key>
<dict>
<key>iCignal API Key</key>
<string>53e18abc0cf29fcb62a82312</string>
<key>iCignal Debug Level</key>
<integer>5</integer>
<key>iCignal Debug on Console</key>
<true/>
<key>iCignal Debug on File</key>
<true/>
<key>iCignal Debug on Screen</key>
<true/>
<key>iCignal Log Enable Battery</key>
<true/>
<key>iCignal Network URL - Base URL</key>
<string>http://devcloud.icignal.com</string>
<key>iCignal Network URL - Get Beacon Workflow rules</key>
<string>beacon/mbl/getWFRule.do</string>
<key>iCignal Network URL - Get Direct Message</key>
<string>beacon/mbl/getDirectMsg.do</string>
<key>iCignal Network URL - Get Location Workflow rules</key>
<string>beacon/mbl/getWFLocationRule.do</string>
<key>iCignal Network URL - Get Preferences</key>
<string>beacon/mbl/getPreferences.do</string>
<key>iCignal Network URL - Get Task Info</key>
<string>beacon/mbl/getTask.do</string>
<key>iCignal Network URL - Get WiFi Workflow rules</key>
<string>beacon/mbl/getWFWifiRule.do</string>
<key>iCignal Network URL - Update Workflow rule</key>
<string>beacon/mbl/getUpdateWFRule.do</string>
<key>iCignal Network URL - Upload Logs</key>
<string>beacon/mbl/traceLog.do</string>
</dict>
描述应用程序访问用户位置信息的原因。
当系统提示用户允许访问时,该字符串将作为警报面板的一部分显示。
在 iOS 8 及其以后版本中被忽略。
<key>NSLocationUsageDescription</key>
<string> *DESCRIPTION* </string>
从 iOS 8 开始,使用位置服务的所有应用程序都需要说明它们如何/为什么使用用户的位置信息。这是强制性的,不是可选的。
您可以设置两者,也可以选择其中一个。用户可以从您设置的选项中进行选择。这意味着您未设置的选项不会显示。
<key>NSLocationAlwaysUsageDescription</key>
<string> *DESCRIPTION* </string>
<key>NSLocationWhenInUseUsageDescription</key>
<string> *DESCRIPTION* </string>
参考:文档 / 视频(WWDC 2014-706) / 视频(WWDC 2014-715)
从 iOS 11 开始,使用位置服务的所有应用程序都必须说明它们如何/为什么使用用户的位置信息。这是强制性的,不是可选的。
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string> *DESCRIPTION* </string>
从iOS 9开始,苹果阻止了HTTP连接。但是,我们可能需要连接,并且NSAppTransportSecurity
将描述您应用的例外情况。
将NSAllowsArbitraryLoads
设置为false
将禁用ATS。这只在您无法决定将要获取哪个URL时才使用。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>icignal.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
</dict>
参考:文档 / 视频(WWDC 2015-711)
从iOS 10开始,对访问私人数据的限制更加严格,您需要描述为什么需要它。这是强制性的,不是可选项。
该属性描述了为什么我们需要运动活动数据。我们需要它来避免当用户未移动时电池耗尽。
如果没有设置,则我们只会使用加速度计。
<key>NSMotionUsageDescription</key>
<string> *DESCRIPTION* </string>
参考:文档 / 视频(WWDC 2016-709)
在大多数情况下,您不需要任何东西。只需import iCignalSDK
,然后它就会正常工作。
但如果它不起作用,您可以尝试使用Bridging Header
。最简单的方式是在您的项目中添加一个空白的Objective-C文件。Xcode将询问您是否要配置桥接头。
是的!并在yourProjectName-Bridging-Header.h
中添加#import
。然后您就可以开始了。
在这里,您可以看到如何使用此SDK。
大多数情况下,您只需要实现少数几个方法。
应用有生命周期,它们如何启动、暂停或后台运行,以及它们如何终止。您需要让SDK知道何时以及如何做。
SDK可以检测大部分事件,但有一些事件SDK不能。
您只需知道一个类。iCignalManager
。
+ handlingLaunchingWithOptions
AppDelegate
的application:didFinishLaunchingWithOptions:
方法内部调用。launchingOption
应由AppDelegate
提供,这样才能正确唤醒SDK。- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
if ([iCignalManager handlingLaunchingWithOptions:launchOptions]) {
[iCignalManager requestNotificationAuthorizationWithDelegate:self];
[iCignalManager requestLocationAuthorization];
[iCignalManager requestMotionActivityAuthorization];
[iCignalManager setDeviceUUID];
[iCignalManager setDelegate:self];
[iCignalManager start];
}
else {
NSLog(@"iCignal SDK is not available");
}
// Do your stuffs here...
return YES;
}
+ handlingRemoteNotification:fetchCompletionHandler
AppDelegate
的application:didReceiveRemoteNotification:fetchCompletionHandler:
方法内部调用。userInfo
和completionHandler
传递给SDK。- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
if (![iCignalManager handlingRemoteNotification:userInfo fetchCompletionHandler:completionHandler]) {
NSLog(@"remote notification received but not for iCignal.");
// Do your own work here....and call completionHandler with result of your work.
completionHandler(UIBackgroundFetchResultNoData);
}
}
+ handlingOpenURL:sourceApplication:annotation
AppDelegate
的application:openURL:sourceApplication:annotation:
方法内部调用。- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [iCignalManager handlingOpenURL:url sourceApplication:sourceApplication annotation:annotation];
}
+ handlingOpenURL:options:
(iOS 9或更高版本)
+ handlingOpenURL:sourceApplication:annotation:
方法的替代。+ handlingOpenURL:sourceApplication:annotation:
方法相同。- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options
{
return [iCignalManager handlingOpenURL:url options:options];
}
+ handlingPerformFetchWithCompletionHandler
AppDelegate
的application:performFetchWithCompletionHandler:
方法内部调用。- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[iCignalManager handlingPerformFetchWithCompletionHandler:^(UIBackgroundFetchResult resultFromICignal) {
// Do your things. and get a result...
UIBackgroundFetchResult yourResult = UIBackgroundFetchResultNoData;
completionHandler(MIN(resultFromICignal, yourResult));
}];
}
+ setDelegate
application:didFinishLaunchingWithOptions:
方法中。+ requestLocationAuthorization
+ requestNotificationAuthorizationWithDelegate:
或 + requestNotificationAuthorization
(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
类型。此外,此方法需要一个参数delegate
,它将传递UNUserNotificationCenterDelegate
事件。(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound)
类型。+ requestMotionActivityAuthorization
+ start
application:didFinishLaunchingWithOptions:
方法中。+ finish
applicationWillTerminate:
方法中。- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
[iCignalManager finish];
}
+ kill
+ setEnabled:
或其他能力切换方法之后,SDK才能再次工作。+ currentTask
-[ICTask setObject:]
)。配置方法都在iCignalManager
类中,作为类方法。
您可以选择设置Boolean
值以配置您想要开启的功能。
有三种设置方式,您可以在服务器上设置默认功能。以下方法中有提示。
只有当服务器和应用程序的配置都开启时,功能才会启用。
+ setEnabled
+ setBeaconEnabled
+ setLocationEnabled
+ setWifiEnabled
我们已经在服务器端提供了可更改的属性。**仅用于调试**。
+ setBaseUrl
+ setNetworkTimeout
+ setNetworkRetry
+ setNetworkRetryInterval
当您知道哪些用户接近哪些位置时,此方法更强大。
您可以通过没有任何配置简单地知道一些人的接近。
但当你简单地为SDK提供一个特定用户的ID时,您可以为内容个性化或进行分析。
您需要指定与用户一起的设备,因为您的应用程序可能允许多用户登录。
有时,您可能需要针对设备而不是用户。
+ setDeviceUUID
NSString
。+ setDeviceUUID
nil
将从设备中删除UUID。+ removeDeviceUUID
这全部关乎识别一个感兴趣的人。您甚至可以通过传递nil
来让SDK知道登录状态。
+ 设置成员ID
NSString
对象。nil
,SDK将其识别为登出。如果您正在使用远程通知或您想从iCignal
使用更多功能,您需要将令牌传递给SDK。
这样做,您只需向特定区域的用户发送通知,或者给他们安排工作流程。
+ 设置推送令牌
NSData
类型。application:didRegisterForRemoteNotificationsWithDeviceToken:
方法。nil
。- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[iCignalManager setPushToken:deviceToken];
}
所有来自SDK的事件将通过iCignalManagerDelegate
协议传递。
这些方法都是可选的。
这些方法是您应用工作流程的核心。传递的对象是ICTask
,您可以使用它来确定如何处理。
方法的制作质量和灵活性由此决定。
- workflowDidReceiveTask
completeHandler()
函数。completeHandler()
函数,则下一个任务不会执行。ICTask
类以获取更多详细信息。- workflowDidCancelTask
- workflowDidTimeoutTask
当您使用来自iCignal
服务器的模板时,您应该处理WebView
。
- webViewShouldOpenURL:withParameters
WebView
,或者如果您希望,可以使用包含的WebView
。- webViewShouldCloseWithParameters
为了性能提升,建议不要使用这些方法。只有在需要调试时才使用它们。
- beaconDataWillBeCollected
NSDictionary
类。NSArray
中包含的NSDictionary
。- locationDataWillBeCollected
NSDictionary
的NSArray
类。- wifiDataWillBeCollected
NSDictionary
类。-1
或-999
。其中-1
表示已连接和-999
表示已断开。您可以使用这些方法了解SDK内部的运行情况。
信息越多越好,当你知道如何利用这些信息时。
- authorizationStatusDidChange
ICLocationAuthorizationStatus
以获取更多详细信息。- bluetoothDidUpdateStateOn
- motionActivityDidChange
ICMotionActivityType
以获取更多详细信息。- motionActivityRemaining:asActivityType
ICMotionActivityType
了解活动类型。- beaconDidStartUpdating
- beaconDidStopUpdating
- beaconRangingRegionCountDidChange
- beaconDidStartAdvertisingWithError
- locationDidSuspendUpdating
- locationDidResumeUpdating
- locationDidStartUpdating
- locationDidStopUpdating
- locationStayingDurationDidChange
- locationManualUpdatingDidFinish:withError
- wifiDidStartUpdating
- wifiDidStopUpdating
- wifiDidConnectToSSID:andBSSID
- wifiDidDisconnectFromSSID:andBSSID
大多数错误都会被推送。即使是网络、位置或其他。
参见 ICError
以获取更多详细信息。
- managerDidFailWithError
NSError
对象将被发送。NSError
不是致命的。kICErrorNoWorkflow
或 kICErrorConcurrentCall
可能会发出,但这只是信息而不是错误。你可能希望通过 Settings.bundle
改变一些配置。
有一些 预定义标识符,你可以在 Settings.bundle
中添加。
这些值将覆盖你在代码中设置的任何其他值。
所有标识符将在 SDK 启动时同步。
(在你改变任何值的同时 SDK 正在运行,该值将在下一次启动时应用)
当需要时可以将来添加标识符。
当应用被删除时,所有值将被删除。
如果你想了解更多关于 Settings.bundle
的信息,请访问这里。
ICProperties_APIKey
API Key
。String
类型。ICProperties_BaseURL
Base URL
。String
类型。ICProperties_MemberID
成员ID
。String
类型。ICProperties_UserBeaconFlag
[iCignalManager setBeaconEnabled:]
方法。布尔
类型。ICProperties_UserGeofenceFlag
[iCignalManager setLocationEnabled:]
方法。布尔
类型。ICProperties_UserWifiFlag
[iCignalManager setWifiEnabled:]
方法。布尔
类型。<InfavorBeacon/InfavorBeacon.h>
-> <iCignalSDK/iCignalSDK.h>
<Twitter/Twitter.h>
和 <MessageUI/MessageUI.h>
已添加。用于 ICWebViewController
Infavor Beacon
更改为 iCignal
Infavor Beacon Debug
已删除。使用 iCignal Debug Level
。您可以将 0
设置为 关闭Infavor Beacon Network URL - 优惠券详情页面URL
已删除。iCignal Network URL - 获取WiFi工作流程规则
已添加。Infavor Beacon Network URL - 获取工作流程规则
-> iCignal Network URL - 获取信标工作流程规则
UIBackgroundModes
数组中,添加了 fetch
。QI
更改为 IC
QIBeaconManager
(或 BeaconManager
) -> iCignalManager
QITask
-> ICTask
+[QIBeaconManager getVersion]
-> +[iCignalManager sdkVersion]
+[QIBeaconManager setPushDeviceToken:]
-> +[iCignalManager setPushToken:]
+[QIBeaconManager setMemberId:]
-> +[iCignalManager setMemberID:]
+[QIBeaconManager setBeaconDetectModeDynamic:]
-> +[iCignalManager setPausesBeaconAutomatically:]
+[QIBeaconManager handlingRemoteNotification:fetchCompletionHandler:]
-> +[iCignalManager handlingRemoteNotification:fetchCompletionHandler:]
-[QITask type]
-> [ICTask taskType]
-[QITask parsedUrl]
-> [ICTask taskURL]
-[QITask content]
-> [ICTask taskContent]
-[QITask resumeTaskWithResponse:]
-> -[ICTask completeHandler()]
ICTaskReadyNotification
-> iCignalManagerWorkflowDidReceiveTaskNotification
ICTaskTimeoutNotification
-> iCignalManagerWorkflowDidReceiveTaskNotification
ICTaskCancelNotification
-> iCignalManagerWorkflowDidReceiveTaskNotification
QIAuthorizationStatus
-> ICLocationAuthorizationStatus
QIBluetoothState
-> +[iCignalManager isBluetoothPoweredOn]
Metadata Rejected
。在此之前,请在 Note
中放置信息。0.4.0 BEFORE YOU SUBMIT: INFO NEEDED
时,您需要提供所需的信息。所需信息
我们开始审核您的应用程序,但不能继续,因为我们需要 >关于您的应用程序的更多信息。在您方便的时候,请 >审视以下问题,并提供尽可能详细的信息。
请在此消息的“解决方案中心”中回复所需信息。
The additional informations you may request are below.
- Does this app detect startMonitoringForRegion:, startRangingBeaconsInRegion:, or both?
> We use both methods.
- What is the user experience when the app detects the presence of a beacon?
> If the beacon is registered on the server with a specific workflow, app will execute the workflow (predefined types of tasks).
- What features in this app use background location?
> When the user come around the geometric boundary, it will start updating location for more fine accuracy. And then, execute workflow as above.
- If this app uses 3rd party SDKs for iBeacons, please provide links to their documentation showing that background location is required for it to function.
> Not only iBeacon, but also Location features are included in SDK. http://www.quintet.co.kr/product/icignal or http://cocoadocs.org/docsets/iCignalSDK
描述
中放置此通知。"Continued use of GPS running in the background can dramatically decrease battery life."
如果存在问题,请在此进行汇报。
下载iCIGNAL示例应用
或者,pod try iCignalSDK
。