iOS通过Plist保存离线调试日志

本文介绍如何使用Objective-C在iPhone应用中实现定位信息的日志保存和本地查看,包括新建日志保存方法、定位成功时调用方法及模拟器和真机查看日志的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需要测试APP在iPhone没连接USB情况下定位时间间隔的情况,固把nslog的日志信息保存成本地Plist文件,以便测试结束后查阅运行时的日志。

一、新建一个保存日志的方法,参数为每次定位成功的时间(作为key),定位成功的地点(作为value):


-(void)mylog:(NSString*)logKey andValue:(NSString*)logValue{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectroy = [paths objectAtIndex:0];
    NSString *filename =@"test2.plist";
    NSString *filePath = [documentsDirectroy stringByAppendingPathComponent:filename];
    NSLog(@"filePath:%@",filePath);
    NSFileManager *file =  [NSFileManager defaultManager];
    NSMutableDictionary *dic;
    if ([file fileExistsAtPath:filePath]) {
        dic = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
    }else{
        dic = [[NSMutableDictionary alloc] init];
    }
    [dic setValue:logValue  forKey:logKey];
    [dic writeToFile:filePath atomically:YES];
}


二、在定位成功时调用mylog函数,以保存定位成功的信息:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    nowLocation = [locations lastObject];
    CLLocation *locationGCJ = [nowLocation locationMarsFromEarth];
    coordinate = locationGCJ.coordinate;
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:locationGCJ completionHandler:^(NSArray *placemarks, NSError *error) {
        if(placemarks.count > 0) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            address =placemark.name;
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            NSString *destDateString = [dateFormatter stringFromDate:[NSDate date]];
            [self mylog2:destDateString andValue:placemark.name];
        }
    }];
}

三、分别让APP在模拟器和真机跑了一段时间后,我们来查看下保存的日志信息:

1、模拟器:通过my log函数里打印的文件地址 (我的为:filePath:/Users/jackxu/Library/Developer/CoreSimulator/Devices/B24F5E52-CB0D-41DF-8623-8CEDF21206FC/data/Containers/Data/Application/F61B5D71-1BD5-49D6-8B32-628E03434A8C/Documents/test2.plist),选择finder->前往->前往文件夹,输入地址就行可访问,如图:



2.真机:真机下载一个 iPhone Explorer,(下载地址:http://www.macroplant.com/iexplorer/),就可以查看真机的文件系统,如图:




<think>我们正在处理一个关于在UniApp中集成UniPush 2.0并使用FCM实现离线推送功能的问题。根据提供的引用信息,我们可以总结出以下关键步骤: 1. **开通UniPush服务**:在DCloud开发者中心开通UniPush服务。 2. **配置厂商推送设置**:在UniPush后台配置FCM(Firebase Cloud Messaging)的参数。 3. **获取FCM配置文件**:在Firebase控制台创建项目并下载`google-services.json`文件(对于Android)或`GoogleService-Info.plist`文件(对于iOS)。由于我们这里主要讨论FCM(通常用于Android,但FCM也支持iOS),但根据问题描述,我们重点在Android上使用FCM。 4. **将FCM配置信息填入UniPush后台**:将`google-services.json`文件中的内容复制到UniPush后台的厂商推送设置中。 5. **使用云打包并打签名包**:配置完成后,必须使用自有证书进行云打包,生成签名包。不能使用基座测试,因为基座测试无法使用厂商通道。 6. **在App中获取CID**:在App中编写代码获取设备的CID(Client ID),用于推送目标。 7. **测试推送**:使用云打包后的安装包安装到手机,然后进行离线推送测试。 具体步骤如下: ### 步骤1:开通UniPush服务 在DCloud开发者中心开通UniPush服务,并创建应用。具体步骤可参考[引用1]。 ### 步骤2:配置FCM(Firebase Cloud Messaging) 1. 访问Firebase控制台(https://console.firebase.google.com/)并创建一个项目。 2. 在Firebase项目中添加Android应用: - 填写应用包名(必须与UniApp项目的包名一致)。 - 然后下载`google-services.json`文件。 3. 在Firebase项目中,进入项目设置,在“云消息传递”选项卡中获取服务器密钥(Server Key)和发件人ID(Sender ID)。这些信息在配置UniPush后台的FCM参数时需要。 ### 步骤3:在UniPush后台配置FCM 1. 登录DCloud开发者中心,进入UniPush管理后台。 2. 找到“厂商推送设置”部分,选择FCM(Google)通道。 3. 填写从Firebase控制台获取的服务器密钥(Server Key)和发件人ID(Sender ID)。同时,需要上传`google-services.json`文件的内容(根据[引用4],将`google-services.json`文件的内容复制到配置中)。 - 注意:根据[引用4]的提示,在厂商推送设置的FCM配置中,需要将`google-services.json`文件的内容复制到配置表单中(可能是作为一个JSON字符串填入)。 ### 步骤4:云打包 1. 在HBuilderX中,确保已配置Android包名(与Firebase中填写的包名一致)。 2. 配置应用签名(使用自有证书)。如果没有证书,需要生成一个。 3. 在HBuilderX中选择“发行”->“原生App-云打包”,选择“使用自有证书”,填写证书信息,然后打包。 - 注意:必须使用云打包,并且使用自有证书签名(参考[引用2])。 ### 步骤5:在App中获取CID 在App中,使用以下代码获取CID(Client ID),该CID用于标识设备,以便服务器向该设备推送消息。 ```javascript getCID() { let cid = ''; // #ifdef APP-PLUS let pinf = plus.push.getClientInfo(); cid = pinf.clientid; // #endif return cid; } ``` 将获取到的CID上传到你的服务器,以便在推送时指定目标设备。 ### 步骤6:测试推送 1. 将云打包生成的APK安装到手机上(确保手机能够正常访问Google服务,因为FCM需要)。 2. 在UniPush后台或通过自己的服务器发送推送消息,指定目标设备的CID。 3. 观察设备是否能够收到推送消息(包括应用在前台和后台的情况,以及完全退出的情况)。 ### 注意事项 - 根据[引用2],必须使用云打包后的安装包进行测试,不能使用基座方式获取的CID进行离线厂商推送测试。 - 确保测试设备能够正常访问Google服务(即能够连接FCM服务器)。 ### 引用说明 [^1]: UniPush介绍及开通配置指南。 [^2]: 配置厂商推送设置后必须云打包并使用自有证书。 [^3]: 厂商通道集成需要配置各厂商信息,但本例中我们只关注FCM。 [^4]: FCM配置需要`google-services.json`文件的内容。 ### 总结 通过以上步骤,我们可以在UniApp中集成UniPush 2.0并使用FCM实现离线推送。关键点在于正确配置Firebase项目,并在UniPush后台正确设置FCM参数,然后使用自有证书进行云打包。最后,使用云打包后的应用进行测试。 ### 相关问题 1. 如何测试UniPush推送功能? 2. 在UniApp中,如何处理接收到推送消息的事件? 3. UniPush支持哪些厂商推送通道? 4. 如何配置其他厂商(如华为、小米)的推送通道?</think>### UniApp集成UniPush 2.0使用FCM实现离线推送配置方法 以下是完整配置流程,所有步骤均需严格执行: #### 1. **开通UniPush服务** - 登录[DCloud开发者中心](https://dev.dcloud.net.cn/) - 在应用管理中找到目标项目,启用`UniPush 2.0`服务 - 注意:需完成开发者实名认证和企业认证(重要) #### 2. **配置Firebase项目** ```mermaid graph TD A[创建Firebase项目] --> B[注册Android应用] B --> C[下载google-services.json] C --> D[获取服务器密钥] ``` - 访问[Firebase控制台](https://console.firebase.google.com/) - 创建新项目 → 添加Android应用 → 输入**与UniApp一致的包名** - 下载`google-services.json`文件(关键配置文件) - 获取服务器密钥: - 项目设置 → 云消息传递 → 复制`服务器密钥`和`发件人ID` #### 3. **配置UniPush厂商通道** - 在UniPush管理后台 → **厂商推送设置** → 选择`FCM(Google)` - 填写参数: ``` 服务器密钥: 粘贴Firebase的服务器密钥 发件人ID: 粘贴Firebase的发件人ID google-services.json: 粘贴文件完整内容 ``` - 参考[引用4]:将`google-services.json`文件内容完整复制到配置项 #### 4. **关键代码实现** ```javascript // 获取设备CID(必须使用云打包后运行) getClientId() { let cid = ''; // #ifdef APP-PLUS if (plus.push.getClientInfo) { const pinf = plus.push.getClientInfo(); cid = pinf.clientid; // 设备唯一标识 } // #endif return cid; } ``` **注意事项**: - 此代码**必须通过云打包后生效**,基座调试无效[^2] - CID是推送目标的关键标识 #### 5. **云打包配置** 1. 在HBuilderX中配置: - `manifest.json` → App模块配置 → 勾选`Push(消息推送)` - 选择`UniPush`作为推送服务商 2. **必须使用自有证书打包**: ```bash 发行 → 原生App-云打包 → 选择Android → 使用自有证书 ``` 3. 提交包含FCM配置的云打包请求 #### 6. **测试验证流程** ```mermaid sequenceDiagram 开发者->>UniPush服务器: 发送测试推送(CID+消息内容) UniPush服务器->>FCM服务器: 转发推送请求 FCM服务器->>目标设备: 通过GMS服务投递 目标设备-->>应用: 唤醒应用接收推送 ``` - 测试要求: - 使用**正式签名包**安装(debug包无法触发厂商通道) - 测试设备需安装Google Play服务 - 首次启动需允许应用后台运行权限 #### 7. **常见问题解决** - **推送失败检查清单**: 1. 确认`google-services.json`中的包名与应用一致 2. 检查Firebase项目已启用Android FCM服务 3. 确保设备网络可访问Google服务 4. 验证云打包时证书指纹与Firebase注册的SHA-1匹配 - **调试建议**: - 使用`adb logcat | grep 'Push'`查看推送日志 - 在Firebase控制台直接发送测试消息 ### 重要注意事项 1. **必须云打包**:厂商通道仅在使用[自有证书云打包]后生效[^2] 2. **FCM限制**:国内安卓设备需安装Google框架且能访问Google服务 3. **多厂商备用**:建议同时配置华为、小米等国内厂商通道(配置方法参考[引用3]) > 配置完成后,通过UniPush发送的消息将优先通过FCM通道投递。当设备无法连接FCM时,系统会自动降级到个推通道保障送达[^1]。 ### 相关问题 1. UniPush如何实现消息送达率优化? 2. 如何同时配置华为/小米等国内厂商的离线推送? 3. UniPush消息推送的计费模式是怎样的? 4. 如何处理Android设备关闭应用自启动导致的推送失效? [^1]: UniPush介绍及通道选择原理 [^2]: 厂商推送必须使用云打包的说明 [^3]: 各厂商推送服务配置入口 [^4]: FCM配置文件配置方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值