Integrate Facebook SDK for enhanced event tracking across the app. Update Info.plist with Facebook app credentials and URL schemes. Implement logging for QR code generation, scanning, and sharing events in relevant views to improve analytics and user engagement.

main
v504 2 months ago
parent 090539427e
commit 81b2c74846

@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */
5817666F2E54497800C1B687 /* QRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 5817666E2E54497800C1B687 /* QRCode */; };
581766772E544AFF00C1B687 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 581766752E544AEC00C1B687 /* AVFoundation.framework */; };
5817667C2E544C0000C1B687 /* FacebookCore in Frameworks */ = {isa = PBXBuildFile; productRef = 5817667B2E544C0000C1B687 /* FacebookCore */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -73,6 +74,7 @@
files = (
581766772E544AFF00C1B687 /* AVFoundation.framework in Frameworks */,
5817666F2E54497800C1B687 /* QRCode in Frameworks */,
5817667C2E544C0000C1B687 /* FacebookCore in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -143,6 +145,7 @@
name = MyQrCode;
packageProductDependencies = (
5817666E2E54497800C1B687 /* QRCode */,
5817667B2E544C0000C1B687 /* FacebookCore */,
);
productName = MyQrCode;
productReference = 5817662F2E54241200C1B687 /* MyQrCode.app */;
@ -238,6 +241,7 @@
minimizedProjectReferenceProxies = 1;
packageReferences = (
5817666D2E54497800C1B687 /* XCRemoteSwiftPackageReference "qrcode" */,
5817667A2E544C0000C1B687 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 581766302E54241200C1B687 /* Products */;
@ -318,6 +322,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
@ -372,6 +377,7 @@
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
@ -382,6 +388,7 @@
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
@ -429,6 +436,7 @@
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES;
};
@ -464,7 +472,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.abe.example.demo.MyQrCode;
PRODUCT_BUNDLE_IDENTIFIER = com.qrcode.scanner.app;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -506,7 +514,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.abe.example.demo.MyQrCode;
PRODUCT_BUNDLE_IDENTIFIER = com.qrcode.scanner.app;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -528,7 +536,7 @@
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.abe.example.demo.MyQrCodeTests;
PRODUCT_BUNDLE_IDENTIFIER = com.qrcode.scanner.app.tests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -550,7 +558,7 @@
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.abe.example.demo.MyQrCodeTests;
PRODUCT_BUNDLE_IDENTIFIER = com.qrcode.scanner.app.tests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -570,7 +578,7 @@
DEVELOPMENT_TEAM = 6AS7587HX4;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.abe.example.demo.MyQrCodeUITests;
PRODUCT_BUNDLE_IDENTIFIER = com.qrcode.scanner.app.uitests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -590,7 +598,7 @@
DEVELOPMENT_TEAM = 6AS7587HX4;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.abe.example.demo.MyQrCodeUITests;
PRODUCT_BUNDLE_IDENTIFIER = com.qrcode.scanner.app.uitests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -652,6 +660,14 @@
minimumVersion = 27.11.0;
};
};
5817667A2E544C0000C1B687 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/facebook/facebook-ios-sdk";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 18.0.0;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
@ -660,6 +676,11 @@
package = 5817666D2E54497800C1B687 /* XCRemoteSwiftPackageReference "qrcode" */;
productName = QRCode;
};
5817667B2E544C0000C1B687 /* FacebookCore */ = {
isa = XCSwiftPackageProductDependency;
package = 5817667A2E544C0000C1B687 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */;
productName = FacebookCore;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 581766272E54241200C1B687 /* Project object */;

@ -1,6 +1,15 @@
{
"originHash" : "fd2455af71f8be5e18c9e2dd99f5fea73d2285d99fb343d056d9b2dde36eadc7",
"originHash" : "811332fdf8997a3f6c0c2880856dbcc192f86e3bc4efc8ad2e5c1b28d8a9e89d",
"pins" : [
{
"identity" : "facebook-ios-sdk",
"kind" : "remoteSourceControl",
"location" : "https://github.com/facebook/facebook-ios-sdk",
"state" : {
"revision" : "b28dde427715b45a26ebebf697929f4a81b15e04",
"version" : "18.0.0"
}
},
{
"identity" : "qrcode",
"kind" : "remoteSourceControl",

@ -114,6 +114,36 @@
endingLineNumber = "233"
landmarkName = "createInputComponent(for:emailConfig:wifiConfig:contactConfig:locationConfig:calendarConfig:socialConfig:phoneConfig:urlConfig:textConfig:)"
landmarkType = "7">
<Locations>
<Location
uuid = "937652B7-5A6D-4691-903E-F45D0841A211 - 4e0ffa10f92b8035"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "static MyQrCode.InputComponentFactory.createInputComponent(for: MyQrCode.QRCodeType, emailConfig: Swift.Optional&lt;MyQrCode.EmailInputConfig&gt;, wifiConfig: Swift.Optional&lt;MyQrCode.WiFiInputConfig&gt;, contactConfig: Swift.Optional&lt;MyQrCode.ContactInputConfig&gt;, locationConfig: Swift.Optional&lt;MyQrCode.LocationInputConfig&gt;, calendarConfig: Swift.Optional&lt;MyQrCode.CalendarInputConfig&gt;, socialConfig: Swift.Optional&lt;MyQrCode.SocialInputConfig&gt;, phoneConfig: Swift.Optional&lt;MyQrCode.PhoneInputConfig&gt;, urlConfig: Swift.Optional&lt;MyQrCode.URLInputConfig&gt;, textConfig: Swift.Optional&lt;MyQrCode.TextInputConfig&gt;) -&gt; SwiftUI.AnyView"
moduleName = "MyQrCode.debug.dylib"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/yc/xcodeProjects/MyQrCode/MyQrCode/Views/Components/InputComponentFactory.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "233"
endingLineNumber = "233">
</Location>
<Location
uuid = "937652B7-5A6D-4691-903E-F45D0841A211 - 4e0ffa10f92b8035"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "static MyQrCode.InputComponentFactory.createInputComponent(for: MyQrCode.QRCodeType, emailConfig: Swift.Optional&lt;MyQrCode.EmailInputConfig&gt;, wifiConfig: Swift.Optional&lt;MyQrCode.WiFiInputConfig&gt;, contactConfig: Swift.Optional&lt;MyQrCode.ContactInputConfig&gt;, locationConfig: Swift.Optional&lt;MyQrCode.LocationInputConfig&gt;, calendarConfig: Swift.Optional&lt;MyQrCode.CalendarInputConfig&gt;, socialConfig: Swift.Optional&lt;MyQrCode.SocialInputConfig&gt;, phoneConfig: Swift.Optional&lt;MyQrCode.PhoneInputConfig&gt;, urlConfig: Swift.Optional&lt;MyQrCode.URLInputConfig&gt;, textConfig: Swift.Optional&lt;MyQrCode.TextInputConfig&gt;) -&gt; SwiftUI.AnyView"
moduleName = "MyQrCode.debug.dylib"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/yc/xcodeProjects/MyQrCode/MyQrCode/Views/Components/InputComponentFactory.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "233"
endingLineNumber = "233">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
@ -194,6 +224,36 @@
endingLineNumber = "281"
landmarkName = "calendarInfoDetailView(parsedData:)"
landmarkType = "7">
<Locations>
<Location
uuid = "0E8D1C5E-D350-449F-8C7B-5D789F9A72B1 - 437388a8c06debe1"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #1 () -&gt; Swift.Optional&lt;&lt;&lt;opaque return type of SwiftUI.View.frame(minWidth: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, idealWidth: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, maxWidth: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, minHeight: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, idealHeight: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, maxHeight: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, alignment: SwiftUI.Alignment) -&gt; some&gt;&gt;.0&gt; in closure #1 () -&gt; SwiftUI._ConditionalContent&lt;SwiftUI.TupleView&lt;(Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;)&gt;, &lt;&lt;opaque return type of SwiftUI.View.cornerRadius(_: CoreGraphics.CGFloat, antialiased: Swift.Bool) -&gt; some&gt;&gt;.0&gt; in MyQrCode.QRCodeDetailView.calendarInfoDetailView(parsedData: MyQrCode.ParsedQRData) -&gt; some"
moduleName = "MyQrCode.debug.dylib"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/yc/xcodeProjects/MyQrCode/MyQrCode/Views/History/QRCodeDetailView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "281"
endingLineNumber = "281">
</Location>
<Location
uuid = "0E8D1C5E-D350-449F-8C7B-5D789F9A72B1 - 437388a8c06debe1"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #1 () -&gt; Swift.Optional&lt;&lt;&lt;opaque return type of SwiftUI.View.frame(minWidth: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, idealWidth: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, maxWidth: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, minHeight: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, idealHeight: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, maxHeight: Swift.Optional&lt;CoreGraphics.CGFloat&gt;, alignment: SwiftUI.Alignment) -&gt; some&gt;&gt;.0&gt; in closure #1 () -&gt; SwiftUI._ConditionalContent&lt;SwiftUI.TupleView&lt;(Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;, Swift.Optional&lt;&lt;&lt;opaque return type of MyQrCode.QRCodeDetailView.contactInfoRow(icon: Swift.String, title: Swift.String, value: Swift.String) -&gt; some&gt;&gt;.0&gt;)&gt;, &lt;&lt;opaque return type of SwiftUI.View.cornerRadius(_: CoreGraphics.CGFloat, antialiased: Swift.Bool) -&gt; some&gt;&gt;.0&gt; in MyQrCode.QRCodeDetailView.calendarInfoDetailView(parsedData: MyQrCode.ParsedQRData) -&gt; some"
moduleName = "MyQrCode.debug.dylib"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/yc/xcodeProjects/MyQrCode/MyQrCode/Views/History/QRCodeDetailView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "281"
endingLineNumber = "281">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
@ -322,6 +382,36 @@
endingLineNumber = "1371"
landmarkName = "openSocialApp(content:appType:)"
landmarkType = "7">
<Locations>
<Location
uuid = "081EEF9C-8A5B-4C89-8DB2-0BAC1AABA1D6 - b0c48453778d2334"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "MyQrCode.QRCodeDetailView.openSocialApp(content: Swift.String, appType: MyQrCode.QRCodeDetailView.SocialAppType) -&gt; ()"
moduleName = "MyQrCode.debug.dylib"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/yc/xcodeProjects/MyQrCode/MyQrCode/Views/History/QRCodeDetailView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "1371"
endingLineNumber = "1371">
</Location>
<Location
uuid = "081EEF9C-8A5B-4C89-8DB2-0BAC1AABA1D6 - b0c48453778d2334"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "MyQrCode.QRCodeDetailView.openSocialApp(content: Swift.String, appType: MyQrCode.QRCodeDetailView.SocialAppType) -&gt; ()"
moduleName = "MyQrCode.debug.dylib"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/yc/xcodeProjects/MyQrCode/MyQrCode/Views/History/QRCodeDetailView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "1371"
endingLineNumber = "1371">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>

@ -6,6 +6,7 @@
//
import SwiftUI
import FacebookCore
@main
struct MyQrCodeApp: App {
@ -14,6 +15,11 @@ struct MyQrCodeApp: App {
@StateObject private var memoryMonitor = MemoryMonitor.shared
@State private var showLaunchScreen = true
init() {
// Facebook SDK
FacebookEventManager.shared.configure()
}
var body: some Scene {
WindowGroup {
ZStack {
@ -35,6 +41,9 @@ struct MyQrCodeApp: App {
withAnimation(.easeInOut(duration: 0.5)) {
showLaunchScreen = false
}
//
FacebookEventManager.shared.logAppLaunch()
}
}
}

@ -0,0 +1,147 @@
# Facebook SDK 集成说明
## 概述
本项目已成功集成Facebook SDK用于跟踪用户行为和收集应用使用数据。
## 集成内容
### 1. 依赖管理
- 使用Swift Package Manager添加Facebook SDK
- 包地址:`https://github.com/facebook/facebook-ios-sdk`
- 最低版本16.0.0
### 2. 核心组件
#### FacebookEventManager
位置:`MyQrCode/Utils/FacebookEventManager.swift`
主要功能:
- 初始化Facebook SDK
- 记录各种应用事件
- 提供统一的事件跟踪接口
#### 事件类型
- **应用启动**: `logAppLaunch()`
- **二维码扫描**: `logQRCodeScan(type:)`
- **二维码生成**: `logQRCodeGeneration(type:)`
- **功能使用**: `logFeatureUsage(feature:)`
- **分享**: `logShare(contentType:)`
- **购买**: `logPurchase(amount:currency:)`
### 3. 配置要求
#### Info.plist配置
```xml
<!-- Facebook SDK Configuration -->
<key>FacebookAppID</key>
<string>YOUR_FACEBOOK_APP_ID</string>
<key>FacebookClientToken</key>
<string>YOUR_FACEBOOK_CLIENT_TOKEN</string>
<key>FacebookDisplayName</key>
<string>MyQrCode</string>
<key>FacebookAutoLogAppEventsEnabled</key>
<false/>
<key>FacebookAdvertiserIDCollectionEnabled</key>
<false/>
```
#### 需要替换的值
- `YOUR_FACEBOOK_APP_ID`: 你的Facebook应用ID
- `YOUR_FACEBOOK_CLIENT_TOKEN`: 你的Facebook客户端令牌
### 4. 使用方法
#### 初始化
在`MyQrCodeApp.swift`中自动初始化:
```swift
init() {
// 初始化Facebook SDK
FacebookEventManager.shared.configure()
}
```
#### 记录事件
```swift
// 记录二维码扫描
FacebookEventManager.shared.logQRCodeScan(type: "QR_CODE")
// 记录二维码生成
FacebookEventManager.shared.logQRCodeGeneration(type: "EMAIL")
// 记录分享
FacebookEventManager.shared.logShare(contentType: "qr_code")
```
### 5. 事件跟踪点
#### 自动跟踪
- **应用启动**: 启动页面消失后自动记录
- **二维码扫描**: 扫描成功后自动记录
- **二维码生成**: 创建二维码时自动记录
- **分享功能**: 使用分享功能时自动记录
#### 手动跟踪
可以在任何需要的地方手动调用事件记录方法。
### 6. 隐私设置
#### 已禁用的功能
- `FacebookAutoLogAppEventsEnabled`: false - 禁用自动事件记录
- `FacebookAdvertiserIDCollectionEnabled`: false - 禁用广告ID收集
#### 用户控制
- 所有事件跟踪都通过代码控制
- 不收集个人身份信息
- 只跟踪应用功能使用情况
### 7. 测试和调试
#### 开发环境
- 使用测试Facebook应用ID
- 在Facebook开发者控制台查看事件
#### 生产环境
- 使用正式Facebook应用ID
- 确保所有配置正确
### 8. 注意事项
#### 合规性
- 确保符合GDPR等隐私法规
- 在隐私政策中说明数据收集
- 提供用户选择退出的选项
#### 性能
- 事件记录是异步的,不影响应用性能
- 网络请求在后台进行
#### 错误处理
- SDK初始化失败不会影响应用功能
- 事件记录失败会静默处理
## 故障排除
### 常见问题
1. **编译错误**: 检查Facebook SDK是否正确添加
2. **初始化失败**: 验证Info.plist配置
3. **事件不记录**: 检查网络连接和Facebook应用配置
### 调试步骤
1. 检查控制台日志
2. 验证Facebook应用配置
3. 测试网络连接
4. 查看Facebook开发者控制台
## 更新和维护
### 版本更新
- 定期更新Facebook SDK到最新版本
- 关注Facebook开发者博客的更新说明
### 功能扩展
- 可以添加更多自定义事件
- 支持自定义参数和属性
- 集成Facebook Analytics获取更详细数据

@ -19,25 +19,9 @@
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.abe.example.demo.MyQrCode.phone</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tel</string>
<string>sms</string>
</array>
</dict>
<dict>
<key>CFBundleURLName</key>
<string>com.abe.example.demo.MyQrCode.social</string>
<key>CFBundleURLSchemes</key>
<array>
<string>instagram</string>
<string>fb</string>
<string>twitter</string>
<string>whatsapp</string>
<string>viber</string>
<string>spotify</string>
<string>fb2183345158821655</string>
</array>
</dict>
</array>
@ -48,5 +32,15 @@
</dict>
<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
<string>$(PRODUCT_NAME) needs write-only access to calendar to add events</string>
<key>FacebookAppID</key>
<string>2183345158821655</string>
<key>FacebookClientToken</key>
<string>edb0aea9c3cb29f03b23b9e7f07aaed8</string>
<key>FacebookDisplayName</key>
<string>MyQrCode</string>
<key>FacebookAutoLogAppEventsEnabled</key>
<true/>
<key>FacebookAdvertiserIDCollectionEnabled</key>
<true/>
</dict>
</plist>

@ -0,0 +1,65 @@
import Foundation
import FacebookCore
// MARK: - Facebook
class FacebookEventManager {
static let shared = FacebookEventManager()
private init() {}
// MARK: - Facebook SDK
func configure() {
// Facebook SDK
FacebookCore.ApplicationDelegate.shared.application(
UIApplication.shared,
didFinishLaunchingWithOptions: nil
)
}
// MARK: -
func logAppLaunch() {
FacebookCore.AppEvents.shared.logEvent(.completedRegistration)
}
// MARK: -
func logQRCodeScan(type: String) {
let parameters = [
FacebookCore.AppEvents.ParameterName.contentType: "qr_code",
FacebookCore.AppEvents.ParameterName.content: type
]
FacebookCore.AppEvents.shared.logEvent(.viewedContent, parameters: parameters)
}
// MARK: -
func logQRCodeGeneration(type: String) {
let parameters = [
FacebookCore.AppEvents.ParameterName.contentType: "qr_code_generation",
FacebookCore.AppEvents.ParameterName.content: type
]
FacebookCore.AppEvents.shared.logEvent(.completedTutorial, parameters: parameters)
}
// MARK: - 使
func logFeatureUsage(feature: String) {
let parameters = [
FacebookCore.AppEvents.ParameterName.contentType: "feature_usage",
FacebookCore.AppEvents.ParameterName.content: feature
]
FacebookCore.AppEvents.shared.logEvent(.searched, parameters: parameters)
}
// MARK: -
func logShare(contentType: String) {
let parameters = [
FacebookCore.AppEvents.ParameterName.contentType: contentType
]
FacebookCore.AppEvents.shared.logEvent(.completedTutorial, parameters: parameters)
}
// MARK: -
func logPurchase(amount: Double, currency: String = "USD") {
FacebookCore.AppEvents.shared.logPurchase(amount: amount, currency: currency)
}
}

@ -103,6 +103,12 @@ Button("confirm".localized) { }
EmptyView()
}
)
.onChange(of: navigateToStyleView) { newValue in
if newValue {
//
FacebookEventManager.shared.logQRCodeGeneration(type: selectedQRCodeType.rawValue)
}
}
.onAppear {
setupInitialFocus()
}

@ -796,6 +796,10 @@ struct HistoryItemRow: View {
}
}
// Facebook -
let contentType = item.dataType == DataType.qrcode.rawValue ? "qr_code" : "barcode"
FacebookEventManager.shared.logShare(contentType: contentType)
//
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window = windowScene.windows.first,

@ -2,6 +2,8 @@ import SwiftUI
import CoreData
import QRCode
import NetworkExtension
import UIKit
import FacebookCore
internal import SwiftImageReadWrite
struct QRCodeDetailView: View {

@ -232,6 +232,14 @@ struct ScannerView: View {
self.navigateToDetail = true
}
// Facebook -
if selectedCode.type.lowercased().contains("qr") ||
selectedCode.type.lowercased().contains("二维码") ||
selectedCode.type.lowercased().contains("data matrix") ||
selectedCode.type.lowercased().contains("aztec") {
FacebookEventManager.shared.logQRCodeScan(type: selectedCode.type)
}
//
let formattedResult = "类型: \(selectedCode.type)\n内容: \(selectedCode.content)"
logInfo(" 格式化结果: \(formattedResult)", className: "ScannerView")

Loading…
Cancel
Save