# iOS SDK
## iOS SDK
* iOS 常见问题
* iOS 客户端 SDK 下载:[动态库](https://github.com/AnalysysSDK/AnalysysEasyTouch_iOS/releases)
## 一、iOS SDK 简介
易达系统是易观基于方舟平台一款触达用户的产品,加强产品的用户体验和提升产品的转化率,易达的 iOS SDK 是此系统中重要的支撑点,提供以下功能:
* 触达用户的弹窗功能,支持弹窗样式:
1. 图片样式,支持点击事件
2. 文本样式,支持标题、正文、两个按钮。
3. 图文混合样式,最上面是图片,下面是标题、正文、按钮
4. 文字 + 视频样式,支持视频播放
* banner 信息流广告,支持样式:
1. 文字 + 大图片样式,支持点击事件
2. 文字 + 小图片样式,支持点击事件
3. 文字 + 多图片样式,支持点击事件
4. 文字 + 视频样式,支持视频播放
5. 轮播图样式,支持每张图片单独点击事件
* 订阅事件,用户在后台如果创建了基于用户事件的触发行为(弹窗除外),SDK 就会在每次启动的时候根据是否有事件更新来拉取订阅列表,并在有订阅事件产生的时候通知易达系统(如发送推送消息)。
**iOS 版本支持**
支持的 iOS 系统版本为 8.0 及以上版本。
**组成**
SDK 目录。
* 动态库文件:
```
AnalysysEasyTouch.framework
```
* 包含的头文件:
```
AnalysysEaManager.h
AnalysysEaConfig.h
AnalysysBannerConfig.h
```
**注意事项**
集成易达 SDK 前,需要先集成埋点与数据采集 SDK,方舟易达目前支持:
* [ **方舟 SDK**](https://github.com/analysys/ans-ios-sdk/releases) **(须 4.4.8 及以上版本),方舟 SDK 参考文档:**[ **方舟 SDK 文档**](https://docs.analysys.cn/ark/integration/sdk/ios)
## 二、快速开始
### 1、获取项目 AppKey
* 登录[**易达系统**](https://ea.analysys.cn/app.html#/Login),创建项目,项目创建完成后自动生成对应的AppKey用以标识该项目(应用)。
### 2、集成易达 SDK
**方式 1:cocoapods 导入动态库**
* 打开 Podfile 文件,添加如下代码
```
pod 'AnalysysEasyTouch' // 易达 SDK
```
* 如果需要安装指定版本,则按照以下方式
```
pod 'AnalysysEasyTouch', '1.2.6' // 示例版本号
```
* 特别注意:由于iOS 10以后苹果系统增加的 NSNotification Service Extension 扩展能够用于统计推送到达率,如果在 APP 中添加了该扩展而无法引入第三方的类文件,则需要使用以下“选择2”方式手动下载静态库并导入项目。将静态库及相关头文件添加到项目中的时候,需要同时勾选项目主 target 和 NSNotification Service Extension 扩展 target,否则编译会报错。
**方式 2:手动下载动态库导入**
* [下载最新动态库 SDK](https://github.com/AnalysysSDK/AnalysysEasyTouch_iOS/releases)
* 解压缩后,拷贝 AnalysysEasyTouch.framework 文件到项目中
* 选中项目 target ,在 Build Phases 》Embed frameworks 中添加 AnalysysEasyTouch.framework。
### 3、添加头文件
* 在 AppDelegate.m 中引入以下头文件:
```
#import <AnalysysEasyTouch/AnalysysEaManager.h> // 易达 SDK
```
### 4、添加初始化代码
* 请将以下代码添加到 - (BOOL)application:(UIApplication _)application didFinishLaunchingWithOptions:(NSDictionary _)launchOptions
```
/*********** 易达 SDK 初始化 ***********/
// 以下两项为必传参数,更多属性请参考 AnalysysEaConfig 头文件
AnalysysEaConfig *config = [AnalysysEaConfig defaultConfig];
config.appKey= @"易达后台创建项目的 AppKey";
config.applicationGroupIdentifier = @"App 创建的 App Groups ID";
//私有化部署的情况下,设置EA服务的地址URL
//config.url= @"*******";
// 数据上报url
config.uploadUrl= @"*******";
[AnalysysEaManager startWithConfig:config];
// 在初始化方舟埋点 SDK 的后面添加注册事件监听接口调用(方舟 SDK 4.4.8 及以上版本支持)
[AnalysysAgent setObserverListener:[AnalysysEaManager getObserverListener:YOUR_GROUP_IDENTIFIER]];
```
* 通过方舟 SDK 上报相关用户属性,若您需要手机能收到 SDK 发送的短信、邮件等,需要在获取到手机号、邮箱的地方,比如登录的时候,调用以下方法:
```
// 上报用户手机号码
[AnalysysAgent profileSet:@"$PHONE" propertyValue:value];
// 上报用户邮箱
[AnalysysAgent profileSet:@"$EMAIL" propertyValue:value];
// 上报用户微信openID
[AnalysysAgent profileSet:@"$WECHATOPENID" propertyValue:value];
```
* 在收到 deviceToken 的系统回调方法 - (void)application:(UIApplication _)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData _)deviceToken 中上报 deviceToken
```
// 上报设备唯一标识,目前易达 iOS SDK 支持苹果 APNS 推送通道和极光推送通道
/// @param deviceId 设备唯一标识 ID(若是 APNS 通道,值为系统直接返回的 deviceToken,若是三方推送通道,比如极光推送,则值为极光返回的 registrationID)
/// @param provider 推送通道
/// @param groupIdentifier App Groups Id
+ (void)pushToken:(id _Nullable)deviceId provider:(PushProvider)provider groupIdentifier:(NSString *)groupIdentifier;
```
* 若 APP 支持推送功能,在收到推送及点击推送的系统回调方法中,添加对应的方法:
```
// 以下系统回调方法仅供参考,具体实现根据您自己的业务需要
// iOS 6 及以前,收到推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// 若实现 Notification Service Extension 扩展,需注释掉,否则可能重复上报
[AnalysysEaManager pushTrack:PUSH_RECEIVE msg:userInfo];
}
// iOS 7 以后 10 以前,收到推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
completionHandler(UIBackgroundFetchResultNewData);
if (application.applicationState == UIApplicationStateActive) {
// App前台 收到推送消息,追踪"App 消息推送"事件,若实现了扩展,需注释掉
[AnalysysEaManager pushTrack:PUSH_RECEIVE msg:userInfo];
} else if (application.applicationState == UIApplicationStateBackground) {
// App后台 收到推送消息,追踪"App 消息推送"事件,若实现了扩展,需注释掉
[AnalysysEaManager pushTrack:PUSH_RECEIVE msg:userInfo];
} else {
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysEaManager pushTrack:PUSH_CLICK msg:userInfo];
}
}
// iOS 10 及以后,收到推送
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
// 注意:若实现 Notification Service Extension,需注释掉改行代码,收到推送会执行扩展中的方法
// [AnalysysEaManager pushTrack:PUSH_RECEIVE msg:notification.request.content.userInfo];
completionHandler(UNNotificationPresentationOptionBadge
|UNNotificationPresentationOptionAlert);
}
// iOS 10 及以后,点击推送
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){
NSLog(@"didReceiveNotification:%@", response.notification.request.content.userInfo);
[AnalysysEaManager pushTrack:PUSH_CLICK msg:response.notification.request.content.userInfo groupIdentifier:GROUP_IDENTIFIER];
completionHandler();
}
```
* 若实现了 Notification Service Extension 扩展,当收到推送时,除了会执行扩展的回调方法,还会执行以上收到推送的回调方法,为避免重复上报,需要将上述上报 PUSH_RECEIVE 类型的事件注释掉,或者根据项目需要采用宏定义判断的方式来规避掉重复上报。
* 若不需要统计推送触达,即不需要实现 Notification Service Extension 扩展,则可以不用添加 APP Groups,对应的 applicationGroupIdentifier 参数传空字符串即可。
### 5、配置统计推送到达所需的 Notification Service Extension 扩展及 AppGroups
配置这两项,主要针对 APP 支持推送,在进程被杀死的情况下统计推送到达率,若 APP 不支持推送功能,可忽略。若 APP 支持推送功能,不配置扩展和 AppGroups 会导致 APP 在进程被杀死的情况下推送到达无法统计,并可能使其它功能受到影响,应用在前、后台的情况不受影响。建议您按照如下步骤进行配置。
**配置 Notification Service Extension 扩展**
APP 进程在被杀死的情况下,iOS 10.0 以后可以通过 Notification Service Extension 扩展服务处理推送到达的统计,10.0 以下版本不支持。APP 客户端需要做如下配置:
* 创建 Notification Service Extension 类型的 target,选择最低支持的版本为 iOS 10.0
* 在系统生成的 NotificationService.m 文件中 didReceiveNotificationRequest 方法里调用 pushTrack 方法追踪推送到达事件
```
-(void)didReceiveNotificationRequest(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here...
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [方舟易达]", self.bestAttemptContent.title];
[AnalysysEaManager pushTrack:PUSH_RECEIVE msg:self.bestAttemptContent.userInfo];
self.contentHandler(self.bestAttemptContent);
}
```
**配置 App Groups**
为保证主 APP 进程被杀死的情况下,扩展进程能正常访问主 APP 的某些数据,从而使 SDK 能正常工作,APP 客户端需要添加进程间数据共享:
* 选择主 target -》 Capabilities,添加 App Groups,填入分组名 **group.xxx** ,若分组名显示为红色,点击下方刷新按钮,直至分组名不再为红色
* 选择 Notification Service Extension target -》 Capabilities,添加 App Groups,勾选分组 **group.xxx** ,若分组名显示为红色,点击下方刷新按钮,直至分组名不再为红色
### 6、集成 banner 信息流广告(可选)
这一步主要针对需要集成信息流广告功能的用户,不需要集成该功能可以跳过。
**在 EA 平台创建 banner 配置**
进入 EA 管理后台,依次选择 系统设置 -》banner 配置,添加 banner 资源。创建的每一条 banner 资源将会对应唯一的一个 locationId,该 locationId 标识用户 APP 中的一个 banner 位置,banner 配置的图片将会在信息流广告无法展示的时候作为默认图展示。
**创建对应的 banner 信息流活动,并配置 banner 位置**
创建一条 banner 信息流广告,在第四步展示位置选择某一个 banner 配置对应的名称。
**在 App 列表中对应位置调用 SDK 接口渲染 banner**
APP 在拿到创建 banner 配置生成的 locationId 后,将其作为参数,在对应列表中向 SDK 发起请求,获取渲染之后的视图。这里以使用 UITableView 作为列表视图的用户使用 banner 信息流广告的场景为例:
* 第一步,创建 UITableViewCell 子类,这里比如为 EABannerCell,并注册
* 第二步,在对应代理方法里调用 SDK 方法,并传入 locationId 和 bannerCell 作为参数,注意这里在返回 table 行高的代理方法里,AnalysysBannerConfig 对象不要给 container 参数赋值。
```
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *settings_id = _arr[indexPath.section][ea_settings_key_id];
if (...) { // 自己的 UITableViewCell
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
......
return cell;
} else { // banner cell
EABannerCell *bannerCell = (EABannerCell *)[tableView dequeueReusableCellWithIdentifier:@"EABannerCell"];
AnalysysBannerConfig *bannerConfig = [AnalysysBannerConfig defaultConfig];
bannerConfig.locationId = locationId; // 传 banner 配置生成的 locationId
bannerConfig.container = bannerCell; // 注意:这里需要传入 bannerCell
[AnalysysEaManager loadBanner:bannerConfig];
return bannerCell;
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (...) { // 自己 cell
return 60.f;
} else { // banner cell
EABannerCell *bannerCell = (EABannerCell *)[tableView dequeueReusableCellWithIdentifier:@"EABannerCell"];
AnalysysBannerConfig *bannerConfig = [AnalysysBannerConfig defaultConfig];
bannerConfig.locationId = locationId; // 传 banner 配置生成的 locationId,注意:这里返回高度,不需要传入 bannerCell
CGFloat height = [AnalysysEaManager loadBanner:bannerConfig].height;
return height;
}
}
```
### 7、成功运行
* 真机调试该项目,如果控制台输出如下日志,代表 SDK 集成成功。
```
************************* [EA][Log] **************************
AnalysysEasyTouch 启动成功!
AppKey:ecaaab42502jgdg9870fd0740ce374daa
userId:1BCAF1D0-C8C0-46A8-866F-005832024259
**************************************************************
```
## 三、iOS API
* 方舟 SDK 接口请参考:[易观方舟 iOS SDK 文档](https://docs.analysys.cn/integration/sdk/ios)
* 这里只列举易达 AnalysysEasyTouch 相关接口
### 1、获取事件监听对象
**支持的版本:** 1.1.1.2
**接口说明:** 获取事件监听对象,用于监听方舟回调的事件。
**接口定义:**
* (id)getObserverListener:(NSString \*)groupIdentifier;
**参数说明:**
| 参数 | 说明 | 必填 | 备注 |
| --------------- | ------------------------------------- | -- | -- |
| groupIdentifier | 由客户端创建的 App Groups 名称。若系统不支持推送,可传空字符串 | 是 | |
**接口返回:** 返回事件监听代理对象。
**注意事项:** 调用方舟 AnalysysAgent 注册事件监听对象的接口时,传入该接口返回对象。
### 2、启动 SDK
**支持的版本:** 1.0.0
**接口说明:** 启动易达 SDK。
**接口定义:**
* (void)startWithConfig:(AnalysysEaConfig \*)config;
**参数说明:**
| 参数 | 说明 | 必填 | 备注 |
| ------ | ---------------------------------------------- | -- | ------------------------------ |
| config | 配置 SDK 启动所需要的 appKey 等信息,AnalysysEaConfig 对象实例 | 是 | 具体请参考 AnalysysEaConfig 类中各属性说明 |
**接口返回:** 无
**注意事项:** 无
### 3、上报推送 deviceToken
**支持的版本:** 1.1.5.6
**接口说明:** 上报注册 APP 启动后由系统返回的推送deviceToken。
**接口定义:**
* (void)pushToken:(NSData _)deviceToken groupIdentifier:(NSString _)groupIdentifier;
**参数说明:**
| 参数 | 说明 | 必填 | 备注 |
| ---------------- | ----------------------------------------- | -- | ----------------------------------------------------------------- |
| deviceToken | app 启动后由系统返回的用于推送的 NSData 类型的 deviceToken | 是 | 直接传系统回调的 deviceToken ,无需解析 |
| groupIdentifiler | 创建的 App Groups 分组 id 名称 : group.xxx | 否 | 若不配置 Notification Service Extension 扩展,即可不创建 APP Groups,此处传空字符串即可 |
**接口返回:** 无
**注意事项:无**
### 4、上报推送事件
**支持的版本:** 1.1.1
**接口说明:**
用户在配置了 APNS 通道后,当APP接收到推送消息及点击了推送消息时,在相应的系统回调方法里调用易达 SDK 追踪推送消息的接口来统计推送到达率和点击率。
**接口定义:**
* (void)pushTrack:(PushEventType)type msg:(NSDictionary _)msg groupIdentifier:(NSString _)groupIdentifier;
**参数说明**
| 参数 | 说明 | 必填 | 备注 |
| --------------- | ----------------------------------- | -- | ----------------------------------------------------------------- |
| type | push的事件类型 | 是 | |
| msg | push事件的属性信息 | 是 | push属性说明 |
| groupIdentifier | 创建的 App Groups 分组 id 名称 : group.xxx | 否 | 若不配置 Notification Service Extension 扩展,即可不创建 APP Groups,此处传空字符串即可 |
**接口返回:** 无
### 5、设置页面别名
**支持的版本:** 1.1.1.1
**接口说明:** 开启或关闭别名设置功能,若开启,则可以给APP内任何页面设置具体名称。
**接口定义:**
* (void)setPageTagState:(BOOL)state;
**参数说明:**
| 参数 | 说明 | 必填 | 备注 |
| ----- | -------------------------- | -- | -- |
| state | 设置别名的开关状态,true是打开;false是关闭 | 是 | |
**接口返回:** 无
**注意事项:** 无
### 6、设置是否显示对话框
**支持的版本:** 2.0.2
**接口说明:** 全局控制对话框的展示。
**接口定义:**
* (void)setDialogVisible:(BOOL)visible;
参数说明:
| 参数 | 说明 | 必填 | 备注 |
| :-----: | :-------------------------: | -- | ------- |
| visible | 是否显示对话框,true是显示;false是不显示关闭 | 否 | 默认为true |
**接口返回:** 无
**注意事项:** 无
### 7、上传公众号的ID
**支持的版本:** 2.2
**接口说明:** 上传公众号的ID。
**接口定义:**
* (void)setWeChatId:(NSString _)unionId appId:(NSString _)appid openId:(NSString \*)openId;
参数说明:
| 参数 | 说明 | 必填 | 备注 |
| :-----: | :-----------: | -- | -- |
| unionId | 企业unionID | 否 | |
| appId | 小程序、公众号的appID | 是 | |
| openId | 用户openId | 是 | |
**接口返回:** 无
**注意事项:** 无
### 8、渲染 banner
**支持的版本:** 1.2.0
**接口说明:** 渲染 banner 信息流广告。
**接口定义:**
* (CGSize)loadBanner:(AnalysysBannerConfig \*)bannerConfig;
**参数说明:**
| 参数 | 说明 | 必填 | 备注 |
| ------------ | ----------- | -- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| bannerConfig | banner 配置参数 | 是 | 该对象有 locationId 和 container 两个参数,分别为默认 banner 配置对应的位置 ID 和 承载 banner 的容器,若列表为 UITableView,则该容器为一个 UITableViewCell 的子类,注意在返回 table 行高的代理方法里,container 参数需传空。具体参考集成示例。 |
**接口返回:返回 banner 的 size**
**注意事项:无**
## 四、备注
### APNS 推送
易达 SDK 接通了苹果 APNS 推送服务,并支持统计推送到达率、点击率。
* 登录[易达系统](https://ea.analysys.cn:8088/app.html#/Login),进行 push 配置,选择 并上传 iOS 生产证书、填写证书秘钥。
* 对应接口,详细参考 iOS API
```
+(void)pushTrack:(PushEventType)type msg:(NSDictionary *)msg groupIdentifier:(NSString *)groupIdentifier;
```
### 极光推送
易达 SDK 接通了极光推送服务,并支持统计推送到达率、点击率。
* 登录极光后台,进行 push 配置,上传推送证书或者配置 token。
* 若使用极光推送通道,客户端集成了极光 SDK,初始化 EA SDK 时,需配置AnalysysEaConfig 属性 pushClosed 为 YES,避免 EA 重复注册远程推送。
* 实现极光推送回调接口:
```
// iOS 10 Support 推送触达
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler API_AVAILABLE(ios(10.0)){
// Required
NSDictionary * userInfo = notification.request.content.userInfo;
if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
// 注意:若实现 Notification Service Extension,需注释掉改行代码,收到推送会执行扩展中的方法
// [AnalysysEaManager pushTrack:PUSH_RECEIVE msg:userInfo groupIdentifier:GROUP_IDENTIFIER];
}
completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
}
// iOS 10 Support 推送点击
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if ([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
[AnalysysEaManager pushTrack:PUSH_CLICK msg:userInfo groupIdentifier:GROUP_IDENTIFIER];
}
completionHandler(); // 系统要求执行这个方法
}
```
### 配置弹窗、推送、banner 信息流广告点击跳转链接
在创建弹窗、推送活动时,易达 iOS SDK 支持三种类型的链接配置:
* URL 网址,打开对应的网页。
* 非 URL scheme 链接,形式为 XXXController?key1=value1\&key2=value2 该情形为 SDK 内部实现点击跳转到 APP 内指定页面,其中 XXXController 为要跳转页面的技术标识(类名),key1、key2 为类对应的属性。
* URL scheme 链接,形式为 scheme://XXXController?key1=value1\&key2=value2 该情形需 APP 客户端自行拦截,其中 XXXController 为要跳转页面的技术标识(类名),key1、key2 为类对应的属性。在 info.plist 中添加 URL scheme,添加 LSApplicationQueriesSchemes 白名单,并实现系统代理方法,在其中做拦截跳转处理:
* (BOOL)application:(UIApplication _)app openURL:(NSURL _)url options:(NSDictionary \*)options;
注意:以上非 URL 网址类的 APP 内指定页面跳转,所配置的链接参数,均需与页面所属类及类的真实属性一一对应,在配置时需要与 APP 开发人员核对。
## 五、FAQ
### 集成动态库后,添加 Notification Service Extension 扩展并在代理方法中调用 SDK 方法,编译报错
* 动态库目前不支持在该扩展中调用三方 SDK,换用静态库集成即可
* 如果必须使用动态库集成,则需删除 Extension
### 后台统计的推送到达不准或无数据
* 若后台统计不到推送到达,先检查 APP 是否添加了 Notification Service Extension 扩展,且添加了 App Groups 并设置其 Id 为您自定义的名称,推荐以 **group.xxx** 的形式命名
### 添加完 App Groups ,名称一直显示为红色,编译报错
* 检查苹果官网里您的 App Id、证书配置文件是否都包含了对 App Group 功能的支持,若没有的话,需要勾选或者按照相应指示添加
### 添加 Notification Service Extension 扩展并在相应代理方法中调用 SDK 方法,编译报错
* 若报错提示信息类似如下,可能是添加静态库时没有将其引入到 Notification Service Extension 对应的 target 中,解决办法是重新将静态库拖入工程中并勾选上主 target 和 扩展 target 即可;若您使用的是动态库,则需要将 framework 拖拽到扩展 target 对应的 Link Binary With Libraries 中
```
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_AnalysysEaManager", referenced from:
objc-class-ref in NotificationService.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
### release 模式下编译报错
* 若报错提示信息类似如下,则需要检查扩展 target 对应的 bitcode 设置是否关闭。默认为 Yes,设置为 No 即可
```
d: '/Users/guoyongqing/code/ea-ios-sdk/eaApp/AnalysysEasyTouch.framework/AnalysysEasyTouch' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. file '/Users/guoyongqing/code/ea-ios-sdk/eaApp/AnalysysEasyTouch.framework/AnalysysEasyTouch' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
### Archive 之后打包发布的时候报错,提示 IPA processing failed
* 若出现这种错误,一般是因为引入的三方库中包含了 i386 x86\_64 armv7 arm64 四种架构,真机打包时不支持模拟器架构,将 framework 中对应的模拟器架构(i386、x86\_64)删除即可。 解决方式一:在命令行执行以下命令直接删除(缺点是模拟器将不能被支持)
```
1.使用终端进入到SDK内部
cd /Users/xxx/xxx/xxx/AnalysysEasyTouch.framework
2.查看当前支持的架构
lipo -info AnalysysEasyTouch
可以看到AnalysysEasyTouch当前支持的架构:
Architectures in the fat file: AnalysysEasyTouch are: i386 x86\_64 armv7 arm64
3.删掉i386,x86\_86架构
lipo -remove i386 AnalysysEasyTouch -o AnalysysEasyTouch
lipo -remove x86\_64 AnalysysEasyTouch -o AnalysysEasyTouch
```
* 解决方式二:Target -> Build Phases -> Add Run Script,添加以下脚本,并勾选 Run script only when
installing(该选项意思是在 Archive 打包时才会执行脚本)
```
#!/bin/sh
# Strip invalid architectures
strip_invalid_archs() {
binary="$1"
echo "current binary ${binary}"
# Get architectures for current file
archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
stripped=""
for arch in $archs; do
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
if [ -f "$binary" ]; then
# Strip non-valid architectures in-place
lipo -remove "$arch" -output "$binary" "$binary" || exit 1
stripped="$stripped $arch"
fi
fi
done
if [[ "$stripped" ]]; then
echo "Stripped $binary of architectures:$stripped"
fi
}
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
strip_invalid_archs "$FRAMEWORK_EXECUTABLE_PATH"
done
```
### 集成了三方推送 SDK 和 EA SDK 发生冲突
* 若集成了三方推送 SDK,例如集成了极光推送 SDK,同时也集成了 EA SDK,出现某一 SDK 消息推送回调被覆盖或不执行的情况,解决办法是初始化 EA SDK 时将 AnalysysEaConfig 对象的 pushClosed 属性设置为 YES,这样 EA 在启动时将不会注册远程推送,只需实现极光推送的回调方法,EA 和极光推送在收到推送消息或点击推送消息的时候,都会执行极光推送的回调方法,在回调方法里调用 EA 和极光对应的处理推送的方法即可。
### 动态库包含模拟器和真机架构,编译时报错
* 若报错提示信息类似如下,则将对应 target 中 building settings 中 Validate Workspace 设置为 YES 即可,后续恢复设置也不会报错了
```
Building for iOS, but the linked and embedded framework was built for iOS + iOS Simulator.
```
## 六、技术支持
当出现问题时:
* 请仔细阅读文档,查看是否有遗漏。
* 给我们的技术 support 发邮件:wangjian@analysys.com.cn
- 使用指南
- 智能运营产品使用手册
- ⏰ 5 分钟快速上手
- ✍️ 我要发布活动
- 创建 web 弹窗活动
- 创建短信活动
- 创建微信客服消息活动
- 创建信息流广告活动
- 创建微信小程序活动
- 创建微信模板消息活动
- 创建 App 弹窗活动
- 创建 Push 消息活动
- ⚙️ 自动化工作流
- 基本组件介绍
- 用户类组件详细说明
- 触达通道类组件详细说明
- 条件类组件详细说明
- 📖 内容管理
- H5编辑器
- 表单编辑器
- H5互动编辑器
- 👬 微信粉丝管理
- 📲互动玩法
- 分销裂变
- 拼团裂变
- 任务宝
- 定金膨胀
- 企业微信运营工具
- 企业微信上线准备-配置引导
- 创建员工欢迎语
- 创建客户群欢迎语
- 创建群发客户消息
- 转化目标的配置及应用
- 创建群发客户群消息
- 创建客户标签
- 创建客户群标签
- 创建员工活码
- 添加聊天工具栏
- 获取群二维码
- 创建企业朋友圈
- 创建素材中心
- 如何创建和使用批量加好友
- 📄 更新日志
- 功能更新
- 用户权限管理
- 审批功能
- 版本更新
- V2.1裂变、企微功能
- 开发者指南
- 系统初始化
- 扫码绑定微信
- 配置方舟数据平台
- SDK集成文档
- 微信小程序 SDK
- JS SDK
- Android SDK
- iOS SDK
- SDK 版本更新说明
- EA 系统集成文档
- API
- 推送API
- 错误码
- 其他
- 名词解释
- 如何配置阿里云短信通道
- 邀请有礼注册事件及转化事件上报指南
- FAQ
- 创建 Push 活动的 FAQ
- 创建微信模板消息活动的 FAQ
- 创建微信小程序活动的 FAQ
- 创建微信客服消息活动的 FAQ