在 Unity 想用個簡單的 Facebook 分享截圖的功能,想不到可以遇到那麼多困難,想想還是記錄一下,以免下次用到的時候忘記
當時的版本:
Unity Facebook SDK: 16.0.2
Unity: 2020.3.28f1
MacOS: Monterey, 12.6.3
XCode: 14.2
測試手機: iPhone XR, iOS 版本 16.0.3
ExternalDependencyManager: 1.2.166
只有想在 iOS 做這功能,Android 沒考慮
下面有路徑的部分,太長了我就用點點點代替,有專案名字的部分我就用 xxx 代替
試過的方法:
Unity Facebook SDK 沒有可以直接分享截圖的功能,它可以讓你把圖上傳到某個空間,然後用連結的形式分享,但沒辦法直接截圖分享,那時候試了:FB.ShareLink, FB.ShareLink
都不是我想要的,然後看別人說可以用 FB.API("me/phots", HttpMethod.POST, HandlesResult, wwwForm)
這種方式上傳照片然後再分享,感覺有點麻煩,而且我試了,也沒辦法用,一直拿到 403 forbidden
這個訊息,試了好久都不行我就放棄了
實際上用的方法:
接下來我就想試著用 iOS Plugin 的方式讓 Unity 直接呼叫 iOS Facebook SDK 的 SharePhoto
,上網查了一陣子,發現也有人這樣做但是是用 Objective-C
直接寫,我對 Objective-C
了解比較少,所以又去找了怎麼在 Unity 使用 Swift 的方法,方法是先把要寫的功能寫在 Swift,然後再建立一個 xxxBridge.mm
和 xxx-Bridging-Header.h
- xxxSwift 就是主要寫 FB 分享圖片功能的地方,照他參數的需求填一填就好了,delegate 目前沒想要接我就先填 nil 了,分享完成後他自己也會跳回 Unity
- xxxBridge.mm 是用來給 Unity 讀的,就是一個接口
#include “UnityFramework/UnityFramework-Swift.h”
這個很重要,不然他找不到你剛剛寫的 Swift - xxx-Bridging-Header.h 建出來不用寫東西就長這個樣子
接下來就把這三個檔案放到 Unity 專案裡的 Plugins/iOS 底下,這樣當你 Build 出 Xcode 專案後他就會自動幫你把這三個檔案放到 Libraries/Plugin-iOS 底下
接下來設定 Unity 專案
由於 Unity Facebook SDK 已經用不到了,所以之前下載安裝的東西都可以刪一刪了,但是有個東西要留下,就是 ExternalDependencyManager
他會幫你把你要用到的 framework 用 cocoapods 放到你 Build 出來的 XCode 專案,你 Build 出來的專案也會多出一個 Unity-iPhone.xcworkspace
從這邊進去就可以了
ExternalDependencyManager 設定
基本上設定都沒動,就只有 Link frameworks statically 要勾起來,不然會在遊戲一開始就 Crash 然後看到下面這個訊息
Library not loaded: @rpath/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics Referenced from: .../xxx/xxx.app/xxx Reason: tried: ‘.../xxx/xxx.app/Frameworks/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics’ (mach-o file (.../xxx/xxx.app/Frameworks/FBSDKCoreKit_Basics.framework/FBSDKCoreKit_Basics), but incompatible platform (have ‘iOS-sim’, need ‘iOS’))
還有設定 cocoapods 要下載的 framework 都在 Dependencies.xml 裡面,這邊因為我只要用到 Share 的功能所以就把其他都拿掉了
Unity 設定:再來是這版的 Facebook SDK 支援的 iOS 最低版本是 12 ,所以在 Unity 那邊的設定記得要把 Target minimum iOS Version 設定成 12
關於 FB 需要什麼參數設定都可以在 Unity 裡的 PostProcessBuild 裡面寫好,至於要設定什麼,Facebook 官方教學就有了,我就不多寫了,這裡只寫需要解決的困難的設定
#if UNITY_IOS
using UnityEditor;
using UnityEditor.Callbacks;
using System.IO;
using UnityEditor.iOS.Xcode.Extensions;
using UnityEditor.iOS.Xcode;
using System.Collections.Generic;
public static class PostProcess
{
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath)
{
if (buildTarget != BuildTarget.iOS) return;
string projectPath = PBXProject.GetPBXProjectPath(buildPath);
PBXProject project = new PBXProject();
project.ReadFromFile(projectPath);
string mainTargetGuid = project.GetUnityMainTargetGuid();
project.SetBuildProperty(mainTargetGuid, "ENABLE_BITCODE", "NO");
string frameworkTargetGuid = project.GetUnityFrameworkTargetGuid();
project.SetBuildProperty(frameworkTargetGuid, "ENABLE_BITCODE", "NO");
project.SetBuildProperty(frameworkTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "NO");
List<string> frameworks = new List<string> {
"FBAEMKit",
"FBSDKCoreKit",
"FBSDKCoreKit_Basics",
"FBSDKShareKit"
};
foreach (string framework in frameworks)
{
string frameworkName = framework + ".xcframework";
var src = Path.Combine("Pods", framework, "XCFrameworks", frameworkName);
var frameworkPath = project.AddFile(src, src);
project.AddFileToEmbedFrameworks(mainTargetGuid, frameworkPath);
}
project.WriteToFile(projectPath);
}
}
#endif
- ENABLE_BITCODE 如果沒關掉的話就會在編譯階段出現這個錯誤
'.../FBAEMKit.framework/FBAEMKit' 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 '.../FBAEMKit.framework/FBAEMKit' for architecture arm64
- AddfileToEmbedFrameworks 沒把這些 framework 加到 mainTarget 的話就會在遊戲開始的時候 Crash,然後看到下面的訊息:
Error loading .../xxx.app/Frameworks/UnityFramework.framework/UnityFramework (138): dlopen(.../xxx.app/Frameworks/UnityFramework.framework/UnityFramework, 0x0109): Library not loaded: @rpath/FBAEMKit.framework/FBAEMKit
Referenced from: .../xxx.app/Frameworks/UnityFramework.framework/UnityFramework
Reason: tried: '.../FBAEMKit.framework/FBAEMKit' (errno=2, not in dyld cache),
這些 framework 是我在 Dependencies.xml 只設定 FBSDKShareKit 他自己下載的
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES 關掉,沒關掉的話 upload 的階段會看到下面這個錯誤
Distribution failed with errors:
The following issues occurred while distributing your application.
Asset validation failed
Invalid Bundle. The bundle at 'xxx.app/Frameworks/UnityFramework.framework'
contains disallowed file 'Frameworks'.
以上就是我遇到的困難跟解法