Building Plugins for iOS
(進去下載 Bonjour Browser Sample 來修改 )
然後再參考這篇
Unity- 实现 Building Plugins for iOS(含Demo)另外要知道 objective-c 取得IDFA的語法 :
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
1. 你要先確定你的程式在xcode底下是可以正確build不會出錯的
2. 把xcode寫好的程式碼移到 unity專案底下的 Assets -> Plugins ->iOS 底下(放在別地方沒有用)
3. 因為要取得IDFA需要 AdSupport.framework 所以在BonjourClientImpl.h
記得加入 #import <AdSupport/AdSupport.h>
所以整個BonjourClientImpl.h是長這樣
-----------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <AdSupport/AdSupport.h>
@interface NetServiceBrowserDelegate : NSObject
{
// Keeps track of available services
NSMutableArray *services;
// Keeps track of search status
NSString* status;
BOOL searching;
}
// NSNetServiceBrowser delegate methods for service browsing
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser;
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didNotSearch:(NSDictionary *)errorDict;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didFindService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didRemoveService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing;
// Other methods
- (int)getCount;
- (NSString*) getIDFA;
- (NSNetService *)getService:(int)serviceNo;
- (NSString *)getStatus;
@end
-------------------------------------------------------------------------------------------
然後 BonjourClientImpl.mm 是改成這樣:
-------------------------------------------------------------------------------------------
#import "BonjourClientImpl.h"
@implementation NetServiceBrowserDelegate
- (id)init
{
self = [super init];
services = [[NSMutableArray alloc] init];
searching = NO;
status = @"Initializing";
return self;
}
- (void)dealloc
{
[services release];
[super dealloc];
}
// Sent when browsing begins
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser
{
searching = YES;
status = @"Searching";
[services removeAllObjects];
}
// Sent when browsing stops
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser
{
searching = NO;
status = @"Done";
}
// Sent if browsing fails
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didNotSearch:(NSDictionary *)errorDict
{
searching = NO;
NSString * msg = @"Failed.";
status = [msg stringByAppendingString:[[errorDict objectForKey:NSNetServicesErrorCode] stringValue]];
}
// Sent when a service appears
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didFindService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing
{
[services addObject:aNetService];
}
// Sent when a service disappears
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didRemoveService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing
{
[services removeObject:aNetService];
}
- (int)getCount
{
return [services count];
}
- (NSString*) getIDFA
{
return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
- (NSNetService *)getService:(int)serviceNo
{
return [services objectAtIndex:serviceNo];
}
- (NSString *)getStatus
{
return status;
}
@end
static NetServiceBrowserDelegate* delegateObject = nil;
static NSNetServiceBrowser *serviceBrowser = nil;
// Converts C style string to NSString
NSString* CreateNSString (const char* string)
{
if (string)
return [NSString stringWithUTF8String: string];
else
return [NSString stringWithUTF8String: ""];
}
// Helper method to create C string copy
char* MakeStringCopy (const char* string)
{
if (string == NULL)
return NULL;
char* res = (char*)malloc(strlen(string) + 1);
strcpy(res, string);
return res;
}
// When native code plugin is implemented in .mm / .cpp file, then functions
// should be surrounded with extern "C" block to conform C function naming rules
extern "C" {
void _StartLookup (const char* service, const char* domain)
{
if (delegateObject == nil)
delegateObject = [[NetServiceBrowserDelegate alloc] init];
if (serviceBrowser == nil)
serviceBrowser = [[NSNetServiceBrowser alloc] init];
[serviceBrowser setDelegate:delegateObject];
// Call "searchForServicesOfType" and pass NSStrings as parameters. By default mono
// marshals all .Net strings as UTF-8 C style strings.
[serviceBrowser searchForServicesOfType: CreateNSString(service) inDomain: CreateNSString(domain)];
}
const char* _GetLookupStatus ()
{
// By default mono string marshaler creates .Net string for returned UTF-8 C string
// and calls free for returned value, thus returned strings should be allocated on heap
return MakeStringCopy([[delegateObject getStatus] UTF8String]);
}
int _GetServiceCount ()
{
return [delegateObject getCount];
}
const char* _GetIDFA()
{
return MakeStringCopy([[delegateObject getIDFA] UTF8String]);
}
const char* _GetServiceName (int serviceNumber)
{
// By default mono string marshaler creates .Net string for returned UTF-8 C string
// and calls free for returned value, thus returned strings should be allocated on heap
return MakeStringCopy([[[delegateObject getService:serviceNumber] name] UTF8String]);
}
void _Stop()
{
[serviceBrowser stop];
}
}
-------------------------------------------------------------------------------------------
因為是obj-c++ 所以為了要讓unity script 可以呼叫到,
被unity呼叫的function必須包在 extern "C" { } 裡面才呼叫的到
然後用_GetIDFA() 去呼叫 obj-c 的方法 getIDFA
這樣xcode要寫的部分就完成了
再來講一下Plugins底下的Bonjour.cs 這隻程式
官方是建議寫一隻獨立的class來跟native ios做溝通
所以才會有這隻Bonjour.cs
一樣我在這隻程式底下加了這行
[DllImport ("__Internal")]
private static extern string _GetIDFA ();
然後再加了個方法
public static string GetIDFA(){
return _GetIDFA ();
}
最後就是主程式 BonjourTest.js
我在function OnGUI () 的最後加入了這行
//jojospeed666
print("IDFA = "+Bonjour.GetIDFA());
//Display IDFA
GUI.Label(new Rect(centerx - 50, 175, 100, 25), "IDFA = "+Bonjour.GetIDFA(), labelStyle);
這樣一來程式部分都改寫完畢
然後去unity build專案
沒出錯的話它會要求你新建一個Xcode專案
把它存在你想存的地方,等build好後去把那專案開啟
這邊要記得做一件很重要的事
就是要去xcode那邊把 AdSupport.framework 這個import進來
而且每次unity build完 打開xcode都要重做一次
不然run xcode會報錯
不知道unity有沒有地方可以設定build好就自動讓xcode import好會用到的
framework呢? 有同學知道的話麻煩告知一下
不然就只能用我這蠢方法
每次unity build好 進xcode後又要在import一次
沒問題後就run看看吧
手機自動開啟unity app後,點下qurey 看看下方是否有出現IDFA,
如果有的話就表示成功取得IDFA囉^^
sample下載位置
沒有留言:
張貼留言