テクノモンキーのアプリ開発日記

テクノモンキーの開発ブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsやアプリ開発に役立つ情報を発信します。

【Unity】 Social ConnectorがiPadで動作しない場合の対処法

https://unity3d.com/files/images/ogimg.jpg?1


最近作ったUnityアプリでSocialConnector(TwitterやLineなどのSNS共有用プラグイン )を使用しているのですが、
iPhone(iOS13.3)では正常に動作するものの、iPad(iPadOS13.3)では共有アクティビティ(UIActivityViewController)が開かない現象が発生しました。

github.com


今回はSocialConnectorがiPadで動作しない場合の対処法に関するメモです。


【Unity】 Social ConnectorがiPadで動作しない場合の対処法


https://camo.githubusercontent.com/c4465c1e42e52682a83674c26d06bea3eeae0022/68747470733a2f2f692e6779617a6f2e636f6d2f30396262336465333933666164336462626337313531363339333137663936302e706e67


SocialConnector.mm(元のソース)

    void SocialConnector_Share(const char *text, const char *url, const char *textureURL) {
    
        NSString *_text = [NSString stringWithUTF8String:text ? text : ""];
        NSString *_url = [NSString stringWithUTF8String:url ? url : ""];
        NSString *_textureURL = [NSString stringWithUTF8String:textureURL ? textureURL : ""];
    
        UIImage *image = nil;
    
        if ([_textureURL length] != 0) {
            image = [UIImage imageWithContentsOfFile:_textureURL];
        }
    
        NSArray *actItems = [NSArray arrayWithObjects:_text, _url, image, nil];
    
        UIActivityViewController *activityView = [[[UIActivityViewController alloc] initWithActivityItems:actItems applicationActivities: nil] autorelease];
    
        if(floorf(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)
            activityView.popoverPresentationController.sourceView = UnityGetGLViewController().view;
    
        [UnityGetGLViewController() presentViewController:activityView animated:YES completion:nil];
    }

Social Connectorのソースをみると、iOSではUIActivityViewControllerを開いているっぽいです。

qiita.com


上記の記事によると、iPadでUIActivityViewControllerを開く場合はsourceViewとsourceRectを指定する必要があるようなので、SocialConnector.mmを以下のように変更しました。


SocialConnector.mm(変更後)

    void SocialConnector_Share(const char *text, const char *url, const char *textureURL) {
    
        NSString *_text = [NSString stringWithUTF8String:text ? text : ""];
        NSString *_url = [NSString stringWithUTF8String:url ? url : ""];
        NSString *_textureURL = [NSString stringWithUTF8String:textureURL ? textureURL : ""];
    
        UIImage *image = nil;
    
        if ([_textureURL length] != 0) {
            image = [UIImage imageWithContentsOfFile:_textureURL];
        }
    
        NSArray *actItems = [NSArray arrayWithObjects:_text, _url, image, nil];
    
        UIActivityViewController *activityView = [[[UIActivityViewController alloc] initWithActivityItems:actItems applicationActivities: nil] autorelease];
    
        if(floorf(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1){
            activityView.popoverPresentationController.sourceView = UnityGetGLViewController().view;
            if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
            	activityView.popoverPresentationController.sourceRect = CGRectMake(UnityGetGLViewController().view.bounds.size.width / 2.0, UnityGetGLViewController().view.bounds.size.height / 2.0, 1.0, 1.0);
            }
        }
    
        [UnityGetGLViewController() presentViewController:activityView animated:YES completion:nil];
    }

内容的には、iPadの場合に限り、sourceRectを指定する感じです。(sourceViewは既に指定しているので)
これでiPadでもSocial Connectorが動作するようになりました。
もし同様の問題が発生する方は試してみてください。