이미지와 함께 Twitter에 게시하고 싶은 Titanium에서.

15297 단어 Titanium


새해 복 많이 받으세요.
올해도 잘 부탁드립니다.
노래와 춤을 좋아하는 여러분의 게시물을 기대하고 있습니다.

하고 싶은 일


  • 앱에서 Twitter에 게시하고 싶습니다.
  • 게시할 때 이미지를 첨부하고 싶습니다.
  • 물론 iOS/Android 양대응.

  • 흥미로운 것


  • 이미지는 앱에 포함되어 있지 않으며 웹에 존재합니다.
  • Twitter 투고에 한정하고 싶기 때문에, 가능하면 Share Extensions 이나 인텐트 튜자 는 표시하고 싶지 않다.
  • Android의 경우 명시적 인텐트를 사용하여 Twitter 공식 앱을 시작합니다. Twitter 공식 앱이 설치되어 있지 않은 경우, GooglePlay의 해당 페이지를 표시한다.

  • iOS의 경우



    hntn씨의 기사 에서도 소개되고 있습니다만, TiSocial 모듈을 이용합니다.
    이번에는 Share Extensions를 표시하지 않으므로 socialshare 모듈을 사용하지 않습니다.
    var social = require('dk.napp.social');
    
    var image = 'https://www.pakutaso.com/shared/img/thumb/BO15103026151030265020_TP_V.jpg',
        url = 'http://qiita.com/',
        text = 'TweetText';
    
    if (!social.isTwitterSupported()) {
        Ti.API.warn('Twitter account is not set.');
        return;
    }
    social.twitter({
        text: text,
        image: image,
        url: url
    });
    

    이것만.

    매우 간단.

    Android의 경우



    먼저 인텐트를 만들고 활동을 시작해 봅니다.
    var image = 'https://www.pakutaso.com/shared/img/thumb/BO15103026151030265020_TP_V.jpg',
        url = 'http://qiita.com/',
        text = 'TweetText';
    
    var intent = Ti.Android.createIntent({
        action: Ti.Android.ACTION_SEND,
        packageName: 'com.twitter.android',
        flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK,
        type: 'text/plain'
    });
    
    intent.putExtra(Ti.Android.EXTRA_TEXT, text + ' ' + url);
    intent.putExtraUri(Ti.Android.EXTRA_STREAM, image);
    
    try {
        Ti.Android.currentActivity.startActivity(intent);
    } catch(e) {
        // GooglePlay
        Ti.Platform.openURL('https://play.google.com/store/apps/details?id=com.twitter.android');
    }
    



    문제가 발생한 것 같습니다.
    01-06 09:56:34.037: E/AndroidRuntime(17424): FATAL EXCEPTION: main
    01-06 09:56:34.037: E/AndroidRuntime(17424): Process: com.twitter.android, PID: 17424
    01-06 09:56:34.037: E/AndroidRuntime(17424): java.lang.IllegalStateException: Media does not exist
    ・・・
    

    めめぃ あだず의 쫓아 버리면 이미지를 찾을 수 없습니까?

    여러가지 구그라고 보았습니다만, 아무래도 Web상의 화상을 트윗시에 지정할 수 없는 것일지도 모릅니다. 어쩔 수 없으므로 일단 이미지 파일을 다운로드하여 지정하기로했습니다.

    여기서의 주의점으로서, 이미지 파일을 Titanium.Filesystem.applicationDataDirectory 등에 저장하면 다른 앱으로부터 참조 불가가 되기 때문에, 이번은 임시 디렉토리( Ti.Filesystem.tempDirectory )에 저장하고 있습니다.
    참고 : h tps : ///s p 헛후 아테 r. 코 m / b ぉ g / 치타 니 m 오 펜 pd f ぃ th 돈 텐 ts- 레소 l ゔ ぇ d 앤 d 로이 d /
    var image = 'https://www.pakutaso.com/shared/img/thumb/BO15103026151030265020_TP_V.jpg',
        url = 'http://qiita.com/',
        text = 'TweetText';
    
    var start = function(tmpImage) {
        var intent = Ti.Android.createIntent({
            action: Ti.Android.ACTION_SEND,
            packageName: 'com.twitter.android',
            flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK,
            type: 'text/plain'
        });
    
        intent.putExtra(Ti.Android.EXTRA_TEXT, text + ' ' + url);
        intent.putExtraUri(Ti.Android.EXTRA_STREAM, tmpImage.getNativePath());
    
        try {
            Ti.Android.currentActivity.startActivity(intent);
        } catch(e) {
            // GooglePlay
            Ti.Platform.openURL('https://play.google.com/store/apps/details?id=com.twitter.android');
        }
    };
    
    var client = Titanium.Network.createHTTPClient();
    client.setTimeout(10000);
    client.onload = function(){
        if (client.status == 200 ) {
            var name = image.match('.+/(.+?)([\?#;].*)?$')[1],
                tmpImage = Ti.Filesystem.getFile(Ti.Filesystem.tempDirectory, name);
    
            tmpImage.write(this.responseData);
            start(tmpImage);
        } else {
            Ti.API.info('error: image not found');
        }
    };
    client.open('GET',image);
    client.send();  
    



    어떻게 됐어요.
    큰 일인데요, 여기까지 상당히 빠져 버렸습니다.

    그 결과 iOS, Android에서 같은 내용의 게시물이 생겼습니다.



    문제점


  • iOS9 의 Twitter 투고 다이얼로그로 위치 정보를 등록하려고 하면, 투고 화면이 갑자기 사라진다. (모 히파리 헌팅 계 게임에서 시작한 유사한 대화 상자도 위치 정보를 지정하면 갑자기 사라졌으므로 OS가 나쁘다. 분명).

    Gist

  • 좋은 웹페이지 즐겨찾기